我在NLP项目中使用Torchtext。我已经在我的系统中使用了预训练的嵌入,我想使用它。因此,我尝试了:
my_field.vocab.load_vectors(my_path)
但是,显然,由于某种原因,这仅接受简短接受的嵌入列表的名称。特别是,我收到此错误:
Got string input vector "my_path", but allowed pretrained vectors are ['charngram.100d', 'fasttext.en.300d', ..., 'glove.6B.300d']
我找到了一些people with similar problems,但是到目前为止,我能找到的解决方案是“更改Torchtext源代码”,我将尽可能避免。
还有其他方法可以用来进行预训练的嵌入吗?可以使用允许使用另一种西班牙文预训练嵌入的解决方案。
某些人似乎认为不清楚我在说什么。因此,如果标题和最后一个问题还不够:“我需要使用在Torchtext中嵌入预训练的西班牙语单词来寻求帮助”。
答案 0 :(得分:1)
事实证明,有一种相对简单的方法可以执行此操作,而无需更改Torchtext的源代码。 Github thread的启发。
1。创建numpy词向量张量
您需要加载嵌入内容,以便最终得到一个尺寸为(number_of_words,word_vector_length)的numpy数组:
my_vecs_array [word_index]应该返回您相应的单词向量。
重要。该数组必须使用Torchtext的单词索引字典(field.vocab.stoi)构建。否则,Torchtext将指向错误的向量!
别忘了转换为张量:
my_vecs_tensor = torch.from_numpy(my_vecs_array)
2。将数组加载到Torchtext
由于下一个步骤,我认为这一步骤并不是真正必要的,但是它允许将Torchtext字段与字典和向量一起放在一个位置。
my_field.vocab.set_vectors(my_field.vocab.stoi, my_vecs_tensor, word_vectors_length)
3。将权重传递给模型
在模型中,您将这样声明嵌入:
my_embedding = toch.nn.Embedding(vocab_len, word_vect_len)
然后您可以使用以下方法加载体重:
my_embedding.weight = torch.nn.Parameter(my_field.vocab.vectors, requires_grad=False)
如果要训练嵌入,请使用require_grad = True;如果要冻结嵌入,请使用False。
编辑:看来another way看起来更简单!改进之处在于,显然您可以在词汇构建步骤中直接传递经过预训练的单词向量,因此这里需要执行步骤1-2。