Неверное количество аргументов инициации для Tanh в Pytorch - PullRequest
0 голосов
/ 13 апреля 2020

Для домашнего задания я реализую простую нейронную сеть в 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

Эта ошибка появилась, когда я также переключаю функцию активации. Я не уверен, в чем проблема, потому что, насколько я знаю, когда вы создаете слой, вам нужно дать входные и выходные размеры, что у меня есть. Буду признателен за любую помощь в решении этого вопроса.

1 Ответ

1 голос
/ 13 апреля 2020

Ошибка ясно говорит, что Танх принимает только 1 аргумент, тензор.

Из документации https://pytorch.org/docs/stable/nn.html

Tanh

class
torch.nn.Tanh
[source]

    Applies the element-wise function:
    Tanh(x)=tanh⁡(x)=ex−e−xex+e−x\text{Tanh}(x) = \tanh(x) = \frac{e^x - e^{-x}} {e^x + e^{-x}} Tanh(x)=tanh(x)=ex+e−xex−e−x​

    Shape:

            Input: (N,∗)(N, *)(N,∗) where * means, any number of additional dimensions

            Output: (N,∗)(N, *)(N,∗) , same shape as the input


У вас так много ошибок, что Трудно исправить их все, вы также не дали образец данных.

Функции активации принимают один тензор, вы передаете два элемента случайного списка. Обычно вы можете использовать torch.cat для объединения двух тензоров. Я бы посоветовал вам начать с более простой модели и сначала прочитать документацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...