PyTorch中用torch.nn.functional.conv2d替换nn.Conv2d报错求助
解决PyTorch函数式conv2d的维度不匹配问题
嘿,我来帮你搞定这个报错!你的问题核心是卷积权重的维度定义错了,另外还有个小细节是PyTorch里已经不用Variable啦。
错误原因分析
PyTorch的函数式API F.conv2d 对输入和权重的维度有严格要求:
- 输入张量的形状是
(batch_size, in_channels, height, width)(你的输入[50,1,...]就是批量50、单通道的MNIST图像,这部分没问题) - 权重张量的形状必须是
(out_channels, in_channels, kernel_height, kernel_width)
而你定义的self.w_conv1 = Variable(torch.randn(1, 32, 5))形状是(1,32,5),完全不符合要求——原nn.Conv2d(1, 32, 5, padding=2)对应的是:
- in_channels=1,out_channels=32,卷积核大小是5x5
所以正确的权重形状应该是(32, 1, 5, 5)。
另外,PyTorch 0.4版本之后Variable已经被整合进张量体系了,直接创建张量就行,如果需要让权重参与训练,记得加上requires_grad=True(默认创建的张量requires_grad是False,不会被优化器更新)。
修正后的代码示例
- 替换权重定义:
# 原错误代码:self.w_conv1 = Variable(torch.randn(1, 32, 5)) self.w_conv1 = torch.randn(32, 1, 5, 5, requires_grad=True) # 原nn.Conv2d默认带偏置,所以如果需要保留偏置,还要定义偏置张量 self.b_conv1 = torch.randn(32, requires_grad=True)
- 修正forward方法:
# 原错误代码:x = F.max_pool2d(F.relu(F.conv2d(x, self.w_conv1, padding=2)),2) # 加了偏置的话,要把bias参数传入conv2d x = F.max_pool2d(F.relu(F.conv2d(x, self.w_conv1, bias=self.b_conv1, padding=2)), 2)
额外提醒
- 如果你不需要偏置,可以在
F.conv2d里设置bias=None,和nn.Conv2d(..., bias=False)对应 - 训练时要确保把
self.w_conv1和self.b_conv1加入优化器的参数列表,比如optimizer = torch.optim.SGD([self.w_conv1, self.b_conv1], lr=0.01)
内容的提问来源于stack exchange,提问作者Mihkel L.
相关产品推荐
相关产品推荐

