You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,不会被优化器更新)。

修正后的代码示例

  1. 替换权重定义:
# 原错误代码: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)
  1. 修正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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:37:26