ResNet50设置include_top=False输出(7,7,2048)是否正常及含义问询
问题解答
输出结果是否正确?
你得到的(24, 7, 7, 2048)输出是完全正确的,符合你代码的参数设置逻辑。
你在初始化ResNet50时设置了include_top=False,该参数的作用是剔除ResNet50末尾用于分类任务的全局池化层、全连接层,仅保留特征提取用的卷积层堆栈,最终输出的就是卷积层最后一个模块的计算结果。
(7, 7, 2048)的具体含义
这组维度对应卷积输出的空间特征图,各维度的意义如下:
- 224×224的输入图像经过ResNet50的5组卷积模块后,总共进行了32倍的下采样,
224 / 32 = 7,因此7×7是特征图的空间分辨率,可以理解为把原图划分为7×7的网格区域,每个位置对应原图的一个感受野区域 - 2048是ResNet50最后一层卷积层的输出通道数,每个7×7网格位置都对应一个2048维的特征向量,用于描述对应感受野内的图像语义信息
如何得到你预期的(24, N)格式特征
如果需要获取每张图对应的一维全局特征,有两种常用方案:
方案1(更推荐):新增全局池化层压缩空间维度
在模型末尾加全局平均池化/全局最大池化层,直接将7×7的空间维度聚合为1维,输出维度为(24, 2048),该方案得到的特征维度低、抗过拟合能力强,是图像特征提取的标准操作,修改后的代码示例如下:
from tensorflow.keras.layers import GlobalAveragePooling2D from tensorflow.keras.models import Model def extract_resnet(X): resnet_base = ResNet50(input_shape=(224, 224, 3), weights=RESNET_WEIGHTS_PATH, include_top=False) # 新增全局平均池化层压缩空间维度 output = GlobalAveragePooling2D()(resnet_base.output) resnet_model = Model(inputs=resnet_base.input, outputs=output) features_array = resnet_model.predict(X) return features_array
方案2:直接展平现有特征
如果不想修改模型定义,也可以对现有输出直接做展平操作:
X_train = X_train.reshape(X_train.shape[0], -1)
该方案得到的特征维度为(24, 7*7*2048) = (24, 100352),特征维度很高,后续训练更容易出现过拟合问题,仅适合有特殊需求的场景使用。
后续训练建议
如果你的任务是图像分类、图像检索这类需要全局图像特征的场景,直接使用方案1得到的2048维特征训练即可,效果和训练效率都会优于展平得到的高维特征。
内容的提问来源于stack exchange,提问作者user3318590
相关产品推荐
相关产品推荐

