nn.Embedding

在使用nn.Embedding的时候最容易出现IndexError: index out of range in self错误,原因在于tensor中的值越界了。

官方解释中:

num_embeddings (int) – size of the dictionary of embeddings
embedding_dim (int) – the size of each embedding vector

上述num_embeddings值通常是输入的数量值,因为输入通常从0开始编码,比如编码到0-499,那么一共是500个数,因此num_embeddings=500,可以保证一定不会越界。

但是实际上,num_embeddings是1000也可以的,关键在于输入中的值不要超过num_embeddings这个值即可。因此如果只有500个数,但是输入值并不是从0-499编码,其中如果一旦有值超过了499,那么也会报错。

以及注意,输入的tensor必须是整型(long,int)

例子:

import torch.nn as nn
import torch

user_embeddings = nn.Embedding(11, 50)
print(user_embeddings.num_embeddings)  # num_embeddings=11

a = torch.Tensor([10,10,10,10]).long()
print(a.min())  # 10
print(a.max())  # 10

u_embs = user_embeddings(a)

上述输入的最大值和最小值都没有超过num_embeddings,是可以的;但是如果将num_embeddings改为10,就会报错。

另一个例子:

user_embeddings = nn.Embedding(2, 50)
print(user_embeddings.num_embeddings)  # num_embeddings=2

a = torch.ones([10,10,10,10]).long()
print(a.min())  # 1
print(a.max())  # 1

u_embs = user_embeddings(a)

上述可以发现,将num_embeddings改为2,输入的最大值和最小值为1,同样没有超过,也是可以的。

所以,注意num_embeddings限制的是输入量中的值,而不是输入的维度大小。

参考:

  1. pytorch官方nn.Embedding文档(Docs > torch.nn > Embedding):https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html?highlight=nn%20embedding#torch.nn.Embedding
  2. pytorch embedding层报错IndexError: index out of range in self:https://blog.csdn.net/weixin_36488653/article/details/118485063
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于flask+LSTM实现AI写诗源码+部署说明+保姆级代码注释.zip 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 实现细节 1. data是numpy数组,57580首*125字 2. word2ix和ix2word都是字典类型,用于字符和序号的映射 3. nn.Embedding层可以输入为long Tensor型的字的下标(int),输入为同样shape的词向量,下标换成了向量,其余形状不变。最重要的构造参数是num_embeddings, embedding_dim 4. nn.LSTM主要构造参数input_size,hidden_size和num_layers,其中input_size其实就是词向量的维度,forward时输入为input和(h0,c0),其中input为(seq_len,batch_size,input_size),h0和c0是(num_layers $*$ num_directions, batch, hidden_size),而forward的输出为output和(hn,cn),一般后面一个就叫做hidden,output为(seq_len, batch, num_directions $*$ hidden_size) 5. 在本网络中,从前往后总共经历了这么几个网络,其向量变化如下: - input:(seq_len,batch_size) - 经过embedding层,embeddings(input) - embeds:(seq_len,batch_size,embedding_size) - 经过LSTM,lstm(embeds, (h_0, c_0)),输出output,hidden - output:(seq_len, batch, num_directions $*$ hidden_size) - output view为(seq_len $*$ batch, num_directions $*$ hidden_size) - 进过Linear层判别 - output:(seq_len $*$ batch, vocab_size) 6. 具体训练时的实现方法: - 输入的input为(batch_size,seq_len) - data_ = data_.long().transpose(1,0).contiguous()将数据转置并且复制了一份,成了(seq_len,batch_size) - 通过input_,target = data_[:-1,:],data_[1:,:]将每句话分为前n-1个字作为真正的输入,后n-1个字作为label,size都是(seq_len-1,batch_size) - 经过网络,得出output:((seq_len-1) $*$ batch, vocab_size) - 通过target.view(-1)将target变成((seq_len-1) $*$ batch) - 这里的target不需要是一个one-hot向量,因crossEntropy不需要,直接是下标即可 - 然后反向传播即可 7. 生成诗句的方法: - 首字为<START>,首个hidden自动为空 - 如果有前缀风格,通过前缀生成hidden - 在首句内部时,不使用output,仅仅不断前进得到hidden,直到首句结尾。 - 进入生成模式后,实际上每次调用model都生成一个字,逐渐生成前n句话。 - 藏头诗同理,只是在头的部分将诗句首字换掉 ### 使用方法 首先训练模型,然后运行app.py,访问。当然也可以直接执行app.py,使用预训练内容。 ```python python main.py ``` ```python python app.py ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值