文章目录
前言
本文主要介绍Python一些常见的数据格式之间的转换方法,尤其是和Pytorch中tensor类型进行相关转换的数据操作。
一、Numpy
Numpy创建的默认浮点类型是np.float64
Numpy创建的整数ndarrays是np.int32
(1)numpy 转化为tensor
1.直接使用torch.tensor函数--------深拷贝
2.使用torch.from_numpy方法------浅拷贝
这两个方法比较而言,使用torch.from_numpy方法更好,更安全。
当只有一个元素(size =1)时,利用item()方法可以转化标量。
(2)numpy 转化为list
1.numpy自带函数 nump.tolist()——要注意列表中数据的维度
(3)numpy 转化为PIL.Image数据类型
1.使用Image.fromarray()方法
注意:Image.fromarray()对输入的dtype的要求是uint8类型
(4)numpy 转化为pandas数据类型
1.使用pd.DataFrame()方法
二、Tensor
torch中tensor默认的浮点类型是float32类型
torch中tensor默认的整数类型是int64类型
【注意和numpy的区别】
首先看一下torch.tensor()和torch.Tensor()这两个方法。两者都是深拷贝方法,返回张量的同时,与原数据不共享内存,因此不受原数据改变的影响。
再来了解一下的区别:
- torch.Tensor()是torch.FloatTensor()的别名,是一个python类,所有的tensor 都是torch.Tensor的实例。将输入转换为torch.FloatTensor()
- torch.tensor()是一个函数。根据输入的数据类型转换为对应的数据类型。
创建空的tensot的方法:
#两种方法
torch.Tensor()
torch.tensor(())
(1)万能转换方法:torch.as_tensor()方法,将其他类型转换为tensor类型。
torch.as_tensor(data, dtype=None, device=None)->Tensor
data:可以是list, tuple, ndarray, scalar等类型
dtype:可以指定tensor中数据的类型,
device:指定返回tensor所在的位置,默认是cpu
注意:torch.as_tensor()默认情况下是一个浅拷贝方法,当指定的dtype和data的类型不一致时才是深拷贝。
(2)tensor 转化为numpy
1.使用 .numpy 函数--------浅拷贝
2.使用 torch.Tensor.numpy() 函数--------浅拷贝
(3)tensor在cpu和gpu上的转换
在使用Pytorch训练的过程中经常要将数据放到gpu上训练,或者是将GPU上训练好的模型数据放在cpu上测试。所以tensor类型经常要来回转换,下面简单介绍一些之间的转换方法。
1.从CPU转换到GPU
1.使用 .cuda()方法
2.使用torch.set_default_tensor_type() 方法,将默认的浮点类型设置为cuda类型。
2.从GPU转换到CPU
#把数据转到CPU----.cpu()方法
gpu_tensor.cpu()
常用写法:
若gpu存在,则放到gpu上;否则放在cpu上。
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
tensor1 = tensor1.to(device)
tensor2 = tensor2.to(device)
#......
(4)tensor转换成标量
和前面一样,使用item()方法
(5)tensor转换成List
1.tolist方法
三、读取图片时的数据类型
(1)cv2
读取图像时主要使用cv2.imread() 函数
用法为:
img = cv2.imread(filename, flags)
#filename:图片路径
#flags:读取图片的格式。默认为1:彩色图片;0:灰度图片;
而且返回的是numpy类型。
注意:
- cv2.imread()函数读取的图片通道保存顺序为BGR,不是RGB。使用cv2.imshow()可以正常显示,使用其他库显示时要进行转换。
- 对cv2.imread()读取的图像转换成数组后的形状是【H,W,C】;而Pytorch中要求输入的形状是【B,C,H,W】。
而在利用深度学习训练的过程中,经常要将numpy数组转换为Tensor类型,我们可以采用tensor = torchvision.transforms.ToTensor()(numpy)
就可以实现这个转换。但是最好不要采用下面方法进行转换,虽然也行,但是可能会导致图片出现一些失真的问题。👀
# 假设img为numpy数组
img = np.transpose(img,(2,0,1))
img = torch.tensor(img,dtype=torch.float).cuda()
img = img.unsqueeze(0)
- cv2.imread()不支持中文路径,如果不想改路径名称,可以按照以下方法读取:
import numpy as np
import cv2
img=cv2.imdecode(np.fromfile(imgpath, dtype=np.uint8), cv2.IMREAD_COLOR)
- 使用cv2.imshow()显示时可能出现图片一闪而过的情况,可以添加一行语句:cv2.waitKey(0);而且imshow()中的第一个窗口名称不能省略。
正确显示:
(2)PIL
读取和显示图像方法如下:
from PIL import Image
img = Image.open('E:\A.png')
img.show()
print(type(img))
输出:
- Image读取的图片格式是 W x H格式的,读入的是“RGB”,转换成numnpy后的shape大小为
【C,H,W】
1.PIL转换成tensor
要用到pytorch里的图形库torchvision,而torchvision.transforms主要是用于常见的一些图形变换。
用法如下:
别写成了:torchvision.transforms.ToTensor(img)
注意:ToTensor()方法转化为tensor时会把灰度范围从0-255变换到0-1之间
总结
其实还有很多内容,后续再补充。