Я пытаюсь использовать опцию Keras.backend, чтобы написать функцию, которую я буду использовать в качестве лямбды для моей модели.
Есть два тензора, X и Y. X не обучаем.Y обучаем.
Обернутая функция python:
import keras.backend as K
from keras.activations import softmax
def _attention(inputs):
X, Y = inputs
attention_weight = K.dot(X, K.expand_dims(Y))
attention_weight = K.squeeze(attention_weight, axis=-1)
attention_weight = softmax(attention_weight, axis=-1)
return attention_weight
, которую я хотел обернуть как:
Y = K.random_normal_variable(shape=(200,), mean=0.0, scale=1.0)
attend = Lambda(_attention)
attention = attend((X,Y))
Когда я вызываю:
model = Model(inputs=[input], outputs=[attention])
Я получаю сообщение
ValueError: Output tensors to a Model must be the output of a TensorFlow
Слой (thus holding past layer metadata). Found: Tensor("lambda_2/Softmax:0", shape=(?, ?), dtype=float32)
Действительно ли мне нужно создать специальный слой для метода expand_dims, скалярного произведения и метода сжатия?Я знаю, что всегда мог изменить форму Y из (dim,) -> (dim, 1), но я все еще застрял в сжатии.