CNN训练时如何确定特定特征图对应的输入图像
核心结论先行
你提到的特征图能否对应到输入图像,完全取决于你输入张量的维度排布,以及你用的卷积实现方式,分两种常见情况说明:
情况1:你将3张灰度图作为batch维度的3个独立样本输入
也就是你现有代码里写的foo = torch.randn(3,1,28,28),这个张量的维度含义是(样本数, 通道数, 高度, 宽度):一共3个样本,每个样本是单通道28*28的灰度图。
此时你需要把conv1的定义改成self.conv1 = nn.Conv2d(1, 6, 5)(你现有代码conv1输入通道设为3,和输入通道数1不匹配,运行会直接报错),第一次卷积后的输出shape为(3, 6, 24, 24),可以直接按第0维索引对应输入图像:
x[0]是第1张输入图像对应的全部6个特征图x[1]是第2张输入图像对应的全部6个特征图x[2]是第3张输入图像对应的全部6个特征图
这种情况不需要额外操作,直接索引就能拿到单张图对应的所有特征。
情况2:你将3张灰度图作为同一个样本的3个通道输入
也就是你一开始描述的合并后shape为(3,28,28),补齐batch维度后输入张量shape是(1, 3, 28, 28),匹配你现有conv1的输入通道数3的设置。
- 如果你用普通卷积:第一次卷积输出的6个特征图无法单独对应到某一张输入图像,因为普通卷积的每个输出特征图,都是3个输入通道对应位置和卷积核权重乘加后的结果,已经完全混合了3张图的信息,没有单独对应关系。
- 如果你要保留单张图的特征对应关系,可以改用分组卷积:把conv1的
groups参数设为3,定义为self.conv1 = nn.Conv2d(3, 6, 5, groups=3),此时卷积会被拆分为3组独立运算,每组负责1个输入通道,输出2个特征图,输出的6个特征图对应关系为:- 第0、1个特征图:对应第1张输入灰度图
- 第2、3个特征图:对应第2张输入灰度图
- 第4、5个特征图:对应第3张输入灰度图
这种实现下不会有跨输入图像的信息混合,可以直接按输出通道索引拿到对应输入图的特征。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

