deep-learning - 简单的加权嵌入网络

标签 deep-learning keras keras-layer

我有几个嵌入矩阵,假设 E1 矩阵用于 Glove,E2 用于 Word2vec。

我想构建一个简单的情感分类器,它采用该嵌入的可训练加权和。

例如,对于单词“dog”,我想在学习 x 和 y 时得到 x["dog"]*E1["dog"] + y["dog"]*E2["dog"]参数(注意我想为每个单词学习 x 和 y 我知道我需要以某种方式学习 X 向量和 Y 向量并将合并与“添加”结合使用,但我不知道如何实际操作,我们将不胜感激。

我的网络如下所示:

embd = Sequential()
embd.add(Embedding(topWords + 2, embedding_vecor_length, 
input_length=max_review_len, weights=[embedding_weights],trainable=False))
sent_model = Sequential()
sent_model.add(embd)
sent_model.add(Conv1D(filters, kernel_size, border_mode='valid', 
activation='relu', input_shape=(max_review_len, embedding_vecor_length)))
sent_model.add(Dense(1, activation='sigmoid'))

最佳答案

我使用 keras 已经有一段时间了。但我会这样做:

您可能会使用 gensim 库加载 Glove 和 Word2Vec。我假设您知道如何将它们加载到 keras 嵌入层中。如果没有,请告诉我。

在这里,您将两个嵌入层都设置为不可训练

对于 XY,您可以像为 E1 和 E2 那样创建另外两个嵌入层,而无需提供权重并将它们设置为可训练,这些将在训练过程中由网络学习。

您可能也可以使用 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)

更新:

For example, for the word "dog" I would like to get x["dog"]*E1["dog"] + y["dog"]*E2["dog"] when x and y are learned parameters (notice that I want to learn x and y for each word I know I need to somehow learn the X vector and Y vector and use merge with "add", but I have no idea how to actually do it, help will be highly appreciated.

所以,我没有测试过这个,也因为我没有数据,代码中可能有一些错误 - 但一般来说它应该是这样的:

#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 也必须相同才能起作用。

假设代码中的

w1w2 是你的手套和加载了 gensim 的 word2vec 嵌入。

所以,我希望这大致就是您想要做的。 :)

关于deep-learning - 简单的加权嵌入网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50054806/

相关文章:

python - 如何在 PyTorch 中为预训练模型添加层?

python - 在 Keras 中,训练有状态 LSTM 模型后,是否必须在预测值时重新训练模型?

python - TensorFlow 分配内存 : Allocation of 38535168 exceeds 10% of system memory

python - 使用 lstm 和 keras 训练模型

sdk - 在 Hexagon HVX DSP 上运行 nnlib 测试应用程序

machine-learning - 如何使预先存在的 tensorflow variable_scope应用于操作?

tensorflow - 如何用keras更好地组织tensorboard中的节点?

python - 如何为 python 的 keras LSTM 塑造大型 DataFrame?

tensorflow - 如何在 Keras 中翻转张量?

tensorflow - Keras:layers.Input 和 layers.InputLayer 有什么区别?