【问题标题】:Why doesn't my simple pytorch network work on GPU device?为什么我的简单 pytorch 网络不能在 GPU 设备上运行?
【发布时间】:2019-01-07 09:47:42
【问题描述】:

我根据教程构建了一个简单的网络,但出现此错误:

RuntimeError:预期的类型为 torch.cuda.FloatTensor 的对象,但已找到 为参数 #4 'mat1' 输入 torch.FloatTensor

有什么帮助吗?谢谢!

import torch
import torchvision

device = torch.device("cuda:0")
root = '.data/'

dataset = torchvision.datasets.MNIST(root, transform=torchvision.transforms.ToTensor(), download=True)

dataloader = torch.utils.data.DataLoader(dataset, batch_size=4)


class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.out = torch.nn.Linear(28*28, 10)

    def forward(self, x):
        x = x.view(x.size(0), -1)
        x = self.out(x)
        return x

net = Net()
net.to(device)

for i, (inputs, labels) in enumerate(dataloader):
    inputs.to(device)
    out = net(inputs)

【问题讨论】:

  • 这个问题是关于 PyTorch,而不是 CUDA。这就是我删除标签的原因。两次。请不要再添加了

标签: python image-processing machine-learning deep-learning pytorch


【解决方案1】:

TL;DR
这是解决方法

inputs = inputs.to(device)  

为什么?!
torch.nn.Module.to()torch.Tensor.to() 之间存在细微差别:Module.to()就地 运算符,Tensor.to() 不是。因此

net.to(device)

更改net 本身并将其移动到device。另一方面

inputs.to(device)

不更改inputs,而是返回inputs副本,该inputs 位于device。要使用该“设备上”副本,您需要将其分配给一个变量,因此

inputs = inputs.to(device)

【讨论】:

  • 有效!太感谢了!我花了几个小时寻找答案。
  • @Harkonnen 很高兴我能提供帮助。在阅读 pytorch 文档时,您应该注意“就地”操作:有些方法是就地的,有些不是,有些方法具有“就地”变体......
  • 我有这个错误,因为我没有设置我的GPU设备,为:device = torch.device('cuda')
【解决方案2】:
import torch
import numpy as np

x = torch.tensor(np.array(1), device='cuda:0')

print(x.device)  # Prints `cpu`

x = torch.tensor(1, device='cuda:0')

print(x.device)  # Prints `cuda:0`

现在张量驻留在 GPU 上

【讨论】:

  • 你想从答案中说什么不清楚。请您解释为什么使用 numpy 没有将张量推送到 cuda
猜你喜欢
  • 2021-11-16
  • 2019-02-26
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多