关于nn.embedding的理解

import torch.nn as nn
nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)

参数解释

num_embeddings (python:int) – 词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999)

embedding_dim (python:int) – 嵌入向量的维度,即用多少维来表示一个符号。

padding_idx (python:int, optional) – 填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)

max_norm (python:float, optional) – 最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。

norm_type (python:float, optional) – 指定利用什么范数计算,并用于对比max_norm,默认为2范数。

scale_grad_by_freq (boolean, optional) – 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.

sparse (bool, optional) – 若为True,则与权重矩阵相关的梯度转变为稀疏张量。


在PyTorch中,针对词向量有一个专门的层nn.Embedding,用来实现词与词向量的映射。nn.Embedding具有一个权重(.weight),形状是(num_words, embedding_dim)。例如一共有10个词,每个词用2维向量表征,对应的权重就是一个10×2的矩阵。

Embedding的输入形状N×W,N是batch size,W是序列的长度,输出的形状是N×W×embedding_dim。
输入必须是LongTensor,FloatTensor需通过tensor.long()方法转成LongTensor。Embedding的权重是可以训练的,既可以采用随机初始化,也可以采用预训练好的词向量初始化。

给个例子

embedding = nn.Embedding(5, 3)  # 定义一个具有5个单词,维度为3的查询矩阵
print(embedding.weight)  # 展示该矩阵的具体内容
test = torch.LongTensor([[0, 2, 0, 1],
                         [1, 3, 4, 4]])  # 该test矩阵用于被embed,其size为[2, 4]
print(test)
# 其中的第一行为[0, 2, 0, 1],表示获取查询矩阵中ID为0, 2, 0, 1的查询向量
# 可以在之后的test输出中与embed的输出进行比较
test = embedding(test)
print(test.size())  # 输出embed后test的size,为[2, 4, 3],增加的3,是因为查询向量的维度为3
print(test)  # 输出embed后的test的内容

结果
关于nn.embedding的理解_第1张图片

你可能感兴趣的:(读研之路,python,pytorch)