假设我有一个Seq2Seq模型。我要在此模型中包含嵌入层。
根据我的研究,我可以通过三种方式做到这一点:
分别训练将单词嵌入到我的数据集中,或下载经过预训练的单词嵌入,然后将这些嵌入的权重用作我的数据集中单词的权重。因此,这里我完全不需要嵌入层,只需将已经训练的单词的权重加载到数据集中的单词中即可。
我创建了一个嵌入层并设置了可训练的true,因此不仅我有一个嵌入,而且还将根据我的任务训练该嵌入
我创建一个嵌入层,加载已经训练好的权重,并设置可训练的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=3
和two vectors
。
嵌入是gensim中的单词2vec,
如果有人在我迷路的地方看到它,会欣赏它吗?
谢谢〜
答案 0 :(得分:1)
根据我的理解,您对设置嵌入层的三种变体的解释完全正确。
有两种主要的迁移学习技术。
使用预先学习的模型作为功能向量。在您的情况下,word2vec模型将用作查找服务,以将令牌预处理/转换为id,然后嵌入向量。当您训练自己的模型时,这些嵌入向量将成为实际功能。 (这是您的#1)
使用微调方法。在这里,您可以选择继续训练预学习的模型(设置可训练=真)或修复预学习的模型(设置可训练=假)。两种方法都可能有益。 (这是您的#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]]