Pytorch RuntimeError:四维权重[256,1,3,3]应为四维输入,但得到的是大小为[64,1786]的三维输入
我正在尝试将CausalConv1d与Conv2d结合起来作为VAE的编码器。但我得到了编码器部分产生的错误。CausalConv1d是由nn.Conv1d网络实现的,因此它应该只有三维权重,但为什么错误显示为预期的四维权重?我还有另一个问题,为什么在Convs层中设置“kernel_size”、“stride”等参数时,我不能在Pycharm中使用单个int,而只能使用tuple?尽管官方文件说int和tuple都是有效的。以下是回溯:Pytorch RuntimeError:四维权重[256,1,3,3]应为四维输入,但得到的是大小为[64,1786]的三维输入,pytorch,Pytorch,我正在尝试将CausalConv1d与Conv2d结合起来作为VAE的编码器。但我得到了编码器部分产生的错误。CausalConv1d是由nn.Conv1d网络实现的,因此它应该只有三维权重,但为什么错误显示为预期的四维权重?我还有另一个问题,为什么在Convs层中设置“kernel_size”、“stride”等参数时,我不能在Pycharm中使用单个int,而只能使用tuple?尽管官方文件说int和tuple都是有效的。以下是回溯: Traceback (most recent call
Traceback (most recent call last):
File "training.py", line 94, in <module>
training(args)
File "training.py", line 21, in training
summary(model, torch.zeros(64, 1, 784), show_input=True, show_hierarchical=False)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\pytorch_model_summary\model_summary.py", line 118, in summary
model(*inputs)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "F:\VAE_reservoir_computing\VAE.py", line 34, in forward
mu, log_var = self.encoder.forward(image)
File "F:\VAE_reservoir_computing\CausalCnn_Reservoir.py", line 30, in forward
x = self.conv1d(x.view(x.shape[0], 1, 784))
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\container.py", line 119, in forward
input = module(input)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "F:\VAE_reservoir_computing\CausalConv1d.py", line 21, in forward
conv1d_out = self.conv1d(x)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\conv.py", line 263, in forward
return self._conv_forward(input, self.weight, self.bias)
File "C:\Anaconda\envs\vae_reservior_computing\lib\site-packages\torch\nn\modules\conv.py", line 260, in _conv_forward
self.padding, self.dilation, self.groups)
RuntimeError: Expected 4-dimensional input for 4-dimensional weight [256, 1, 3, 3], but got 3-dimensional input of size [64, 1, 786] instead
以下是CausalConv1d的实现:
import torch.nn as nn
import torch.nn.functional as F
class CausalConv1d(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, dilation, A=False, *args, **kwargs):
super(CausalConv1d, self).__init__()
self.kernel_size = kernel_size
self.dilation = dilation
self.A = A
self.padding = (kernel_size[0] - 1) * dilation + A * 1
self.conv1d = nn.Conv1d(in_channels,out_channels,self.kernel_size,stride=(1,1),padding=(0,0),dilation=dilation,**kwargs)
def forward(self, x):
x = F.pad(x, (self.padding, 0))
conv1d_out = self.conv1d(x)
if self.A:
return conv1d_out[:,:,: -1]
else:
return conv1d_out
所以任何人都可以给我一些建议吗?我知道这可能不是直观的,但是当你使用2维的
内核大小时(例如(3,3)
),那么你的Conv1d
有4维权重。因此,要解决您的问题,您必须从:
CausalConv1d(输入通道、输出通道、内核大小=(3,3)、膨胀=1、A=假),
致:
CausalConv1d(输入通道、输出通道、内核大小=3、膨胀=1、A=False),
请用完整的回溯更新问题。我已经更新了我的问题和回溯谢谢!但我有一个问题。当我尝试将(3,3)更改为3时,Pycharm给出了一个错误:预期类型Tuple[int..]改为get int。但是,当我使用Jupyter笔记本时,我可以使用一个int。所以我认为Pycharm可能有问题,你知道这里有什么问题吗?@XingkaiWang你也可以使用(3,)
。但您也应该能够使用标量值。这是Python错误还是只是IDE警告/错误?拜托,如果有帮助的话,请考虑投票或标记作为答案。是的,我认为这是IDE错误,所以我忽略它,我的代码工作。非常感谢。
import torch.nn as nn
import torch.nn.functional as F
class CausalConv1d(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, dilation, A=False, *args, **kwargs):
super(CausalConv1d, self).__init__()
self.kernel_size = kernel_size
self.dilation = dilation
self.A = A
self.padding = (kernel_size[0] - 1) * dilation + A * 1
self.conv1d = nn.Conv1d(in_channels,out_channels,self.kernel_size,stride=(1,1),padding=(0,0),dilation=dilation,**kwargs)
def forward(self, x):
x = F.pad(x, (self.padding, 0))
conv1d_out = self.conv1d(x)
if self.A:
return conv1d_out[:,:,: -1]
else:
return conv1d_out