Keras构建多输出Functional模型时触发ValueError错误如何解决
报错原因
触发的报错信息为:
ValueError: Output tensors of a Functional model must be the output of a TensorFlow
Layer(thus holding past layer metadata). Found: <keras.layers.core.Dense object at 0x7fc72304d210>
该报错的核心原因是Keras Functional模型要求传入的outputs必须是层的输出张量,不能是未调用的层实例。
你代码中边界框输出分支的写法存在错误:
# 此处仅实例化了Dense层对象,未传入上层张量完成前向计算,得到的是层实例而非输出张量 bbox_output = Layers.Dense(4, activation = 'sigmoid', name = 'bounding_box')
对比分类输出分支的正确写法:你在实例化分类输出的Dense层后,传入了上层的classification张量得到输出张量class_output,而边界框分支缺少了层调用的步骤,导致你传入模型的bbox_output是层对象而非张量,触发报错。
修复方法
- 修改边界框输出分支的代码,完成层调用,拿到输出张量:
# 修正后写法,将上层bbox张量传入Dense层 bbox_output = Layers.Dense(4, activation = 'sigmoid', name = 'bounding_box')(bbox)
- 补充缺失的tensorflow导入,避免
tf未定义报错,在代码开头加入:
import tensorflow as tf
完整可运行代码
import tensorflow as tf import tensorflow.keras.layers as Layers from tensorflow.keras.applications import VGG16 vgg = VGG16( include_top=False, weights="imagenet", ) vgg.trainable = False def create_model(): inputs = Layers.Input(shape = (224,224,3)) x = vgg(inputs) flatten = Layers.Flatten()(x) bbox = Layers.Dense(512, activation = 'relu')(flatten) bbox = Layers.Dropout(0.2)(bbox) bbox = Layers.Dense(64, activation = 'relu')(bbox) bbox = Layers.Dropout(0.2)(bbox) # 修正后代码 bbox_output = Layers.Dense(4, activation = 'sigmoid', name = 'bounding_box')(bbox) classification = Layers.Dense(512,activation='relu')(flatten) classification = Layers.Dropout(0.5)(classification) classification = Layers.Dense(128, activation = 'relu')(classification) classification = Layers.Dropout(0.25)(classification) class_output = Layers.Dense(3, activation = 'softmax', name = 'class')(classification) model = tf.keras.Model(inputs = inputs, outputs = [class_output, bbox_output]) return model model = create_model() model.summary()
内容的提问来源于stack exchange,提问作者Sarthak Mehrotra
相关产品推荐
相关产品推荐

