I built a simple network from a tutorial and I got this error:
RuntimeError: Expected object of type torch.cuda.FloatTensor but found type torch.Flo
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`
Now the tensor resides on GPU
TL;DR
This is the fix
inputs = inputs.to(device)
Why?!
There is a slight difference between torch.nn.Module.to() and torch.Tensor.to(): while Module.to()
is an in-place operator, Tensor.to()
is not. Therefore
net.to(device)
Changes net
itself and moves it to device
. On the other hand
inputs.to(device)
does not change inputs
, but rather returns a copy of inputs
that resides on device
. To use that "on device" copy, you need to assign it into a variable, hence
inputs = inputs.to(device)