Python pytorch中的nn.Embedded存在问题,预期标量类型为Long,但得到torch.cuda.FloatTensor(如何修复)?

Python pytorch中的nn.Embedded存在问题,预期标量类型为Long,但得到torch.cuda.FloatTensor(如何修复)?,python,pytorch,recurrent-neural-network,Python,Pytorch,Recurrent Neural Network,所以我有一个RNN编码器,它是一个更大的语言模型的一部分,其中的过程是encode->RNN->decode 作为我的rnn类的\uuuuu init\uuuu的一部分,我有以下内容: self.encode\u this=nn.Embedding(self.vocab\u size,self.embedded\u vocab\u dim) 现在我正在尝试实现一个forward类,它分批接收并执行编码然后解码 def f_计算(自身,批次): #这里,batch.shape[0]是批次的大小,

所以我有一个RNN编码器,它是一个更大的语言模型的一部分,其中的过程是encode->RNN->decode

作为我的rnn类的
\uuuuu init\uuuu
的一部分,我有以下内容:

self.encode\u this=nn.Embedding(self.vocab\u size,self.embedded\u vocab\u dim)
现在我正在尝试实现一个forward类,它分批接收并执行编码然后解码

def f_计算(自身,批次):
#这里,batch.shape[0]是批次的大小,batch.shape[1]是序列长度
隐藏状态=(torch.zero(self.num\u layers,batch.shape[0],self.hidden\u vocab\u dim).to(设备))
嵌入状态=(torch.zero(batch.shape[0],batch.shape[1],self.embedded\u vocab\u dim).to(设备))
o1,h=自身。对其进行编码(嵌入状态)
但是,我的问题总是与编码器有关,这给了我以下错误:

/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
   1465         # remove once script supports set_grad_enabled
   1466         _no_grad_embedding_renorm_(weight, input, max_norm, norm_type)
-> 1467     return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
   1468 
   1469 

RuntimeError: Expected tensor for argument #1 'indices' to have scalar type Long; but got torch.cuda.FloatTensor instead (while checking arguments for embedding)
有人知道怎么修理吗?我是pytorch的新手,如果这是一个愚蠢的问题,请原谅。我知道有一些形式的类型铸造涉及,但我不知道如何去做它


非常感谢

嵌入层需要输入整数

import torch as t

emb = t.nn.Embedding(embedding_dim=3, num_embeddings=26)

emb(t.LongTensor([0,1,2]))

在代码中添加
long()

embedded_states = (torch.zeros(batch.shape[0],batch.shape[1], self.embedded_vocab_dim).to(device)).long()

嵌入层需要输入整数

import torch as t

emb = t.nn.Embedding(embedding_dim=3, num_embeddings=26)

emb(t.LongTensor([0,1,2]))

在代码中添加
long()

embedded_states = (torch.zeros(batch.shape[0],batch.shape[1], self.embedded_vocab_dim).to(device)).long()

当我这样做并通过我的rnn,self.rnn(嵌入式_状态)传递它时,一个全新的维度被添加。。。所以张量变成4d而不是3d,你知道为什么会这样吗?因为你做了嵌入:你用嵌入替换最后一个维度的整数!换句话说,你用一个向量替换数字(标量)并增加一个额外的维度。嗯,你知道如何保持它的三维性吗?我一直在尝试挤压法,但似乎不起作用。我的RNN的输入是3D而不是4D。。。我应该传递3D嵌入和隐藏状态,对吗?还是我完全错了?不知道你的想法很难说。你可以看到我的代码。我正在做角色嵌入。输入时,我有[句子、单词、字符]。我用嵌入来表示每个字符(现在我有[句子,单词,字符,嵌入]然后使用LSTM得到单词的嵌入。然后对单词应用LSTM来解决分类问题。我的输入是N*L的形式,其中N是批量大小,L是序列长度,我的输出是N*L*V,其中V是词汇大小(每个单词的嵌入)…现在我对嵌入状态的初始化是零的3d向量(批量大小、序列长度、嵌入的尺寸),但现在当我运行nn.embedding时,我得到了一个完整的额外维度,当我这样做时,我将它传递给我的rnn,self.rnn(嵌入的状态)一个全新的维度被添加…因此张量变成4d而不是3d,你知道为什么会发生这种情况吗?因为你做嵌入:你用嵌入替换上一维度中的整数!换句话说,你替换数字(标量)用一个向量加上一个额外的维度。嗯,你知道如何保持它的3D吗?我一直在尝试挤压方法,但它似乎不起作用。我的RNN的输入是3D而不是4D…我应该传递3D嵌入和隐藏状态,对吗?或者我完全做错了吗?不知道你的想法很难说。Y你可以看到我的代码。我正在进行字符嵌入。在输入时,我有[句子、单词、字符]。我用它的嵌入来表示每个字符(现在我有[句子、单词、字符、嵌入]然后使用LSTM得到单词的嵌入。然后对单词应用LSTM来解决分类问题。我的输入是N*L的形式,其中N是批量大小,L是序列长度,我的输出是N*L*V,其中V是词汇大小(每个单词的嵌入)…现在我对嵌入状态的初始化是零的3d向量(批量大小、序列长度、嵌入的维数),但现在当我运行nn.embedding时,我得到了一个完整的额外维数