Advertisement

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)

还没有任何评论哟~