如何在Keras ResNet50后正确添加Dense层?解决张量输入报错问题
ResNet50后接入Dense层的报错修复
报错触发的核心原因
TypeError: Inputs to a layer should be tensors的问题本质是你把ResNet50的模型实例对象当成特征张量传给了Dense层,不符合Keras层的输入类型要求。
逐行对应你的代码逻辑就能定位问题:
- 你写的
x = tf.keras.applications.ResNet50(...)这行,变量x存的并不是网络输出的特征张量,而是完整的ResNet50模型对象,属于Functional类型的模型实例 - Keras中所有层在调用执行计算时,只接受Tensor类型的输入,传入模型对象会直接触发类型校验报错
- 你配置的
include_top=False+pooling='avg'只是设定了ResNet50的输出形式,并没有完成“把实际输入张量送入主干网络、拿到输出特征”的步骤,不能直接把整个ResNet50模型当作张量使用
可正常运行的实现代码
按照Keras Functional API的标准搭建逻辑修改即可,核心是显式拿到主干网络输出的特征张量,再接入Dense层:
import tensorflow as tf # 提前定义图像尺寸常量 IMG_WIDTH = 224 IMG_HEIGHT = 224 def build_model(): # 1. 定义模型的正式输入张量 inputs = tf.keras.Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3)) # 2. 实例化ResNet50主干网络 backbone = tf.keras.applications.ResNet50( input_shape=(IMG_WIDTH, IMG_HEIGHT, 3), weights=None, include_top=False, pooling='avg' ) # 3. 把输入张量传入主干,拿到真正的输出特征张量 feat = backbone(inputs) # 4. 将特征张量传入Dense层 outputs = tf.keras.layers.Dense(196)(feat) # 5. 绑定输入输出关系,生成完整可运行的模型 model = tf.keras.Model(inputs=inputs, outputs=outputs) model.summary() return model
常见踩坑提醒
- 不要把模型实例和张量输出混为一谈:哪怕给ResNet50指定了input_shape,实例化得到的也是一个独立的网络模块,不是可以直接被下游层调用的张量
- 如果需要给主干网络加冻结、训练层筛选等自定义逻辑,当前的Functional写法灵活性最高,后续调整主干结构、添加多输出分支都不需要大改代码
- 如果不需要复杂的分支结构,也可以用更短的Sequential写法实现相同效果:
但这种写法不支持多输入、多输出、层间跳连等自定义结构,灵活性弱于Functional APImodel = tf.keras.Sequential([ tf.keras.applications.ResNet50( input_shape=(IMG_WIDTH, IMG_HEIGHT, 3), weights=None, include_top=False, pooling='avg' ), tf.keras.layers.Dense(196) ]) model.summary()
内容的提问来源于stack exchange,提问作者Zahra Hosseini
相关产品推荐
相关产品推荐

