Pytorch RuntimeError:四维权重[256,1,3,3]应为四维输入,但得到的是大小为[64,1786]的三维输入

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

我正在尝试将CausalConv1d与Conv2d结合起来作为VAE的编码器。但我得到了编码器部分产生的错误。CausalConv1d是由nn.Conv1d网络实现的,因此它应该只有三维权重,但为什么错误显示为预期的四维权重?我还有另一个问题,为什么在Convs层中设置“kernel_size”、“stride”等参数时,我不能在Pycharm中使用单个int,而只能使用tuple?尽管官方文件说int和tuple都是有效的。以下是回溯:

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