Для домашнего задания я реализую простую нейронную сеть в Python с использованием Pytorch. Вот мой класс сети:
class Net(torch.nn.Module):
def __init__(self, layer_dims, activation="sigmoid"):
super(Net, self).__init__()
layers = []
if activation == 'sigmoid':
for i in range(1, len(layer_dims) - 1):
layers.append(nn.Sigmoid(layer_dims[i - 1], layer_dims[i]))
layers.append(nn.Sigmoid(layer_dims[i - 1]))
layers.append(nn.Sigmoid(layer_dims[-2], layer_dims[-1]))
layers.append(nn.Sigmoid())
elif activation == 'relu':
for i in range(1, len(layer_dims) - 1):
layers.append(nn.ReLu(layer_dims[i - 1], layer_dims[i]))
layers.append(nn.ReLU(layer_dims[i - 1]))
layers.append(nn.ReLu(layer_dims[-2], layer_dims[-1]))
layers.append(nn.ReLu())
elif activation == 'tanh':
for i in range(1, len(layer_dims) - 1):
layers.append(nn.Tanh(layer_dims[i - 1], layer_dims[i]))
layers.append(nn.Tanh(layer_dims[i - 1]))
layers.append(nn.Tanh(layer_dims[-2], layer_dims[-1]))
layers.append(nn.Tanh())
elif activation == 'identity':
for i in range(1, len(layer_dims) - 1):
layers.append(nn.Identity(layer_dims[i - 1], layer_dims[i]))
layers.append(nn.Identity(layer_dims[i - 1]))
layers.append(nn.Identity(layer_dims[-2], layer_dims[-1]))
layers.append(nn.Identity())
self.out = nn.Sequential(*layers)
def forward(self, input):
return self.out(input)
def train(data, labels, n, l, activation='sigmoid'):
if activation not in ['sigmoid','identity','tanh','relu']:
return
net = Net([l for i in range(0,n)], activation)
optim = torch.optim.Adam(net.parameters())
for i in range(0,5):
ypred = net.forward(torch.Tensor(data))
ypred.backward()
optim.step()
optim.zero_grad()
ypred = net.forward(torch.Tensor(data))
return (net, torch.nn.CrossEntropyLoss(ypred, labels), net.parameters(), ypred)
При тестировании я пытался запустить следующий сегмент кода:
for i in range(3,5):
for num in [10,30,50]:
print(train(data.get('X_trn'), data.get('y_trn'), i, num, activation='tanh'))
, который выдает ошибку с помощью TypeError, говоря, что init () принимает 1 позиционный аргумент, когда дается 3.
<ipython-input-30-376b6c739a71> in __init__(self, layer_dims, activation)
18 elif activation == 'tanh':
19 for i in range(1, len(layer_dims) - 1):
---> 20 layers.append(nn.Tanh(layer_dims[i - 1], layer_dims[i]))
21 layers.append(nn.Tanh(layer_dims[i - 1]))
22 layers.append(nn.Tanh(layer_dims[-2], layer_dims[-1]))
TypeError: __init__() takes 1 positional argument but 3 were given
Эта ошибка появилась, когда я также переключаю функцию активации. Я не уверен, в чем проблема, потому что, насколько я знаю, когда вы создаете слой, вам нужно дать входные и выходные размеры, что у меня есть. Буду признателен за любую помощь в решении этого вопроса.