加载预训练模型微调时GlobalAveragePooling2D维度不兼容问题求助
解决GlobalAveragePooling2D输入维度不兼容的问题
兄弟,这个错误的根源很明确:你加载的model.h5的输出已经是2维张量(形状[None, 128],也就是批量大小+128维特征),但GlobalAveragePooling2D层要求输入必须是4维张量(通常是[批量大小, 高度, 宽度, 通道数],也就是卷积层输出的格式),所以才会报维度不兼容的错。
先搞清楚你的预训练模型结构
首先你得先确认加载的模型到底输出的是什么,运行下面的代码打印模型结构:
import tensorflow as tf # 加载模型并打印结构 loaded_model = tf.keras.models.load_model('model.h5', compile=False) loaded_model.summary()
看最后一层的输出形状,如果最后一层已经是Dense或者GlobalAveragePooling2D这类输出2D张量的层,那你就不需要再额外加GlobalAveragePooling2D了。
解决方案一:直接基于现有2D输出构建分类头
如果原模型的输出已经是扁平化的特征(比如你看到的[None,128]),那直接去掉多余的GlobalAveragePooling2D层,把后续的Dense层接上去就行:
def create_keras_model(): model = tf.keras.models.load_model('model.h5', compile=False) resnet_output = model.output # 形状是[None,128]的2D张量 # 去掉GlobalAveragePooling2D,直接接Dense层 layer2 = tf.keras.layers.Dense(units=256, use_bias=False, name='nonlinear')(resnet_output) # 二分类任务建议用softmax输出概率,relu不适合做分类输出层 model_output = tf.keras.layers.Dense(units=2, use_bias=False, name='output', activation='softmax')(layer2) model = tf.keras.Model(model.input, model_output) return model
解决方案二:取原模型的卷积层输出构建分类头
如果你原本的意图是用原模型中卷积部分的输出(4维张量)来做全局池化,那你需要找到原模型中最后一个卷积层的名字,用它的输出作为输入:
def create_keras_model(): model = tf.keras.models.load_model('model.h5', compile=False) # 替换成你模型中最后一个卷积层的名字,比如ResNet的典型命名是'conv5_block3_out' conv_output = model.get_layer('last_conv_layer_name').output # 现在conv_output是4维张量,可以正常使用GlobalAveragePooling2D layer1 = tf.keras.layers.GlobalAveragePooling2D()(conv_output) layer2 = tf.keras.layers.Dense(units=256, use_bias=False, name='nonlinear')(layer1) model_output = tf.keras.layers.Dense(units=2, use_bias=False, name='output', activation='softmax')(layer2) model = tf.keras.Model(model.input, model_output) return model
怎么找最后一个卷积层的名字?看loaded_model.summary()的输出,找类型是Conv2D的最后一层,它的名字就是你要填的。
内容的提问来源于stack exchange,提问作者seni
相关产品推荐
相关产品推荐

