Я только что построил и обучил нейронную сеть, используя 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