Custom / Лямбда-слой с обучаемым весом - PullRequest
0 голосов
/ 08 июня 2018

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

...