Python采用 torch模块+CUDA测试YOLO_v3_tutorial_from_scratch-master实时目标检测

本文详细介绍了在PyTorch中如何处理CUDA tensor与Numpy之间的转换,包括Variable、Tensor到Numpy的转换,以及CUDA到CPU的转换。通过解决在使用CUDA过程中遇到的TypeError问题,演示了在进行目标检测时,如何正确地将CUDA tensor数据转换为numpy格式。
摘要由CSDN通过智能技术生成

github地址:https://github.com/qqwweee/keras-yolo3

Pytorch 中,如果直接从 cuda 中取数据,如 var_tensor.cuda().data.numpy(),

import torch

var_tensor = torch.FloatTensor(2,3)
if torch.cuda.is_available():  # 判断 GPU 是否可用
    var_tensor.cuda().data.numpy()

则会出现如下类似错误:

TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

其应该 var_tensor.cuda().data.cpu().numpy().

wu@wu-X555LF:~$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> var_tensor = torch.FloatTensor(2,3)
>>> if torch.cuda.is_available():  # 判断 GPU 是否可用
...     var_tensor.cuda().data.numpy()
... 

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
>>>  
>>> if torch.cuda.is_available():  # 判断 GPU 是否可用
...     print(var_tensor.cuda().data.cpu().numpy())
... 
[[-2.4259018e-32  4.5680929e-41 -2.4259018e-32]
 [ 4.5680929e-41  4.4841551e-44  0.0000000e+00]]
>>> 

 TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

报错原因:numpy不能读取CUDA tensor 需要将它转化为 CPU tensor。

所以如果想把CUDA tensor格式的数据改成numpy时,需要先将其转换成cpu float-tensor随后再转到numpy格式

例如:报错行:

tcls[index, best_n, g_y_center, g_x_center, np.array(target[index, t, 0])] = 1

修改后:

tcls[index, best_n, g_y_center, g_x_center, np.array(target[index, t, 0].cpu())] = 1

 

Pytroch 涉及到 Variable,Tensor 和 Numpy 间的转换比较多,还会涉及到 cuda 到 cpu的转换.


1. Variable 转 Numpy

import torch
from torch.autograd import Variable

var = Variable(torch.FloatTensor(2,3))
# var = tensor(1.00000e-03 *
#       [[ 1.1476,  0.0000,  0.0000],
#        [ 0.0000,  0.0000,  0.0000]])
var_numpy = var.data.numpy()
# array([[1.1476139e-03, 4.5816855e-41, 3.7984453e-37],
#        [0.0000000e+00, 4.4841551e-44, 0.0000000e+00]], dtype=float32)

1.2 Numpy 转 Variable

import torch
from torch.autograd import Variable
import numpy as np

var_numpy = np.random.randn(2, 3)
# array([[-0.27443182,  1.18369008, -0.24645608],
#        [-0.99800364,  0.58202014, -0.84904032]])
var = Variable(torch.from_numpy(var_numpy))
# tensor([[-0.2744,  1.1837, -0.2465],
#         [-0.9980,  0.5820, -0.8490]], dtype=torch.float64)

1.3 Tensor 转 Numpy

import torch

var_tensor = torch.FloatTensor(2,3)
# tensor(1.00000e-03 *
#       [[ 1.1476,  0.0000,  1.1476],
#        [ 0.0000,  0.0000,  0.0000]])
var_numpy = var_tensor.numpy()
# array([[1.1476139e-03, 4.5816855e-41, 1.1476139e-03],
#        [4.5816855e-41, 4.4841551e-44, 0.0000000e+00]], dtype=float32)

1.4 Numpy 转 Tensor

import torch
import numpy as np

var_numpy = np.ones()
var_tensor = torch.from_numpy(var_numpy)

1.5 .cuda()

Pytorch 可以将内存中的模型和数据复制到 GPU 显存中,进行 GPU 计算.

import torch

torch.cuda.device_count() # 计算可用 GPU 数量

var_tensor = torch.FloatTensor(2,3)
if torch.cuda.is_available():  # 判断 GPU 是否可用
    var_tensor = var_tensor.cuda() # .cuda(device_id) 指定 GPU 上
    # tensor(1.00000e-03 *
    #        [[ 1.1476,  0.0000,  1.1476],
    #         [ 0.0000,  0.0000,  0.0000]], device='cuda:0')

    # model = model.cuda()

1.6 .cpu()

Pytorch 中,如果直接从 cuda 中取数据,如 var_tensor.cuda().data.numpy(),

import torch

var_tensor = torch.FloatTensor(2,3)
if torch.cuda.is_available():  # 判断 GPU 是否可用
    var_tensor.cuda().data.numpy()

则会出现如下类似错误:

TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

其应该 var_tensor.cuda().data.cpu().numpy().

import torch

var_tensor = torch.FloatTensor(2,3)
if torch.cuda.is_available():  # 判断 GPU 是否可用
    print(var_tensor.cuda().data.cpu().numpy())
    # array([[1.1476139e-03, 4.5816855e-41, 1.1476139e-03],
    #        [4.5816855e-41, 4.4841551e-44, 0.0000000e+00]], dtype=float32)
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值