Conv1d 的以下实现有什么问题?
what is wrong with the following implementation of Conv1d?
我正在尝试使用批量归一化实现 Conv1d
层,但我不断收到以下错误:
RuntimeError Traceback (most recent call last)
<ipython-input-32-ef6e122ea50c> in <module>()
----> 1 test()
2 for epoch in range(1, n_epochs + 1):
3 train(epoch)
4 test()
7 frames
/usr/local/lib/python3.7/dist-packages/torch/nn/modules/conv.py in _conv_forward(self, input, weight, bias)
258 _single(0), self.dilation, self.groups)
259 return F.conv1d(input, weight, bias, self.stride,
--> 260 self.padding, self.dilation, self.groups)
261
262 def forward(self, input: Tensor) -> Tensor:
RuntimeError: Expected 3-dimensional input for 3-dimensional weight [25, 40, 5], but got 2-dimensional input of size [32, 40] instead
使用 DataLoader class 以 32 个为一组传递数据,它有 40 个特征和 10 个标签。这是我的模型:
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
#self.flatten=nn.Flatten()
self.net_stack=nn.Sequential(
nn.Conv1d(in_channels=40, out_channels=25, kernel_size=5, stride=2), #applying batch norm
nn.ReLU(),
nn.BatchNorm1d(25, affine=True),
nn.Conv1d(in_channels=25, out_channels=20, kernel_size=5, stride=2), #applying batch norm
nn.ReLU(),
nn.BatchNorm1d(20, affine=True),
nn.Linear(20, 10),
nn.Softmax(dim=1))
def forward(self,x):
#x=torch.reshape(x, (1,-1))
result=self.net_stack(x)
return result
我已经尝试在其他答案中给出,例如解压缩输入张量,但是 none 此类问题中的模型使用的是 Conv1d 和 batchnorm1d,因此我无法将问题缩小到必须是哪一层导致错误。我刚开始使用 Pytorch 并能够实现一个简单的线性 NN 模型,但是我在对相同数据使用卷积神经网络时遇到了这个错误。
您需要为输入添加批次维度(同时更改输入通道数)。
conv1d
层接受形状为 [B, C, L]
的输入,其中 B
是批量大小,C
是通道数,L
是你输入的width/length。此外,您的 conv1d
层需要 40 个输入通道:
nn.Conv1d(in_channels=40, out_channels=25, kernel_size=5, stride=2)
因此,您的输入张量 x
必须具有 [B, 40, L]
形状,而现在它具有 [32, 40]
.
形状
尝试:
def forward(self,x):
result=self.net_stack(x[None])
return result
您将收到另一个错误,抱怨尺寸不匹配,建议您需要将输入通道数更改为 40。
我正在尝试使用批量归一化实现 Conv1d
层,但我不断收到以下错误:
RuntimeError Traceback (most recent call last)
<ipython-input-32-ef6e122ea50c> in <module>()
----> 1 test()
2 for epoch in range(1, n_epochs + 1):
3 train(epoch)
4 test()
7 frames
/usr/local/lib/python3.7/dist-packages/torch/nn/modules/conv.py in _conv_forward(self, input, weight, bias)
258 _single(0), self.dilation, self.groups)
259 return F.conv1d(input, weight, bias, self.stride,
--> 260 self.padding, self.dilation, self.groups)
261
262 def forward(self, input: Tensor) -> Tensor:
RuntimeError: Expected 3-dimensional input for 3-dimensional weight [25, 40, 5], but got 2-dimensional input of size [32, 40] instead
使用 DataLoader class 以 32 个为一组传递数据,它有 40 个特征和 10 个标签。这是我的模型:
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
#self.flatten=nn.Flatten()
self.net_stack=nn.Sequential(
nn.Conv1d(in_channels=40, out_channels=25, kernel_size=5, stride=2), #applying batch norm
nn.ReLU(),
nn.BatchNorm1d(25, affine=True),
nn.Conv1d(in_channels=25, out_channels=20, kernel_size=5, stride=2), #applying batch norm
nn.ReLU(),
nn.BatchNorm1d(20, affine=True),
nn.Linear(20, 10),
nn.Softmax(dim=1))
def forward(self,x):
#x=torch.reshape(x, (1,-1))
result=self.net_stack(x)
return result
我已经尝试在其他答案中给出,例如解压缩输入张量,但是 none 此类问题中的模型使用的是 Conv1d 和 batchnorm1d,因此我无法将问题缩小到必须是哪一层导致错误。我刚开始使用 Pytorch 并能够实现一个简单的线性 NN 模型,但是我在对相同数据使用卷积神经网络时遇到了这个错误。
您需要为输入添加批次维度(同时更改输入通道数)。
conv1d
层接受形状为 [B, C, L]
的输入,其中 B
是批量大小,C
是通道数,L
是你输入的width/length。此外,您的 conv1d
层需要 40 个输入通道:
nn.Conv1d(in_channels=40, out_channels=25, kernel_size=5, stride=2)
因此,您的输入张量 x
必须具有 [B, 40, L]
形状,而现在它具有 [32, 40]
.
尝试:
def forward(self,x):
result=self.net_stack(x[None])
return result
您将收到另一个错误,抱怨尺寸不匹配,建议您需要将输入通道数更改为 40。