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

问题描述 投票:0回答:1

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

数据集很庞大(140万行),我正在Google Colab上进行培训。只需要15分钟即可完成500行数据集。

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

还有什么想法我应该怎么做才能丢失那些不在Glove载体中的单词?它们将如何嵌入?

关于加快它的任何其他想法将不胜感激。

编辑:基于@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'
nlp pytorch
1个回答
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层必须是可训练的,以便在训练过程中通过参数更新来学习那些随机初始化的张量。

编辑:添加了示例

© www.soinside.com 2019 - 2024. All rights reserved.