原文:https://blog.csdn.net/foneone/article/details/103881687
官网:https://pytorch.org/docs/stable/nn.html#embedding
torch.nn.
Embedding
(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None)
torch.nn.Embedding 模块可以看做一个字典,字典中每个索引对应一个词和词的embedding形式。利用这个模块,可以给词做embedding的初始化操作。
模块中主要参数:
num_embeddings :字典中词的个数
embedding_dim:embedding的维度
padding_idx(索引指定填充):如果给定,则遇到padding_idx中的索引,则将其位置填0(0是默认值)。
大小说明:
input:(∗) , LongTensor 结构
output:(*,e):*是input的大小,e是embedding_dim,即每个词的embedding的维度
注:embeddings中的值是正态分布N(0,1)中随机取值。
例子:
import torch
import torch.nn as nn
x = torch.LongTensor([[1,2,4],[4,3,2]])
embeddings = nn.Embedding(5,5,padding_idx=4) #5个词,每个词也是5维
print(embeddings(x))
print(embeddings(x).size())
output:
tensor([[[ 0.8839, -1.2889, 0.0697, -0.9998, -0.7471],
[-0.5681, 0.8486, 0.8176, 0.8349, 0.1719],
[ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]], ->index=4 赋值 0
[[ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], ->index=4 赋值 0
[ 1.4224, 0.2333, 1.9383, -0.7320, 0.9987],
[-0.5681, 0.8486, 0.8176, 0.8349, 0.1719]]],
grad_fn=<EmbeddingBackward>)
torch.Size([2, 3, 5])
embedding方法获取的向量只是随机初始化的,并不代表任何含义,并且不会有word2vec等训练出来的效果。但是可以利用这样的方法先赋值然后在学习。
总结一下一般任务中的流程:
首先将单词转成字典的形式,由于英语中以空格为词的分割,所以可以直接建立词典索引结构。类似于:dic={'i':1,'like':2,'you':3,'want':4,'an':5,'apple':6}这样的形式。如果是中文的话,首先进行分词操作。
然后在以句子为list,为每个句子建立索引结构,list[[sentence1],[sentence2]]。以上面字典的索引来说,最终建立的就是[[1,2,3],[1,4,5,6]]。这样长短不一的句子。
接下来要进行padding的操作。由于tensor结构中都是等长的,所以要对上面那样的句子做padding操作后再利用nn.Embedding来进行词的初始化。padding后的可能是这样的结构[[1,2,3,0],[1,4,5,6]]。其中0作为填充。(注意:由于在NMT任务中肯定存在着填充问题,所以在embedding时一定存在着第三个参数,让某些索引为下的值为0,代表无实际意义的填充)