ResNet152特征提取层参数差异及图像字幕模型in_features选型问题
两个in_features参数的核心区别
- 官方ResNet152内置全连接层的
in_features=2048:是模型结构本身决定的固定值。ResNet152最后一层卷积输出的特征通道数为2048,经过全局平均池化后会被压缩为维度是[batch_size, 2048]的全局特征向量,因此对应的全连接层输入维度必须是2048,是不可随意修改的原生参数。 - 你自定义classifier的
in_features=512:是你手动设置的数值,和ResNet152的实际特征输出维度不匹配,当前代码实际运行时会触发张量维度不匹配的报错,属于错误的参数设置。
图像字幕模型的参数选择
你当前的代码还存在一个逻辑问题:forward方法直接返回self.resnet152(x)的结果,这个结果是官方预训练ResNet152最后全连接层输出的1000维ImageNet分类结果,并不是你需要的图像特征,你需要先移除官方自带的全连接层才能拿到特征输出,修改参考:
# 去掉ResNet152的最后一层全连接层,仅保留特征提取部分 self.resnet152 = nn.Sequential(*list(self.resnet152.children())[:-1])
特征维度选择可以根据你的实现方案二选一:
- 若使用全局图像特征输入解码器:直接用2048维的原始输出作为全连接层的输入,把自定义classifier的
in_features改成2048,out_features设置为你需要的特征维度(比如你之前想要的512维),映射后再送给后续的文本生成模块即可。 - 若使用带注意力的局部特征(当前图像字幕任务的主流方案,效果更好):可以移除ResNet152的全局平均池化层和全连接层,直接取最后一层卷积的输出,维度为
[batch_size, 2048, 7, 7],拉平空间维度后得到49个2048维的局部特征,直接送给注意力模块使用。
内容的提问来源于stack exchange,提问作者Rafi
相关产品推荐
相关产品推荐

