本篇博客参考文章:
通俗讲解pytorch中nn.Embedding原理及使用

embedding

词嵌入,通俗来讲就是将文字转换为一串数字。因为数字是计算机更容易识别的一种表达形式。

我们词嵌入的过程,就相当于是我们在给计算机制造出一本字典的过程。计算机可以通过这个字典来间接地识别文字。

词嵌入向量的意思也可以理解成:词在神经网络中的向量表示。

详细可看嵌入(embedding)层的理解

pytorch中的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)

参数

  • num_embeddings(int):词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999)
  • embedding_dim(int):嵌入向量的维度,即用多少维来表示一个符号。
  • padding_idx(int,optional):填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)
  • max_norm(float,optional):最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。
  • norm_type(float,optional):指定利用什么范数计算,并用于对比max_norm,默认为2范数。
  • scale_grad_by_freq(boolean ,可选):根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.
  • sparse(bool,可选):若为True,则与权重矩阵相关的梯度转变为稀疏张量,默认为False。

使用例子

import torch
import numpy as np

#建立词向量层,词数为13,嵌入向量维数设为3
embed = torch.nn.Embedding(13,3)
#句子对[\'I am a boy.\',\'How are you?\',\'I am very lucky.\']
#batch = [[\'i\',\'am\',\'a\',\'boy\',\'.\'],[\'i\',\'am\',\'very\',\'lucky\',\'.\'],[\'how\',\'are\',\'you\',\'?\']]

#将batch中的单词词典化,用index表示每个词(先按照这几个此创建词典)
#batch = [[2,3,4,5,6],[2,3,7,8,6],[9,10,11,12]]

#每个句子实际长度
#lens = [5,5,4]

#加上EOS标志且index=0
#batch = [[2,3,4,5,6,0],[2,3,7,8,6,0],[9,10,11,12,0]]

#每个句子实际长度(末端加上EOS)
lens = [6,6,5]

#PAD过后,PAD标识的index=1
batch = [[2,3,4,5,6,0],[2,3,7,8,6,0],[9,10,11,12,0,1]]

#RNN的每一步要输入每个样例的一个单词,一次输入batch_size个样例
#所以batch要按list外层是时间步数(即序列长度),list内层是batch_size排列。
#即[seq_len,batch_size]
batch = np.transpose(batch)

batch=torch.LongTensor(batch)

embed_batch = embed(batch)

print(embed_batch)
tensor([[[ 0.4582,  0.1676,  0.4495],
         [ 0.4582,  0.1676,  0.4495],
         [ 0.0691, -0.4414, -1.1965]],

        [[-1.0109,  0.7178,  0.0478],
         [-1.0109,  0.7178,  0.0478],
         [ 1.0389, -0.1143,  0.9865]],

        [[ 0.4041,  0.8421, -1.1829],
         [-0.6804,  1.7318,  0.4238],
         [-0.3201, -0.5068,  0.0071]],

        [[ 0.1110, -0.0441, -0.3261],
         [-0.1142, -2.5226,  0.6788],
         [ 0.2379,  1.5004,  0.4553]],

        [[ 1.8359, -1.2531,  1.2757],
         [ 1.8359, -1.2531,  1.2757],
         [-1.4669,  0.1150, -0.7636]],

        [[-1.4669,  0.1150, -0.7636],
         [-1.4669,  0.1150, -0.7636],
         [-1.9697,  0.3393,  0.0089]]], grad_fn=<EmbeddingBackward>)

版权声明:本文为ryukirin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ryukirin/p/14612795.html