RuntimeError: expected device cuda:0 and dtype Long but got device cpu and dtype Long报错解决

存储在不同位置中的数据是不可以直接进行计算的。即存放在CPU上的数据不可以直接与存放在GPU上的数据进行运算,位于不同GPU上的数据也是不能直接进行计算的。
执行如下代码:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1, 2, 3], device=device)
y = x**2

z = y + x.cpu()

就会出现报错
在这里插入图片描述
检查数据的存储是否在同一位置
补充:
(1).cpu()操作是将GPU上的Tensor转换(复制)到CPU上(因为一开始x放在GPU中)。
(2)使用.cuda()可以将CPU上的Tensor转换(复制)到GPU上。如果有多块GPU,我们用.cuda(i)来表示第 ii 块GPU及相应的显存(ii从0开始)且cuda(0)和cuda()等价。

对上面代码,将.cpu()的操作去掉,如下所示:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1, 2, 3], device=device)
y = x**2
z = y + x
z

可正常打印结果:
在这里插入图片描述
同Tensor类似,PyTorch模型也可以通过.cuda转换到GPU上。我们可以通过检查模型的参数的device属性来查看存放模型的设备。

net = nn.Linear(3, 1)
list(net.parameters())[0].device

在这里插入图片描述
可见模型在CPU上,将其转换到GPU上:

net.cuda()
list(net.parameters())[0].device

在这里插入图片描述
同样的,我们需要保证模型输入的Tensor和模型都在同一设备上,否则会报错。
举例,输入如下代码:

net = nn.Linear(3, 1)
net.cuda()
x = torch.rand(2,3).cuda()
net(x)

可以得到正常输出:
在这里插入图片描述
若把x后面的.cuda()去掉

net = nn.Linear(3, 1)
net.cuda()
x = torch.rand(2,3)
net(x)

则会报错:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值