Как написать слой Keras для базового векторного / тензорного умножения - PullRequest
0 голосов
/ 25 апреля 2018

Итак, я хочу умножить выходные данные вложения на постоянный вектор. Я использую функциональный API, а не последовательный.

word_seq = Input(shape = (SEQ_LEN,), dtype = "int32", name = "word_seq") 

word_embs = Embedding(output_dim = EMBED_DIM, input_dim = VOCAB_SIZE, input_length = SEQ_LEN)(word_seq)

Если я правильно понимаю, потому что я не дал форму партии, word_embs должен иметь форму (None, SEQ_LEN, EMBED_DIM).

У меня есть постоянный вектор (numpy array) q формы (SEQ_LEN,). Поэтому я хочу выполнить умножение матриц q^T* (матрица seq_len на embed_dim внутри word_embs).

Думаю, мне нужно будет использовать переменную keras, чтобы превратить q в тензор, но затем слой Dot или keras.backend.dot доставляют мне проблемы из-за этого измерения None в word_embeds. Я не хочу использовать Flatten, потому что это сведет его к одному измерению, а не просто избавит от проблемного. Это Reshape то, что мне нужно тогда? Или я могу передать word_embs [:] лямбда-слою или что-то в этом роде?

Может быть, я просто недостаточно знаю о тензорах, но это очень расстраивает. Кажется, что такая продвинутая библиотека на python легко может выполнять умножение матриц в старших классах, но я не могу этого понять.

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете использовать 1 в качестве размерности партии для постоянного тензора в вашей лямбде:

import keras.backend as K
[...]

def my_lambda(x):
    q_array = np.zeros((1, SEQ_LEN))
    q_array = ... # your value
    q = K.constant(q_array.T)
    return Dot()([q, x])

result = Lambda(my_lambda)(word_embs)
...