如何设置PyTorch手势识别模型的输入通道与全连接层输入尺寸?
PyTorch手势识别模型:输入通道与全连接层尺寸修正
问题根源
报错RuntimeError: Given groups=1, weight of size [8, 1, 3, 3], expected input[1, 32, 78, 78] to have 1 channels, but got 32 channels instead的核心原因:
- 输入数据X是3通道RGB图像(尺寸
(2080, 300, 300, 3)),但模型第一个卷积层conv1的in_channels设为1,与输入通道数不匹配。 - 原模型全连接层
fc1的输入特征数19.5 * 19.5 * 24为非整数,且计算逻辑错误,不符合图像经过卷积池化后的实际尺寸。
1. 输入通道尺寸修正
修改卷积层输入通道
将conv1的in_channels改为3,匹配RGB图像的3通道格式:
self.conv1 = nn.Conv2d(in_channels = 3, out_channels = 12, kernel_size = 3, stride = 1, padding = 1)
修正输入数据维度格式
PyTorch要求输入张量格式为[样本数, 通道数, 高, 宽],原始数据是[样本数, 高, 宽, 通道数],需做维度转置:
# 生成train_data后,转成numpy数组并调整维度 train_data = np.array(train_data) train_data = train_data.transpose(0, 3, 1, 2) # 从(N, H, W, C)转为(N, C, H, W) # 再转换为PyTorch张量 train_data = torch.tensor(train_data, dtype=torch.float32)
2. 全连接层fc1输入特征尺寸计算与修正
逐步计算特征图尺寸
原始图像尺寸:300×300
- 第一次卷积+池化:
- 卷积层
conv1参数:kernel=3, stride=1, padding=1,卷积后尺寸保持300×300 - 经过
MaxPool2d(kernel=2),尺寸变为300/2 = 150×150
- 卷积层
- 第二次卷积+池化:
- 卷积层
conv2参数同conv1,卷积后尺寸保持150×150 - 经过
MaxPool2d(kernel=2),尺寸变为150/2 = 75×75
- 卷积层
- 最终特征图维度:
24(通道数) ×75×75
修改全连接层参数
将fc1的in_features改为24 * 75 * 75 = 135000,同时修正forward方法中的view尺寸:
class Net(nn.Module): def __init__(self, num_classes = 5): super(Net, self).__init__() self.conv1 = nn.Conv2d(in_channels = 3, out_channels = 12, kernel_size = 3, stride = 1, padding = 1) self.conv2 = nn.Conv2d(in_channels = 12, out_channels = 24, kernel_size = 3, stride = 1, padding = 1) self.pool = nn.MaxPool2d(kernel_size = 2) self.drop = nn.Dropout2d(p = 0.2) # 修正全连接层输入特征数 self.fc1 = nn.Linear(in_features = 24 * 75 * 75, out_features = 120) self.fc2 = nn.Linear(in_features = 120, out_features = num_classes) def forward(self, x): x = F.relu(self.pool(self.conv1(x))) x = F.relu(self.pool(self.conv2(x))) x = F.dropout(self.drop(x), training = self.training) # 对应调整flatten尺寸 x = x.view(-1, 24 * 75 * 75) x = F.relu(self.fc1(x)) output = self.fc2(x) return output # 补充return语句,原代码缺失
内容的提问来源于stack exchange,提问作者Chiam Yuwei
相关产品推荐
相关产品推荐

