如何为基本 vector/tensor 乘法编写 Keras 层

How to write a Keras Layer for basic vector/tensor 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 内的 embed_dim 矩阵)。

我想我需要使用 keras 变量将 q 转换为张量,但是点层或 keras.backend.dot 都会给我带来麻烦,因为 None 维度 word_embeds。我不想使用 Flatten,因为这会将它缩小到一个维度,而不仅仅是摆脱麻烦的维度。 Reshape 是我需要的吗?或者我可以将 word_embs[:] 传递给 lambda 层什么的吗?

也许我对张量的了解不够,但这非常令人沮丧。看起来这么高级的 python 库应该很容易就能做高中矩阵乘法,但我想不通。

您可以在 Lambda 中使用 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)