使用预先训练的词嵌入会在Pytorch中加速模型训练吗?另外,如果数据集中的某些单词不在嵌入中怎么办?

时间:2019-04-12 04:39:52

标签: nlp pytorch

我有一个文本分类模型,该模型通过GRU传递单词嵌入,并将该GRU的输出传递给ANN,该ANN提供一类作为输出。

数据集巨大(140万行),我正在Google Colab上对其进行训练。仅需15分钟即可浏览数据集的500行。

因此,为了加快训练速度,我决定使用预先训练的Glove向量,而不是Pytorch提供的随机嵌入。我该如何实现?

关于丢失不在手套矢量中的单词,我该怎么办?它们将如何嵌入?

任何其他关于加速它的想法都会受到赞赏。

编辑: 基于@scarecrow的代码请求。 我用来将嵌入转换为浮点张量的代码:

print(f'First embedding: {embeddings[0]}')
print(f'The dimensions of the embeddings are: {len(embeddings[0])}')
embed = torch.FloatTensor([embeddings[0], embeddings[1]])

这仅是示例。我认为最好显示出哪个代码块给出了错误。

我得到的错误是:

First embedding: ['0.418', '0.24968', '-0.41242', '0.1217', '0.34527', '-0.044457', '-0.49688', '-0.17862', '-0.00066023', '-0.6566', '0.27843', '-0.14767', '-0.55677', '0.14658', '-0.0095095', '0.011658', '0.10204', '-0.12792', '-0.8443', '-0.12181', '-0.016801', '-0.33279', '-0.1552', '-0.23131', '-0.19181', '-1.8823', '-0.76746', '0.099051', '-0.42125', '-0.19526', '4.0071', '-0.18594', '-0.52287', '-0.31681', '0.00059213', '0.0074449', '0.17778', '-0.15897', '0.012041', '-0.054223', '-0.29871', '-0.15749', '-0.34758', '-0.045637', '-0.44251', '0.18785', '0.0027849', '-0.18411', '-0.11514', '-0.78581']
The dimensions of the embeddings are: 50
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-59-f8951bd3f739> in <module>()
      1 print(f'First embedding: {embeddings[0]}')
      2 print(f'The dimensions of the embeddings are: {len(embeddings[0])}')
----> 3 embed = torch.FloatTensor([embeddings[0], embeddings[1]])

ValueError: too many dimensions 'str'

1 个答案:

答案 0 :(得分:0)

为您需要的所有单词创建词汇表,以便每个单词在词汇表中获得唯一索引。将嵌入物作为手电筒Tensor加载,并按如下所示加载嵌入物:docs

>>> embedding_weights = torch.FloatTensor([[0.3, 0.6, 0.1], [0.2, 0.5, 0.3]])
>>> embedding = torch.nn.Embedding.from_pretrained(embedding_weights)
>>> embedding(torch.tensor([1]))
tensor([[0.2000, 0.5000, 0.3000]])
>>> 

说,如果单词“ hello”对应于词汇表中的索引2,则embedding_weights[2]应该包含相应的GloVe向量。

如果要适应Glove中丢失的单词,可以将这些单词添加到训练集中的词汇表中,并通过为它们分配随机张量将其添加到embedding_weights张量中。 Embedding层必须是可训练的,以便在训练过程中通过参数更新来学习那些随机初始化的张量。

编辑:添加了示例