CNN适配彩色图像时conv2d维度不匹配问题咨询
问题描述
- 灰度图像输入时程序运行正常:批量大小64,输入4张80×64的截图,张量形状为
torch.Size([64, 4, 80, 64]) - 改为彩色图像后,输入张量形状变为
[64, 4, 80, 64, 3],触发报错:
RuntimeError: Expected 3D (unbatched) or 4D (batched) input to conv2d, but got input of size: [64, 4, 80, 64, 3]
- 当前CNN结构:
self.representation = nn.Sequential( nn.Conv2d(in_channels=4, out_channels=32, kernel_size=8, stride=4), nn.BatchNorm2d(32), nn.Conv2d(in_channels=32, out_channels=24, kernel_size=4, stride=2), nn.Conv2d(in_channels=24, out_channels=24, kernel_size=4, stride=2), nn.BatchNorm2d(24), nn.Conv2d(in_channels=24, out_channels=8, kernel_size=2, stride=1), nn.BatchNorm2d(8), )
- 不认可拆分RGB通道的方案(障碍物为红色、角色为绿色,拆分会丢失关联信息),需其他可行解决办法
可行解决办法
核心思路:合并时间帧与颜色通道,适配Conv2D输入要求
Conv2D批量输入格式为[batch_size, in_channels, height, width],当前彩色输入多了一维颜色通道,需调整维度并修改CNN输入通道数:
- 调整输入张量维度
将输入的时间帧维度(4)与颜色通道维度(3)合并,把形状从[64, 4, 80, 64, 3]转换为[64, 4*3, 80, 64],保留所有帧的颜色信息关联。
用PyTorch代码实现:
# 假设输入张量为x x = x.permute(0, 1, 4, 2, 3) # 调整维度顺序为[batch, frames, channels, h, w] x = x.flatten(1, 2) # 合并frames和channels维度,得到[batch, 12, h, w]
- 修改CNN的输入通道数
将CNN第一层Conv2d的in_channels从4改为12(4帧×3通道),后续层参数无需改动:
self.representation = nn.Sequential( nn.Conv2d(in_channels=12, out_channels=32, kernel_size=8, stride=4), nn.BatchNorm2d(32), nn.Conv2d(in_channels=32, out_channels=24, kernel_size=4, stride=2), nn.Conv2d(in_channels=24, out_channels=24, kernel_size=4, stride=2), nn.BatchNorm2d(24), nn.Conv2d(in_channels=24, out_channels=8, kernel_size=2, stride=1), nn.BatchNorm2d(8), )
补充说明
这种方式把每帧的RGB通道和多帧信息整合为一个大的通道维度,Conv2D会同时学习帧间时序信息和颜色通道间的关联,完全保留了颜色与帧的耦合信息,避免拆分通道导致的信息丢失。
内容的提问来源于stack exchange,提问作者tgmjack
相关产品推荐
相关产品推荐

