Я пытаюсь настроить вес слоя Dense
благодаря бинарной кроссэнтропийной потере. A создали общий слой, который выводит для двух векторов два значения (encoded_value_1
и encoded_value_2
). Я хочу создать логическое значение, равное 1, если значение encoded_value_1
превосходит значение encoded_value_2
.
Для этого я использую 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'])
NB: я также пытался объединить два слоя, у меня была та же ошибка.
merged_vector = concatenate([encoded_value_1, encoded_value_2], axis=-1)
x = Lambda(greater,output_shape=(1,))((merged_vector[0],merged_vector[1]))
ValueError: Layer lambda_4 was called with an input that isn't a symbolic tensor. Received type: . Full input: [(, )]. All inputs to the layer should be tensors.
Есть три пункта:
Когда слой Lambda
имеет более одного входа, входы должны передаваться в виде списка тензоров, а не кортежа.
Результатом greater
является логический тензор, который вам нужно преобразовать в float для выполнения вычислений над ним.
greater
принимает два входа, поэтому вам нужно обернуть его внутри функции Python lambda
, чтобы иметь возможность использовать его в слое Lambda
в Keras.
Следовательно, у нас было бы:
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!