Vector 预期输入到torch嵌入层,带有来自gensim的预训练向量

Vector 预期输入到torch嵌入层,带有来自gensim的预训练向量,vector,pytorch,gensim,word2vec,recurrent-neural-network,Vector,Pytorch,Gensim,Word2vec,Recurrent Neural Network,我想在我的神经网络架构中使用预先训练过的嵌入。预培训的嵌入件由gensim培训。我发现这表明我们可以加载经过预培训的模型,如下所示: 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_pretrain

我想在我的神经网络架构中使用预先训练过的嵌入。预培训的嵌入件由gensim培训。我发现这表明我们可以加载经过预培训的模型,如下所示:

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欢迎。

说明如下

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

因此,如果你想输入一个句子,你可以给出一个
LongTensor的
索引,每个索引对应于词汇表中的一个单词,
nn.嵌入
层将映射到单词向量中

这是一个例子

test\u voc=[“好”、“好”、“测试”]
#“ok”、“great”和“test”的单词向量
#指数分别为0、1和2。
my_=torch.rand(3,50)
e=nn.Embedding.from_pretrained(my_Embedding)
#标记的长传感器对应于一个句子,
#由于批处理大小为1,因此重新调整为(1,3)
我的句子=火炬。张量([0,2,1])。视图(1,-1)
res=e(我的句子)
打印(res.shape)
#=>火炬尺寸([1,3,50])
#1是批次维度,有三个向量,每个向量的长度为50
对于RNN,接下来可以将该张量输入到RNN模块中,例如

lstm=nn.lstm(输入大小=50,隐藏大小=5,批处理大小=True)
输出,h=lstm(分辨率)
打印(输出.形状)
#=>火炬尺寸([1,3,5])
我也建议你调查一下。它可以自动完成一些你必须手动完成的事情