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 层定义好自己的网络,这里就以全连接层为例,对比一下正确的写法和错误的写法。Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!_第1张图片

  • 实现网络的不同的写法:
    Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!_第2张图片
    其是如果我们在CPU上训练,这两种写法都不会报错,但是如果要利用GPU进行训练,错误的写法就会报错。

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

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

你可能感兴趣的:(torch)