Повторное использование веса из другой нейронной сети с использованием Pytorch - PullRequest
0 голосов
/ 15 апреля 2020

Я только что построил и обучил нейронную сеть, используя Pytorch. Нейронная сеть состоит из входного изображения, которое линейно масштабируется до скрытого слоя с N скрытыми единицами. Результаты скрытого слоя затем снова линейно масштабируются до выходного слоя. И в скрытом, и в выходном слое я использую функцию активации ReLu. Однако теперь я хочу создать вторую сеть, которая имеет форму, аналогичную предыдущей, но на этот раз скрытый слой должен состоять из N + 1 скрытых единиц. Кроме того, я хотел бы повторно использовать веса, найденные в предыдущей сети, и инициализировать дополнительный необходимый вес, используя нормальное распределение. net у меня до сих пор выглядит так.

Обратите внимание, идея состоит в том, чтобы распространить это на большую сеть, для первой инициализации я хочу использовать ксавье-числа. Я надеюсь, что кто-то может дать общий совет. Обратите внимание, n - это пороговое значение, установленное при инициализации сети. Веса 1, Веса 2 в идеале - это веса из предыдущей сети.

class Neural_Network(nn.Module):
    def __init__(self, inpsize, outsize, hidsize, N, n, Weights1,Weights2):
        super(Neural_Network, self).__init__()
        self.inputSize = inpsize
        self.outputSize = outsize
        self.hiddenSize = hidsize

        if N == 0:     
            self.W1 = nn.Linear(self.inputSize,self.hiddenSize, bias=False)
            self.W2 = nn.Linear(self.hiddenSize,self.inputSize, bias=False)

            torch.nn.init.xavier_uniform_(self.W1.weight, gain=1.0)
            torch.nn.init.xavier_uniform_(self.W2.weight, gain=1.0)
        else:
            self.W1 = nn.Linear(self.inputSize,self.hiddenSize, bias=False)
            self.W2 = nn.Linear(self.hiddenSize,self.inputSize, bias=False)

    def forward(self, X):
        x = F.relu(self.W1(X))
        x = F.relu(self.W2(x))
        return x, self.W1.weight, self.W2.weight
...