lstm序列的单词嵌入

时间:2019-06-02 21:11:50

标签: tensorflow keras lstm gensim word-embedding

假设我有一个Seq2Seq模型。我要在此模型中包含嵌入层。

根据我的研究,我可以通过三种方式做到这一点:

  1. 分别训练将单词嵌入到我的数据集中,或下载经过预训练的单词嵌入,然后将这些嵌入的权重用作我的数据集中单词的权重。因此,这里我完全不需要嵌入层,只需将已经训练的单词的权重加载到数据集中的单词中即可。

  2. 我创建了一个嵌入层并设置了可训练的true,因此不仅我有一个嵌入,而且还将根据我的任务训练该嵌入

  3. 我创建一个嵌入层,加载已经训练好的权重,并设置可训练的False。在这种情况下,权重将不会更新。

(如果我错了,请纠正我)。

我使用了setState()。我想知道这段代码输出的解释:

first approach

这是输出:

model_wv = Word2Vec.load("word2vec_50d_7w")
embeddings = np.zeros((len(model_wv.wv.vocab), emb_dim))
for i in range(len(model_wv.wv.vocab)):
    # print(i)
    embedding_vector = model_wv.wv[model_wv.wv.index2word[i]]
    if embedding_vector is not None:
        embeddings[i] = embedding_vector

print(embeddings[[1,2,3],[3,4,1]])

将此[-0.01566689 -1.36469996 0.59684211] [1,2,3],[3,4,1]视为两个序列。

我当时在想我们在lstm中使用单词嵌入将序列中的每个单词转换成一个嵌入。我希望在每个向量中都能看到length=3two vectors

嵌入是gensim中的单词2vec,

如果有人在我迷路的地方看到它,会欣赏它吗?

谢谢〜

1 个答案:

答案 0 :(得分:1)

根据我的理解,您对设置嵌入层的三种变体的解释完全正确。

有两种主要的迁移学习技术。

  1. 使用预先学习的模型作为功能向量。在您的情况下,word2vec模型将用作查找服务,以将令牌预处理/转换为id,然后嵌入向量。当您训练自己的模型时,这些嵌入向量将成为实际功能。 (这是您的#1)

  2. 使用微调方法。在这里,您可以选择继续训练预学习的模型(设置可训练=真)或修复预学习的模型(设置可训练=假)。两种方法都可能有益。 (这是您的#2和#3)

根据我的经验,

(#1和#3)在质量方面产生相似的结果。 如果您拥有大量的训练数据,那么根据我的经验,使用trainable = True(#2)进行微调将是最好的方法。

您的问题是一个小问题。您可能应该说,

elif player == "paper":
     if computer == "scissors":
...
...

elif player == "scissors":
    if computer == "rock":
...
...

否则,indexing不能正常工作。

print(embeddings[[1,2,3]], embeddings[[3,4,1]])

这实际上是查找索引为1、2、3的行,并分别获得索引为3、4、1的列。换句话说,它会拾起

embeddings[[1,2,3],[3,4,1]]
相关问题