pytorch 如何从张量中删除 cuda()

pytorch how to remove cuda() from tensor

我得到了TypeError: expected torch.LongTensor (got torch.cuda.FloatTensor)

如何将 torch.cuda.FloatTensor 转换为 torch.LongTensor

  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/Desktop/squad_vteam/src/model.py", line 131, in update
    loss_adv = self.adversarial_loss(batch, loss, self.network.lexicon_encoder.embedding.weight, y)
  File "/home/Desktop/squad_vteam/src/model.py", line 94, in adversarial_loss
    adv_embedding = torch.LongTensor(adv_embedding)
TypeError: expected torch.LongTensor (got torch.cuda.FloatTensor)

你有一个 float 张量 f 并且想将它转换为 long,你可以 long_tensor = f.long()

你有 cuda 张量,即数据在 gpu 上,想将其移动到 cpu 你可以 cuda_tensor.cpu().

因此,要将 torch.cuda.Float 张量 A 转换为 torch.long,请执行 A.long().cpu()

Pytorch 0.4.0 的最佳实践是编写 device agnostic code: That is, instead of using .cuda() or .cpu() you can simply use .to(torch.device("cpu"))

A = A.to(dtype=torch.long, device=torch.device("cpu"))

请注意 .to() 不是 "in-place" 操作(参见 ),因此您需要将 A.to(...) 赋值回 A .

如果你有一个张量t

t = t.cpu() 

将是旧方法。

t = t.to("cpu")

将是新的 API。