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

如何设置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

  1. 第一次卷积+池化:
    • 卷积层conv1参数:kernel=3, stride=1, padding=1,卷积后尺寸保持300×300
    • 经过MaxPool2d(kernel=2),尺寸变为300/2 = 150×150
  2. 第二次卷积+池化:
    • 卷积层conv2参数同conv1,卷积后尺寸保持150×150
    • 经过MaxPool2d(kernel=2),尺寸变为150/2 = 75×75
  3. 最终特征图维度: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:40:24