向VGG19网络添加Dense层报错求助:AttributeError问题排查
问题原因分析
你遇到的AttributeError核心原因是:你把Keras的层对象(model.layers[-1])直接传给了Dense层,而Dense层需要接收的是张量(Tensor)作为输入。model.layers[-1]返回的是VGG19最后一层的实例(比如默认VGG19的最后一层是predictions Dense层),不是这个层的输出张量,所以Dense层无法识别它的形状,导致报错。
解决方案
要解决这个问题,你需要获取VGG19模型的输出张量,然后将其作为新Dense层的输入。下面是修正后的代码:
import tensorflow as tf from tensorflow.keras.applications.vgg19 import VGG19 # 加载预训练的VGG19模型(默认包含顶层全连接层) base_model = VGG19() # 获取VGG19模型的输出张量,而不是最后一层的对象 x = base_model.output # 添加新的Dense层 x = tf.keras.layers.Dense(10, activation="relu", name="new_dense", trainable=True)(x) # 构建新的模型,输入用base_model的输入,输出用新添加层的输出 model = tf.keras.Model(inputs=base_model.input, outputs=x)
额外优化建议(可选)
如果你是做迁移学习,通常需要冻结预训练模型的权重,只训练新添加的层,可以在加载模型后添加这行代码:
# 冻结VGG19的所有层,使其权重不被更新 for layer in base_model.layers: layer.trainable = False
这样修改后,代码就能正常运行,不会再出现AttributeError了。
内容的提问来源于stack exchange,提问作者Sadegh Moosavi
相关产品推荐
相关产品推荐

