pytorch embedding层报错index out of range in self

在使用 PyTorch 的 Embedding 层时,遇到`index out of range in self`错误。问题源于输入数据未经词典映射,导致数值超出了有效范围[0, num_embeddings-1]。通过检查张量的最小值和最大值,修正超出范围的数值,可以避免此错误。提供了一个修正后的正确使用embedding层的示例。" 132134546,11389520,Python实现心电信号时域特征分析,"['Python', '开发语言', '数据分析', '生物医学信号处理', '心电图分析']

使用pytorch时,数据过embedding层时报错:

Traceback (most recent call last):
  File "C:/Users/gaosiqi/PycharmProjects/DeepFM/main.py", line 68, in <module>
    out = model(train_data)
  File "C:\Anaconda3\envs\tensorflow\lib\site-packages\torch\nn\modules\module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "C:/Users/gaosiqi/PycharmProjects/DeepFM/main.py", line 26, in forward
    embedding = self.word_embedding(x)
  File "C:\Anaconda3\envs\tensorflow\lib\site-packages\torch\nn\modules\module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "C:\Anaconda3\envs\tensorflow\lib\site-packages\torch\nn\modules\sparse.py", line 126, in forward
    self.norm_type, self.scale_grad_by_freq, self.sparse)
  File "C:\Anaconda3\envs\tensorflow\lib\site-packages\torch\nn\functional.py", line 1814, in embedding
    return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
IndexError: index out of range in self

原因是输入进embedding层的数据并不是经过词典映射的,而是原始数据,因此张量内部有超出embedding层合法范围的数。

embedding层需检查张量内部具体值的大小,并确保它们的值在有效范围内[0, num_embeddings-1]。例如此次出错就是张量内最大值是30000+,最小是-2,因此这两种过大和过小的值就引起问题。

再例如:

train_data = [[1,-1,1,1,2,2,2,3,4,23,2,3,1,2,2,2],
			[4,3,2,5,3,2,8,9,3,66,7,7,4,3,2,3]]

print(train_data.max())  #(已转变为张量后)
print(train_data.min())

来检查张量内部的最大最小值
在这里插入图片描述
此时会报错:
在这里插入图片描述
如果我们将大于num_embeddings和小于0的值都改掉看看:

train_data = [[1,1,1,1,2,2,2,3,4,2,2,3,1,2,2,2],
              [4,3,2,5,3,2,8,9,3,6,7,7,4,3,2,3]]

此时就顺利经过了embedding层,并且得到了嵌入层的结果:
在这里插入图片描述

正确使用embedding层示例:

from collections import Counter
import torch.nn as nn

# Let's say you have 2 sentences(lowercased, punctuations removed) :
sentences = "i am new to PyTorch i am having fun"
words = sentences.split(' ')

vocab = Counter(words)  # create a dictionary
vocab = sorted(vocab, key=vocab.get, reverse=True)
vocab_size = len(vocab)

# map words to unique indices
word2idx = {word: ind for ind, word in enumerate(vocab)}

# word2idx = {'i': 0, 'am': 1, 'new': 2, 'to': 3, 'pytorch': 4, 'having': 5, 'fun': 6}

encoded_sentences = [word2idx[word] for word in words]

# encoded_sentences = [0, 1, 2, 3, 4, 0, 1, 5, 6]
print(encoded_sentences)
# let's say you want embedding dimension to be 3
emb_dim = 3 
torch.nn.Embedding函数是PyTorch中用于实现词嵌入的函数。它的参数包括num_embeddings(表示词汇表的大小)、embedding_dim(表示每个词嵌入的维度)等等。\[1\] 关于"index out of range in self"的错误,可能是因为你传入的索引超出了词汇表的范围。在使用nn.Embedding函数时,需要确保传入的索引值在num_embeddings的范围内。\[2\]例如,如果你的词汇表大小为4,那么传入的索引值应该在0到3之间。如果传入的索引超出了这个范围,就会出现"index out of range in self"的错误提示。 另外,需要注意的是,nn.Embedding函数的输入值应该是整数类型的张量。如果你传入的是浮点数类型的张量,也会导致出现"index out of range in self"的错误。\[3\] 因此,要解决这个错误,你需要检查传入nn.Embedding函数的索引值是否在合理的范围内,并且确保传入的是整数类型的张量。 #### 引用[.reference_title] - *1* *3* [关于torch.nn.Embedding需要注意的几点](https://blog.csdn.net/weixin_42670810/article/details/115264280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [nn.embedding报错index out of range in self详解](https://blog.csdn.net/weixin_42912710/article/details/114479862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值