【问题标题】:Use pretrained embedding in Spanish with Torchtext通过 Torchtext 使用西班牙语预训练嵌入
【发布时间】:2019-02-12 22:13:58
【问题描述】:

我在 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 中使用预训练的西班牙语词嵌入”。

【问题讨论】:

    标签: nlp deep-learning pytorch word-embedding torchtext


    【解决方案1】:

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

    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。

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

    【讨论】:

    • 不确定在编写此答案时是否可行,但您也可以使用 Embedding 类方法 from_pretrained 来执行此操作。
    • 我也不确定。我认为使用 from_pretrained 会使最后两个步骤更清晰。感谢您的贡献:)
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2021-11-19
    • 2021-05-04
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多