tensor与numpy数据类型转换

2021-05-28 17:23:08 浏览数 (1)

我们使用TensorFlow、pytorch等机器学习库的时候,经常涉及到要把输入的数据集转为tensor型,而且模型输出的结果也会是tensor型的。

事实上,tensor与numpy虽然都是用来表示多维数组的,但是tensor弥补了numpy不能创建张量函数和求导,也不支持GPU的缺陷。可以说,tensor数据类型主要就是为了深度学习而生的。

因为TensorFlow已经逐渐过时了,我现在主要使用的也是pytorch,所以下面就主要以pytorch为例,来展示一下tensor数据与numpy的转换吧~

假设我们已经用pytorch训练好了一个模型,名为model,用它来生成图片分类结果,那么它输出的预测结果pred,就是tensor型的,pred_np就是将其转为numpy格式的结果。

代码语言:javascript复制
from torch.autograd import Variable
for i, (images,labels) in enumerate(val_loader):
    images = Variable(images.cuda())
    output = model(images)
    prob, pred = output.topk(maxk, 1, True, True)
    pred_np = pred.cpu().detach().numpy()

我们来看一下tensor类型的pred长什么样子:

这里的device='cuda:0'昭示了我用得起GPU的满满的炫耀。

pred.cpu().detach().numpy()就是把GPU下tensor类型的pred,转为CPU下的numpy格式:

tensor型的数据,是不能像numpy一样直接进行加减乘除各种运算的,以pytorch框架为例,它的很多运算都必须在torch框架下才可以。比如相加是torch.add(),相除是torch.div(),求绝对值是torch.abs(),求幂是torch.pow(),等等。不过关于tensor的计算,我们实际当中应用的很少,更多的是把模型输出的tensor型的结果,转化为numpy的数值,方便后面的操作,比如说,将模型的分类结果整合到pandas数组里面,集中进行展示:

代码语言:javascript复制
import pandas as pd
import glob
defect_label_order = ['强降水', '冰雹', '大风']
# 与中文标记一一对应
defect_code = {
    0:  '强降水',
    1:  '冰雹',
    2:  '大风',
    }
result_list = glob.glob(opt.img_root_val   "/*.png")
result_pd = pd.DataFrame(result_list, columns=["ImageName"])
# 获取文件名称
result_pd["file_name"]=result_pd["ImageName"].apply(lambda x:x.split("/")[-1])
# 获取预测分类的数字
result_pd["pred_num"] = pred_np
# 将数字标记转化为标签名称
result_pd["result"]=result_pd["pred_num"].apply(lambda x:defect_code[x])
print(result_pd)

这样,对于每个样本的分类结果就可以直观地直接print到屏幕上:

0 人点赞