简介
Pytorch中nn.Embedding
为针对词向量的层,其用来实现词与词向量的映射。其调用形式如下
nn.Embedding(
num_embeddings: int, embedding_dim: int, padding_idx: int | None = None,
max_norm: float | None = None, norm_type: float = 2., scale_grad_by_freq: bool = False,
sparse: bool = False
)
参数解释
num_embeddings: 词典大小尺寸,类型为int,代表输入词的大小
embedding_dim: 每个词创建多少维度用于表示,类型为int
padding_idx: 句子不一样长时,后面所需的填充id
max_norm: 最大范数,如果词维度超过该范数便需要归一化
norm_type: 利用(默认:2)范数计算
scale_grad_by_freq: 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.
sparse: 若为True,则与权重矩阵相关的梯度转变为稀疏张量。
问题描述
在使用nn.Embedding
时报错 IndexError: index out of range in self,具体如下图:
报错含义为索引超出界限,错误原因可由以下例子来说明。
解决方法
import torch
from torch import nn
embedding = nn.Embedding(4, 1)
word = [
[1, 2, 3, 2],
[2, 3, 4, 1]
]
embed = embedding(torch.LongTensor(word))
print(embed)
在该例中,Embedding
的参数含义为:词的数目为4个,将每个词映射为长度为1的向量;word
为语句的标签编码。可以看到语句中有 "1", "2", "3", "4" 4种词,按照上述描述,词的数目就应该为4,但该程序却抛出上图的报错。将程序更改为下述则便不会报错。
import torch
from torch import nn
embedding = nn.Embedding(5, 1)
word = [
[1, 2, 3, 2],
[2, 3, 4, 1]
]
embed = embedding(torch.LongTensor(word))
print(embed)
为什么词的数目要比句子中数目多一个?是因为在Embedding层中,num_embeddings 可以理解为”索引的尺寸“,即当语句中出现”4“时,其索引应当为0-4,则其大小应为5,即 num_embeddings 应至少设置为5,又如下例:
import torch
from torch import nn
embedding = nn.Embedding(7, 1)
word = [
[1, 2, 3, 2],
[2, 3, 6, 1]
]
embed = embedding(torch.LongTensor(word))
print(embed)
语句中有索引“6”,则其应当为0-6,num_embeddings 则应当设为7。
参考来源:
标签:IndexError,embedding,nn,torch,Pytorch,报错,Embedding,import,word From: https://www.cnblogs.com/ToryRegulus/p/17633208.html