ValueError: Output tensors to a Model must be the output of a TensorFlow `Layer`
发布时间
阅读量:
阅读量
近期正在学习tensorflow.keras的多输入多输出功能时遇到了一个问题,并将其详细思考和解决过程记录下来。
首先给出报错代码:
# 两个输入
main_input = tf.keras.layers.Input(shape=(784,),dtype=tf.float32,name="main_input")
auxiliary_input = tf.keras.layers.Input(shape=784,),dtype=tf.float32,name="auxiliary_input")
## 网络1
x = tf.keras.layers.Dense(128,activation="relu")(main_input)
dense_out = tf.keras.layers.Dense(10,activation="softmax")(x)
output1 = tf.keras.layers.Dense(10,activation="softmax")(dense_out) ## 输出1
## 网络2
x = tf.keras.backend.concatenate([dense_out, auxiliary_input])
x = tf.keras.layers.Dense(128,activation="relu")(x)
x = tf.keras.layers.Lambda(tf.keras.layers.Dropout(0.5))(x)
x = tf.keras.layers.Dense(128,activation="relu")(x)
main_output = tf.keras.layers.Dense(10,activation="softmax")(x) # 输出2
model = tf.keras.models.Model(inputs=[main_input,auxiliary_input], outputs=[main_output,output1])
optimizer = tf.keras.optimizers.Adam(0.01)
model.compile(optimizer=optimizer,loss=tf.keras.losses.categorical_crossentropy,loss_weights=[1.0,1.0])
代码解读
错误提示显示:异常信息指出模型输出必须源自TensorFlow的一个Layer结构(这些层需包含历史元数据)。已识别到与该要求不符的具体张量:'dense_5/Softmax:0'(形状为(?, 10),数据类型为float32)。

通过报错信息查找到 抛出该错误的代码

识别出该代码行中的变量x不具备'_keras_history'属性,并因此推断变量main_output也未具备该属性。经过查阅资料发现原因在于在编程过程中插入了一条不带有'_keras_history'属性的方法。进一步分析发现这一现象源于所使用的后端框架是TensorFlow而非Keras

优化代码结构后的问题得以顺利解决:通过将tf.keras.backend.concatenate函数嵌入到tf.keras.layers.Lambda层中
main_input = tf.keras.layers.Input(shape=(784,),dtype=tf.float32,name="main_input")
auxiliary_input = tf.keras.layers.Input(shape=(784,),dtype=tf.float32,name="auxiliary_input")
## 网络1
x = tf.keras.layers.Dense(128,activation="relu")(main_input)
dense_out = tf.keras.layers.Dense(10,activation="softmax")(x)
output1 = tf.keras.layers.Dense(10,activation="softmax")(dense_out) ## 输出1
## 网络2
x = tf.keras.layers.Lambda(lambda x: tf.keras.backend.concatenate(x))([dense_out, auxiliary_input])
x = tf.keras.layers.Dense(128,activation="relu")(x)
x = tf.keras.layers.Lambda(tf.keras.layers.Dropout(0.5))(x)
x = tf.keras.layers.Dense(128,activation="relu")(x)
main_output = tf.keras.layers.Dense(10,activation="softmax")(x) # 输出2
model = tf.keras.models.Model(inputs=[main_input,auxiliary_input], outputs=[main_output,output1])
optimizer = tf.keras.optimizers.Adam(0.01)
model.compile(optimizer=optimizer,loss=tf.keras.losses.categorical_crossentropy,loss_weights=[1.0,1.0])
代码解读
参考:
<>
<>
全部评论 (0)
还没有任何评论哟~
