首页 > 解决方案 > Pytorch 中 Tanh 的初始化参数数量错误

问题描述

对于家庭作业,我正在使用 Pytorch 在 Python 中实现一个简单的神经网络。这是我的网络课程:

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 () 在给定 3 时采用 1 个位置参数。

<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

当我切换激活功能时也出现了这个错误。我不确定问题是什么,因为据我所知,当您创建一个图层时,您需要提供输入和输出尺寸,这就是我所拥有的。任何帮助解决这个问题将不胜感激。

标签: pythonpytorch

解决方案


The error clearly says, Tanh only takes 1 argument, a tensor.

From documentation, 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


You have so many mistakes it's hard to fix them all, you also didn't give a data sample.

Activation functions accept a single tensor, you are passing two random list elements. Usually, you can use torch.cat to concatenate two tensors. I would suggest you start with a simpler model and read the documentation first.


推荐阅读