如何为基本矢量/张量乘法编写Keras层

时间:2018-04-25 03:30:07

标签: python lambda keras matrix-multiplication

所以我想通过常量向量乘以嵌入的输出。我使用的是功能API而不是Sequential。

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内的word_embs嵌入式type="submit"

我认为我需要使用keras变量将q转换为张量,但是由于word_embeds上的None维度,Dot层或keras.backend.dot都给我带来了麻烦。我不想使用Flatten因为这会将它减少到一个维度,而不是仅仅摆脱麻烦的那个。重塑我需要的东西吗?或者我可以将word_embs [:]传递给lambda图层吗?

也许我对张量不太了解,但这非常令人沮丧。看起来这样一个先进的python库应该能够轻松地进行高中矩阵乘法,但我无法弄明白。

1 个答案:

答案 0 :(得分:0)

您可以使用1作为Lambda中常量张量的批量维度:

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)