我们使用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到屏幕上: