我有一个文本分类模型,它通过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'
创建所需单词的词汇表,使每个单词在词汇表中获得唯一索引。将嵌入物加载为火炬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
层必须是可训练的,以便在训练过程中通过参数更新来学习那些随机初始化的张量。
编辑:添加了示例