修改Inception-v3输入通道数为4时触发RuntimeError,该如何解决?
问题原因分析
你的修改逻辑本身没有问题,报错根源是torchvision内置的InceptionV3默认开启了输入变换逻辑,该逻辑默认只处理前3个通道,会把你输入的4通道数据自动裁剪为3通道,导致和你修改后的第一层卷积的输入通道要求不匹配。
具体触发点
从你提供的报错栈可以看到,模型前向传播时首先执行了x = self._transform_input(x) 这一步,老版本torchvision中该方法的实现逻辑是硬编码处理RGB 3通道输入,直接取输入张量的前3个通道做归一化后返回,直接丢弃了第4通道,所以进入第一层卷积的输入实际已经变成了3通道,触发通道数不匹配报错。
解决方法
下面提供两种可行方案:
- 方案1:关闭内置输入变换(推荐,适合自己做数据归一化的场景)
初始化模型时额外指定transform_input=False,关闭默认的通道裁剪和归一化逻辑即可,同时可以选择性迁移预训练权重加快收敛:
import torch import torch.nn as nn from torchvision import models x=torch.randn((5,4,299,299)) # 初始化时关闭输入变换 model_ft=models.inception_v3(pretrained=True, transform_input=False) model_ft.Conv2d_1a_3x3.conv=nn.Conv2d(4, 32, kernel_size=(3, 3), stride=(2, 2), bias=False) # 可选:迁移预训练权重,加快收敛 # 取原3通道权重的平均赋值给第4通道 original_weight = models.inception_v3(pretrained=True).Conv2d_1a_3x3.conv.weight.data new_weight = torch.cat([original_weight, original_weight.mean(dim=1, keepdim=True)], dim=1) model_ft.Conv2d_1a_3x3.conv.weight.data = new_weight out=model_ft(x) print(out.shape)
注意:InceptionV3在训练模式(默认
model.train())下会返回(主输出, 辅助分类器输出)两个张量,推理模式(model.eval())下仅返回主输出张量,可根据使用场景调整接收方式。
- 方案2:修改
_transform_input方法适配4通道(适合需要保留内置归一化逻辑的场景)
如果需要沿用官方的归一化逻辑,可以重写该方法适配4通道,自行补充第4通道的归一化参数即可。
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

