使用预训练Keras模型时出现输入张量错误该如何解决
报错原因
- 调用Flatten层时直接传入了
VGG19模型对象本身,而不是模型输出的张量。Keras层仅支持接收张量作为输入,不能直接传入模型实例。 - 自定义输入为4通道格式,而加载的预训练VGG19默认适配3通道RGB输入,直接调用会出现维度不匹配问题,需要提前做通道转换处理。
修正后可运行代码
from tensorflow import keras from tensorflow.keras import layers from keras.applications.vgg19 import VGG19 inputs = layers.Input(shape = (32,32,4)) # 新增卷积层将4通道输入转为3通道,适配VGG19的输入要求 x = layers.Conv2D(3, (3,3), padding='same', activation='relu')(inputs) vgg_model = VGG19(weights='imagenet', include_top=False, input_shape=(32,32,3)) vgg_model.trainable = False # 先将输入张量传入VGG模型得到特征张量,再接入后续自定义层 x = vgg_model(x) x = layers.Flatten(name='flatten')(x) x = layers.Dense(512, activation='relu', name='fc1')(x) x = layers.Dense(512, activation='relu', name='fc2')(x) x = layers.Dense(1,name='predictions')(x) new_model = keras.models.Model(inputs=inputs, outputs=x) new_model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae'])
关键改动说明
- 给VGG19显式指定
input_shape参数,匹配输入图像尺寸,避免动态推断维度出错 - 新增1层卷积完成4通道到3通道的转换,对齐预训练模型的输入要求
- 修正了张量传递链路:先将输入张量传入VGG模型得到输出特征张量,再传入后续的Flatten和全连接层,符合Keras函数式API的调用规则
内容的提问来源于stack exchange,提问作者rayan
相关产品推荐
相关产品推荐

