python - 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
当我切换激活功能时也出现了这个错误。我不确定问题是什么,因为据我所知,当您创建一个图层时,您需要提供输入和输出尺寸,这就是我所拥有的。任何帮助解决这个问题将不胜感激。
解决方案
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.
推荐阅读
- javascript - Highcharts - 如何从 java 地图中设置 x 轴和 y 轴的数据
- python-3.x - 无法从 Fargate 容器中访问 S3 存储桶(错误请求并且无法找到凭据)
- haskell - How should I structure constrained parameters in Haskell?
- regex - Vim 如何使用正则表达式删除一些单词
- python - python matplotlib中指定间隔的绘图函数
- javascript - 处理具有许多变量的操作的更好方法?
- php - 选择性地将 PHP 输出记录到日志文件,而不是将其打印到浏览器
- visual-studio-2017 - VS2017 安装失败;无法通过安装程序或 Microsoft 开发社区报告
- amazon-s3 - 在 Terraform 中将多个 AWS 账户作为环境处理的最佳方式是什么?
- sql-server - NodeJs Connection Error querying SQL Server