错误-输入的不是符号张量-布尔值

时间:2019-05-27 11:45:41

标签: python keras keras-layer

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

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的输入不是符号张量。收到的类型:。全输入:[(,)]。该层的所有输入应为张量。

1 个答案:

答案 0 :(得分:1)

有三点:

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

  2. greater的输出是布尔Tensor,您需要对其进行强制转换才能对其进行计算。

  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!