如何为4维权重提供4维输入?PyTorch CIFAR10卷积模型报错解决
问题修正与参数说明
错误原因
你代码的核心问题是forward函数的执行顺序错误:你在第一步就将4维的图像输入(格式为[batch_size, 通道数, 高度, 宽度])直接拉平为2维张量,而Conv2d卷积层要求输入必须是4维结构,因此触发维度不匹配报错。同时原代码中全连接层的输入维度计算也不符合CIFAR10数据集的输入尺寸推导结果。
修正后的模型代码
import torch.nn as nn import torch.nn.functional as F class Net2(nn.Module): def __init__(self): super(Net2, self).__init__() # 卷积层:满足32个滤波器、5x5卷积核、步长1的要求 self.conv1 = nn.Conv2d(3, 32, 5, 1) # 推导池化后的特征维度:CIFAR10输入3x32x32 → 卷积后32x28x28 → 池化后32x14x14 → 拉平后为32*14*14=6272 self.fc1 = nn.Linear(32 * 14 * 14, 512) self.fc2 = nn.Linear(512, 10) def forward(self, x): # 第一步:卷积 + ReLU激活 + 最大池化 x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) # 第二步:特征拉平为一维,送入全连接层 x = x.view(x.size(0), -1) x = F.relu(self.fc1(x)) x = self.fc2(x) return x net2 = Net2().to(device)
修正后的代码完全匹配作业要求的6项结构规则。
层参数含义解释
nn.Conv2d 卷积层参数
nn.Conv2d的核心调用格式为 nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0),各参数含义:
in_channels:输入特征图的通道数,CIFAR10是RGB三通道图像,所以填3out_channels:卷积核(滤波器)的数量,作业要求32个,所以填32kernel_size:卷积核的尺寸,填5代表使用5x5的卷积核stride:卷积核在特征图上滑动的步长,作业要求为1padding:输入特征图边缘填充的像素数,默认0即不填充
nn.Linear 全连接层参数
nn.Linear的核心调用格式为 nn.Linear(in_features, out_features),各参数含义:
in_features:输入张量的特征维度,第一个全连接层的输入是池化后拉平的特征,所以填321414;第二个全连接层输入是前一层的输出512out_features:输出张量的特征维度,第一个全连接层要求输出512,第二个要求输出10对应CIFAR10的10个分类
内容的提问来源于stack exchange,提问作者Gamar Choba
相关产品推荐
相关产品推荐

