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

Trouble with nn.embedding in pytorch, expected scalar type Long, but got torch.cuda.FloatTensor (how to fix)?

提问人:skidjoe 提问时间:10/14/2019 最后编辑:greybeardskidjoe 更新时间:7/15/2021 访问量:6721

问:

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

作为我的 rnn 类的一部分,我有以下内容:__init__

self.encode_this = nn.Embedding(self.vocab_size, self.embedded_vocab_dim)

现在我正在尝试实现一个正向类,它接受批量并执行编码然后解码,

def f_calc(self, batch):
    #Here, batch.shape[0] is the size of batch while batch.shape[1] is the sequence length

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

    o1, h = self.encode_this(embedded_states)

但是,我的问题总是出在编码器上,它给了我以下错误:

/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 完全陌生,所以如果这是一个愚蠢的问题,请原谅我。我知道涉及某种形式的类型铸造,但我不确定如何去做......

非常感谢!

python pytorch 循环神经网络

评论


答:

4赞 Alexey Golyshev 10/14/2019 #1

嵌入层需要输入端的整数。

import torch as t

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

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

enter image description here

添加代码:long()

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

评论

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