如何为基本 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)
所以我想将嵌入的输出乘以常数向量。我使用的是函数式 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)