Ошибка - ввод, который не является символическим тензором - логическое значение

Я пытаюсь настроить вес слоя 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.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть три пункта:

  1. Когда слой Lambda имеет более одного входа, входы должны передаваться в виде списка тензоров, а не кортежа.

  2. Результатом greater является логический тензор, который вам нужно преобразовать в float для выполнения вычислений над ним.

  3. 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!

Другие вопросы по теме