PyTorch/Gensim - 如何加载预训练的单词嵌入

blu*_*nox 26 python embedding neural-network gensim pytorch

我想将带有gensim的预训练word2vec嵌入到PyTorch嵌入层中.

所以我的问题是,如何将gensim加载的嵌入权重加到PyTorch嵌入层中.

提前致谢!

blu*_*nox 36

我只是想报告关于使用PyTorch加载gensim嵌入的研究结果.

0.4.0这里有一个新功能v0.4.0,使加载嵌入非常舒适.以下是文档中的示例.

>> # FloatTensor containing pretrained weights
>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>> embedding = nn.Embedding.from_pretrained(weight)
>> # Get embeddings for index 1
>> input = torch.LongTensor([1])
>> embedding(input)
Run Code Online (Sandbox Code Playgroud)

gensim的权重可以通过以下方式轻松获得:

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('path/to/file')
weights = torch.FloatTensor(model.vectors) # formerly syn0, which is soon deprecated
Run Code Online (Sandbox Code Playgroud)

但是我使用的是版本from_pretrained(),0.3.1在此版本中不可用.

因此我创建了自己的,0.3.1所以我也可以使用它from_pretrained().

from_pretrainedPyTorch版本0.3.1或更低版本的代码:

def from_pretrained(embeddings, freeze=True):
    assert embeddings.dim() == 2, \
         'Embeddings parameter is expected to be 2-dimensional'
    rows, cols = embeddings.shape
    embedding = torch.nn.Embedding(num_embeddings=rows, embedding_dim=cols)
    embedding.weight = torch.nn.Parameter(embeddings)
    embedding.weight.requires_grad = not freeze
    return embedding
Run Code Online (Sandbox Code Playgroud)

嵌入可以加载,就像这样:

embedding = from_pretrained(weights)
Run Code Online (Sandbox Code Playgroud)

我希望这对某人有帮助.

  • 之后模型的输入是什么?是文本本身还是文本的 1-hot 编码? (2认同)
  • @blue-phoenox 请问你如何获取整数/令牌 ID? (2认同)