为什么我们在拥有model.to('CUDA')时需要image.to('CUDA')

时间:2018-12-09 17:57:40

标签: python pytorch

我正在上PyTorch的课程。 我想知道为什么我们需要在运行的设备上分别告诉torch.utils.data.DataLoader输出。如果模型已经在CUDA上,为什么不相应地自动更改输入?这种模式对我来说似乎很有趣:

model.to(device)

for ii, (inputs, labels) in enumerate(trainloader):

    # Move input and label tensors to the GPU
    inputs, labels = inputs.to(device), labels.to(device)

是否有一个用例,我想让模型在GPU上运行,但我的输入处于CPU模式,反之亦然?

1 个答案:

答案 0 :(得分:2)

调用model.to(device) (假设device是GPU)时,您的模型参数将移至GPU。关于您的评论:然后将它们从CPU内存移至GPU内存。

默认情况下,如果没有另外指定,则在CPU上创建新创建的张量。因此,这也适用于您的inputslabels

这里的问题是,操作的所有 操作数必须位于同一设备上!如果省略to并使用CPU张量作为输入,则会收到错误消息。

这是一个简短的示例:

import torch

# device will be 'cuda' if a GPU is available
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# creating a CPU tensor
cpu_tensor = torch.rand(10)
# moving same tensor to GPU
gpu_tensor = cpu_tensor.to(device)

print(cpu_tensor, cpu_tensor.dtype, type(cpu_tensor), cpu_tensor.type())
print(gpu_tensor, gpu_tensor.dtype, type(gpu_tensor), gpu_tensor.type())

print(cpu_tensor*gpu_tensor)

输出:

tensor([0.8571, 0.9171, 0.6626, 0.8086, 0.6440, 0.3682, 0.9920, 0.4298, 0.0172,
        0.1619]) torch.float32 <class 'torch.Tensor'> torch.FloatTensor
tensor([0.8571, 0.9171, 0.6626, 0.8086, 0.6440, 0.3682, 0.9920, 0.4298, 0.0172,
        0.1619], device='cuda:0') torch.float32 <class 'torch.Tensor'> torch.cuda.FloatTensor
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-15-ac794171c178> in <module>()
     12 print(gpu_tensor, gpu_tensor.dtype, type(gpu_tensor), gpu_tensor.type())
     13 
---> 14 print(cpu_tensor*gpu_tensor)

RuntimeError: Expected object of type torch.FloatTensor but found type torch.cuda.FloatTensor for argument #2 'other'