我使用 keras 已经有一段时间了。但我会这样做:
您可能会使用 gensim 库加载 Glove 和 Word2Vec。我假设您知道如何将这些加载到 keras 嵌入层中。如果没有,请告诉我。
您将在此处将两个嵌入层都设置为不可训练。
对于 X 和 Y,您可以像 E1 和 E2 一样创建另外两个嵌入层,而无需提供权重并将它们设置为 trainable,这些将在训练过程中被网络学习。
您可能也可以使用 Dense 层,但我认为使用嵌入层会更容易。
对于乘法和加法,有一个如何使用它的示例,取自keras documentation:
import keras
input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
added = keras.layers.Add()([x1, x2]) # equivalent to added = keras.layers.add([x1, x2])
out = keras.layers.Dense(4)(added)
model = keras.models.Model(inputs=[input1, input2], outputs=out)
更新:
例如,对于单词“dog”,我想得到 x["dog"]*E1["dog"]
+ y["dog"]*E2["dog"] 当 x 和 y 是学习参数时(请注意,我想为每个我知道需要以某种方式学习的单词学习 x 和 y
X向量和Y向量并使用“添加”合并,但我不知道
如何实际做到这一点,我们将不胜感激。
所以,我没有对此进行测试,也是因为我没有数据,代码中可能存在一些错误 - 但总的来说它可能应该是这样的:
#input
sequence_input = Input(shape=(max_review_len,), dtype='int32')
# loading your Glove embedding
layer_E1 = Embedding(w1.shape[0],w1.shape[1],
weights=[w1],
input_length=max_review_len,
trainable=False)
# loading your Word2Vec embedding
layer_E2 = Embedding(w2.shape[0],w2.shape[1],
weights=[w2],
input_length=max_review_len,
trainable=False)
# applying embeddings
embedded_E1 = layer_E1(sequence_input)
embedded_E2 = layer_E2(sequence_input)
# creating learnable embedding layer X and Y
layer_X = Embedding(vocab_size, embedding_vecor_length, input_length=max_review_len)
layer_Y = Embedding(vocab_size, embedding_vecor_length, input_length=max_review_len)
# your weights X and Y
embedded_X = layer_X(sequence_input)
embedded_Y = layer_Y(sequence_input)
# Multiplying X*E1 (x["dog"]*E1["dog"])
layer_E1_X = keras.layers.Multiply()([embedded_E1, embedded_X])
# Multiplying Y*E2 (y["dog"]*E2["dog"])
layer_E2_Y = keras.layers.Multiply()([embedded_E2, embedded_Y])
# merging the results with add
added = keras.layers.Add()([layer_E1_X, layer_E2_Y])
# …
# some other layers
# …
your_final_output_layer = Dense(1, activation='sigmoid')(previous_layer)
model = Model(sequence_input, your_final_output_layer)
model.compile(…)
model.fit(…)
编辑:我忘了应用 X 和 Y 嵌入,我现在添加了。
(请认为这是一个粗略的想法或大纲,您可能需要更改一些内容)
这里重要的是维度匹配,因此嵌入 E1 和 E2 应该具有相同的嵌入维度。 embedding_vecor_length 也必须相同才能正常工作。
代码中的w1 和w2 被假定为您的glove 和加载了gensim 的word2vec 嵌入。
所以,我希望这大致是您想要做的。 :)