RuntimeError:输入类型(torch.FloatTensor)和权重类型(torch.cuda.FloatTensor)应该相同

新手上路,请多包涵

这个:

 device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

for data in dataloader:
    inputs, labels = data
    outputs = model(inputs)

给出错误:

RuntimeError:输入类型(torch.FloatTensor)和权重类型(torch.cuda.FloatTensor)应该相同

原文由 Guillermina 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 802
2 个回答

你得到这个错误是因为你的模型在 GPU 上,但你的数据在 CPU 上。因此,您需要将输入张量发送到 GPU。

 inputs, labels = data                         # this is what you had
inputs, labels = inputs.cuda(), labels.cuda() # add this line

或者像这样,与您的其余代码保持一致:

 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

inputs, labels = inputs.to(device), labels.to(device)

如果您的输入张量在 GPU 上但您的模型权重不在,则会引发 相同的错误。在这种情况下,您需要将模型权重发送到 GPU。

 model = MyModel()

if torch.cuda.is_available():
    model.cuda()

请参阅 cuda() 及其相反的文档 cpu()

原文由 Nicolas Gervais 发布,翻译遵循 CC BY-SA 4.0 许可协议

新的 API 是使用 .to() 方法。

优势很明显,也很重要。您的设备明天可能不是“cuda”:

  • 中央处理器
  • 库达
  • 马克林
  • opengl
  • 打开CL
  • 深渊
  • 时髦的
  • msnpu
  • xla

所以尽量避免 model.cuda() 检查设备没有错

dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

或者对其进行硬编码:

 dev=torch.device("cuda")

如同:

 dev="cuda"

一般来说,您可以使用此代码:

 model.to(dev)
data = data.to(dev)

原文由 prosti 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题