Convert to numpy cuda variable

How to convert cuda variables to numpy?

2 Likes

You first need to convert them to cpu.

cuda_tensor = torch.rand(5).cuda()
np_array = cuda_tensor.cpu().numpy()
15 Likes

That’s because numpy doesn’t support CUDA, so there’s no way to make it use GPU memory without a copy to CPU first. Remember that .numpy() doesn’t do any copy, but returns an array that uses the same memory as the tensor.

10 Likes

I am facing this problem while try to convert torch.FloatTensor to numpy
pleas help what is the problem?

import cv2
img=cv2.imread('xx.jpg')
img=cv2.resize(img,(32,32))
img = img.transpose((2,0,1))
img=np.expand_dims(img,axis=0)
img=img/255.0
img=torch.FloatTensor(img)
img=Variable(img)
img = img.cuda()

 output=net(img)

print(output)
print('---------------------------------------------------')

np_array = output.cpu()
print (np_array)
print('---------------------------------------------------')

np_array = np_array.numpy()
print (np_array)
print('---------------------------------------------------')

here wht I got:
Variable containing:
0.1437 0.1254 -0.2880 -0.3866 -0.1179 0.3432 -0.1611 -0.4105 0.0947 -0.7357
[torch.cuda.FloatTensor of size 1x10 (GPU 0)]


Variable containing:
0.1437 0.1254 -0.2880 -0.3866 -0.1179 0.3432 -0.1611 -0.4105 0.0947 -0.7357
of size 1x10]


Traceback (most recent call last):
File “/main.py”, line 186, in

np_array = np_array.numpy()


AttributeError: numpy

Try np_array.data.numpy(), I don’t think Variables can be directly “converted”.

4 Likes

Thanks … fixed that

Hello,

what’s wrong with my model

m=torch.nn.Softmax()
model.eval()
preds = model(image)
temps=preds.cpu()
prob=torch.max(m(temps)*100)

error with prob variable
assert input.dim() == 2, 'Softmax requires a 2D tensor as input’
AssertionError: Softmax requires a 2D tensor as input

I don’t think this is a problem of numpy to cuda variable.
The softmax function requires a 2D Tensor as input and I guess you are giving a single
vector as input.

Please go through the documentation of Softmax: http://pytorch.org/docs/master/nn.html#torch.nn.Softmax

Is there a reason that the numpy() call doesn’t check if the tensor is on the gpu and simply do .cpu().numpy()?

@dhpollack it’s a matter of taste. We felt that doing .numpy() on GPU Tensors might introduce silent / careless performance bugs in user code.

4 Likes

In my case I also had to use .detach()


output.cpu().detach().numpy()

else I get this error:
RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.

5 Likes

I am using it as below
loss_semi_adv_value += loss_semi_adv.data.cpu().numpy()[0]/args.lambda_semi_adv
I get this error. Does anybody know the reason?

loss_semi_adv_value += loss_semi_adv.data.cpu().numpy()[0]/args.lambda_semi_adv
IndexError: too many indices for array