【问题标题】:Error - input that isn't a symbolic tensor - Boolean错误 - 不是符号张量的输入 - 布尔值
【发布时间】:2019-10-12 23:48:51
【问题描述】:

由于二元交叉熵损失,我正在尝试调整Dense 层的权重。 A 创建了一个共享层,为两个向量输出两个值(encoded_value_1encoded_value_2)。如果encoded_value_1 的值优于encoded_value_2 的值,我想创建一个等于1 的布尔值。 为此,我通过Lambda 层使用greater。然而,它会产生错误(见下文)。

import keras
from keras.backend import greater
from keras.layers import Input, LSTM, Dense, Lambda, concatenate
from keras.models import Model

value_1 = Input(shape=(4,))
value_2 = Input(shape=(4,))

shared_layer = Dense(1)
encoded_value_1 = shared_layer(value_1)
encoded_value_2 = shared_layer(value_2)

x = Lambda(greater,output_shape=(1,))((encoded_value_1,encoded_value_2)) 
model = Model(inputs=[value_1, value_2], outputs=x)
model.compile(optimizer='adam',loss='binary_crossentropy', metrics='accuracy'])

注意:我也尝试连接两个层,我遇到了同样的错误。

merged_vector = concatenate([encoded_value_1, encoded_value_2], axis=-1)
x = Lambda(greater,output_shape=(1,))((merged_vector[0],merged_vector[1]))

ValueError:使用不是符号张量的输入调用层 lambda_4。接收类型:.完整输入:[(, )]。该层的所有输入都应该是张量。

【问题讨论】:

    标签: python keras keras-layer


    【解决方案1】:

    分三点:

    1. Lambda 层有多个输入时,输入必须作为张量列表而不是元组传递。

    2. greater 的输出是一个布尔张量,您需要将其转换为浮点数以对其进行计算。

    3. greater 接受两个输入,因此您需要将其包装在 python lambda 函数中,以便能够在 Keras 的 Lambda 层中使用它。

    因此,我们会:

    from keras import backend as K
    
    # ...
    x = Lambda(lambda z: K.cast(K.greater(z[0], z[1]), K.floatx()),output_shape=(1,))([encoded_value_1,encoded_value_2])
    

    也不要忘记 metrics 参数缺少的左括号:

    ..., metrics=['accuracy'])
                 ^
                 |
                 |
              missing!
    

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 2017-08-29
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多