我的问题是:
在我的代码中,我在训练之前修改。wv[word],但在。build_vocab()之后,这是相当直接的。只是把我的向量添加到每个单词中,而不是在那里。
for elem in setIntersection:
if len(word_space[elem]) != 300:
print('here', elem) #cast it to the fire
sys.exit()
w2vObjectRI.wv[elem] = np.asarray(word_space[elem], dtype=np.float32)
其中setIntersection只是gensim word2vec和随机索引训练之间的一组常用词。尺寸都是300
现在我还想修改隐藏到输出层的权重,我被告知它们在。trainables中。Syn1neg [i],但这是我的问题这个矩阵不是词可寻址的,只是一个没有名字的普通矩阵。我怎么知道我要修改矩阵中的哪个字母呢?我也看到它们是用0初始化的,我只是在想,如果这些权重在训练前没有重置?更清楚的是,如果我改变这些权重,然后调用train,它会使用我提供的权重吗?谢谢。
for i in range(len(setIntersection)):
if len(word_space[setIntersection[i]]) != 300:
print('here', setIntersection[i]) #cast it to the fire
sys.exit()
w2vObjectRI.trainables.syn1neg[i] = np.asarray(word_space[setIntersection[i]], dtype=np.float32)
欢呼,
佩德罗。
在Gensim 4.0+中,该"隐藏到输出层";只是在w2v_model.syn1neg
中,而不是(现已删除)子组件.trainables
。
在Gensim的实现所基于的原始word2vec.c
之后,这些权重以未初始化的零开始训练。
由于输出(预测词)节点与输入/投影层中考虑的词汇表完全相同,因此行到词的对应关系与输入层(即正在训练的词向量)完全相同。(这之前是在一个名为.syn0
的数组中,最近被称为.vectors
。)
所以w2v_model.wv.vectors
槽0中的单词也是w2v_model.syn1neg[0]
提供的输出节点所表示的单词。
在Gensim 4.0+中,这些字到槽的值可以从w2v_model.wv.key_to_index[word]
中读取。(4.0之前,我想是w2v_model.wv.vocab[word].index
)