Pytorch中使用Embedding报错'IndexError'的解决方法

发布时间 2023-08-16 10:57:29作者: 绘守辛玥

简介

  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-6num_embeddings 则应当设为7。

参考来源: