【问题标题】:Pytorch embedding RuntimeError: Expected object of type torch.LongTensor but found type torch.cuda.LongTensor for argument #3 'index'Pytorch 嵌入 RuntimeError:预期为 torch.LongTensor 类型的对象,但为参数 #3 'index' 找到了类型 torch.cuda.LongTensor
【发布时间】:2019-01-11 20:32:27
【问题描述】:

我收到这个错误提示

RuntimeError: Expected object of type torch.LongTensor but found type torch.cuda.LongTensor for argument #3 'index'

但是argument #3 "index" 是什么意思?我在torch.embedding 中找不到“index”参数(此处来源:https://pytorch.org/docs/stable/_modules/torch/nn/modules/sparse.html#Embedding) 好像我正在传递嵌入错误的参数。

我什至像下面这样更改了输入的数据类型,但错误仍然存​​在。

batch['doc_tok'] = batch['doc_tok'].long()
batch['query_tok'] = batch['query_tok'].long()

任何评论(即使很短!)或仅列出要查看的关键字都将受到高度赞赏!


这是一个完整的回溯。

Traceback (most recent call last):
  File "train_v2.py", line 110, in <module>
    main()
  File "train_v2.py", line 81, in main
    model.update(batch)
  File "/home/aerin/Desktop/squad_vteam/src/model.py", line 129, in update
    loss_adv = self.adversarial_loss(batch, loss, self.network.lexicon_encoder.embedding.weight, y)
  File "/home/aerin/Desktop/squad_vteam/src/model.py", line 104, in adversarial_loss
    start, end, _ = self.network(batch)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/module.py", line 491, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/aerin/Desktop/squad_vteam/src/dreader.py", line 78, in forward
    doc_mask, query_mask = self.lexicon_encoder(batch)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/module.py", line 491, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/aerin/Desktop/squad_vteam/src/encoder.py", line 116, in forward
    doc_emb, query_emb = emb(doc_tok), emb(query_tok)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/module.py", line 491, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/modules/sparse.py", line 108, in forward
    self.norm_type, self.scale_grad_by_freq, self.sparse)
  File "/home/aerin/anaconda3/envs/san/lib/python3.6/site-packages/torch/nn/functional.py", line 1076, in embedding
    return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)
RuntimeError: Expected object of type torch.LongTensor but found type torch.cuda.LongTensor for argument #3 'index'

更新:我什至将整个 model.network 发送到 cpu,但仍然遇到同样的错误。

batch['doc_tok']=batch['doc_tok'].long().cpu()
batch['query_tok']=batch['query_tok'].long().cpu()
self.network.cpu()

print(batch['doc_tok'].dtype,  batch['query_tok'].dtype) # They are both torch.int64 torch.int64

start, end, _ = self.network(batch)

在这一点上,我怀疑这可能是一个错误......

model.py 代码:https://github.com/byorxyz/san_mrc/blob/master/src/model.py

网络定义:https://github.com/byorxyz/san_mrc/blob/master/src/dreader.py

【问题讨论】:

标签: python typeerror pytorch word-embedding


【解决方案1】:

在我看来,您的输入/目标张量(batch['doc_tok'] 等)和您的网络及其变量(我相信 indexEmbedding 层的内部张量)在不同的设备上(CPU 用于你的数据,你的模型的 GPU?)。

如果您希望一切都在 GPU 上运行,您需要同时满足以下条件:

  • 在那里加载您的数据,例如batch['doc_tok'].cuda()
  • 在那里加载您的模型,例如model.network.cuda()

如果你想在 CPU 上运行,也一样,替换为 .cpu()

【讨论】:

  • 非常感谢您的评论!我什至按照您的建议使用 model.network.cpu() 将整个模型发送到 cpu,但仍然出现相同的错误。在这一点上我认为这是 pytorch 中的一个错误。
  • 你知道参数#3“索引”是什么意思吗?
  • 可能是嵌入矩阵的一些索引张量,虽然我不知道Embedding 的确切实现。让我们希望您在 pytorch 论坛上的问题获得更多成功 - 否则也许可以尝试分享您构建模型的行?祝你好运!
  • 感谢您的回复!我按照你的建议分享了这个问题的代码。 (如果你有时间看看......)
【解决方案2】:

试试这个:

batch['doc_tok']=batch['doc_tok'].long().cpu()
batch['query_tok']=batch['query_tok'].long().cpu()

【讨论】:

  • 谢谢!我刚刚尝试过,但我仍然遇到同样的错误。
猜你喜欢
  • 2018-12-29
  • 2020-02-29
  • 2018-12-07
  • 2018-08-30
  • 1970-01-01
  • 2021-02-14
  • 2020-05-31
  • 1970-01-01
  • 2021-09-16
相关资源
最近更新 更多