预期输入来自gensim的带有预训练向量的焊炬嵌入层

时间:2019-02-12 17:28:57

标签: vector pytorch gensim word2vec recurrent-neural-network

我想在我的神经网络体系结构中使用预训练的嵌入。预训练的嵌入由gensim训练。我发现this informative answer表示我们可以像这样加载预先训练的模型:

import gensim
from torch import nn

model = gensim.models.KeyedVectors.load_word2vec_format('path/to/file')
weights = torch.FloatTensor(model.vectors)
emb = nn.Embedding.from_pretrained(torch.FloatTensor(weights.vectors))

这似乎在1.0.1上也能正常工作。我的问题是,我不太了解要使用该层必须输入什么内容。我可以只喂代币(句段)吗?我是否需要映射,例如令牌到索引?

我发现您可以通过类似

的方法来访问令牌的向量
print(weights['the'])
# [-1.1206588e+00  1.1578362e+00  2.8765252e-01 -1.1759659e+00 ... ]

这对RNN架构意味着什么?我们可以简单地加载批处理序列的令牌吗?例如:

for seq_batch, y in batch_loader():
    # seq_batch is a batch of sequences (tokenized sentences)
    # e.g. [['i', 'like', 'cookies'],['it', 'is', 'raining'],['who', 'are', 'you']]
    output, hidden = model(seq_batch, hidden)

这似乎不起作用,所以我假设您需要在最终的word2vec模型中将标记转换为其索引。真的吗?我发现您可以使用word2vec模型的vocab获得单词的索引:

weights.vocab['world'].index
# 147

因此,作为嵌入层的输入,我是否应该为由一系列单词组成的句子序列提供int的张量?与虚拟数据加载器(参见上面的示例)和虚拟RNN欢迎一起使用的示例。

1 个答案:

答案 0 :(得分:0)

documentation说以下

  

此模块通常用于存储单词嵌入并使用索引检索它们。该模块的输入是一个索引列表,输出是相应的词嵌入。

因此,如果您想输入一个句子,则给LongTensor of索引,每个索引对应于词汇表中的一个单词,nn.Embedding层将映射到前进的单词向量中。

这是一个插图

test_voc = ["ok", "great", "test"]
# The word vectors for "ok", "great" and "test"
# are at indices, 0, 1 and 2, respectively.

my_embedding = torch.rand(3, 50)
e = nn.Embedding.from_pretrained(my_embedding)

# LongTensor of indicies corresponds to a sentence,
# reshaped to (1, 3) because batch size is 1
my_sentence = torch.tensor([0, 2, 1]).view(1, -1)

res = e(my_sentence)
print(res.shape)
# => torch.Size([1, 3, 50])
# 1 is the batch dimension, and there's three vectors of length 50 each

关于RNN,接下来您可以将该张量输入到RNN模块中,例如

lstm = nn.LSTM(input_size=50, hidden_size=5, batch_first=True)
output, h = lstm(res)
print(output.shape)
# => torch.Size([1, 3, 5])

我还建议您研究torchtext。它可以自动执行您必须手动执行的某些操作。