0

我在 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']

我发现一些人有类似的问题,但到目前为止我能找到的解决方案是“更改 Torchtext 源代码”,如果可能的话,我宁愿避免。

有没有其他方法可以使用我的预训练嵌入?允许使用另一种西班牙语预训练嵌入的解决方案是可以接受的。

有些人似乎认为我不清楚我在问什么。因此,如果标题和最后一个问题还不够:“我需要帮助,在 Torchtext 中使用预训练的西班牙语词嵌入”。

4

1 回答 1

5

事实证明,有一种相对简单的方法可以做到这一点,而无需更改 Torchtext 的源代码。来自这个Github 线程的灵感。

1. 创建 numpy 词向量张量

您需要加载嵌入,以便最终得到一个具有维度(number_of_words,word_vector_length)的 numpy 数组:

my_vecs_array[word_index] 应该返回相应的词向量。

重要的。此数组数组的索引 (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)

如果要训练嵌入,请使用 requires_grad=True,如果要冻结它,请使用 False。

编辑:看起来还有另一种看起来更容易的方法!改进之处在于,显然您可以在词汇构建步骤中直接传递预训练的词向量,这样就可以在此处处理步骤 1-2。

于 2018-09-11T11:22:06.977 回答