Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

  • 简单记录下。

  • 这句话翻译一下就是,期望所有张量在同一设备上,但数据分布在两个设备上,cuda:0和cpu。

  • 网上基本上就是两种解决方法:

  • 方法一、哪一行报错,就把哪一行数据统一下,要么都放再CPU上,要么都放在GPU上。

     		 device = torch.device("cuda" if torch.cuda.is_available() else "cpu")    
     		 x.to(device)
    
  • 方法二、

               x = x.cuda()
    
  • 但是这两种方法有时候解决不了问题,我所遇到的问题,试过这两种方法,并不适用。我的问题是,搭建的网络有一部分没有写入GPU。在搭建网络时,forward函数中两种定义网络的方式不能混用。

  • 如图一般我们会在inint 层定义好自己的网络,这里就以全连接层为例,对比一下正确的写法和错误的写法。在这里插入图片描述

  • 实现网络的不同的写法:
    在这里插入图片描述
    其是如果我们在CPU上训练,这两种写法都不会报错,但是如果要利用GPU进行训练,错误的写法就会报错。

  • 最后总结一下,我们在进行网络搭建的过程中最好在__init__层定义好自己要用到的网络。

  • PS:print(变量.is_cuda),检查数据是否在GPU上,然后统一一下。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值