目录
3.2 image ---> numpy ----> tensor
1. 介绍
Numpy :处理多维数组 + 读取图片
Tensor : 张量,可以理解为多维数组。tensor 是神经网络传递的基本数据,pytorch中的重要数据结构,和numpy的ndarrays相似。但可以用于GPU加速 + 反向传播
一般来说神经网络工作的基本流程是:
Image读取图片 -----> numpy 读取数据 -----> 转为tensor用于model训练 -----> 输出结果仍为tensor ------> 转为 numpy 绘制图像
- Image.open() 读取图像,产生的数据是image类型
- numpy 读取image类型的图像,生成ndarray类型的数据
- torch.from_numpy() 将array数据变成tensor类型用于网络训练
因此,numpy 用于读取数据,tensor用于网络训练
2. numpy 和 tensor 的转换
建立一个numpy数据,可以发现,np1的数据类型是ndarray
2.1 numpy ---> tensor
接下来将np1转为tensor数据,代码为
torch.from_numpy() # np -----> tensor
2.2 Tensor 可以在GPU上运行
Tensor 和 numpy 的区别之一就是 tensor 可以运行在 GPU 上
如图,tensor1 输出的时候,显示了一个cuda
Tensor 可以运行在GPU上,也可以运行在CPU上
Numpy 可以运行在CPU上,但不可以运行在GPU上
如图,相关的代码为
2.3 tensor ---> numpy
tensor 转为 numpy 的方法为:tensor变量.numpy()
因为numpy不能在 GPU 上面运行,所有如果tensor已经在GPU运行的话,需要先将tensor放到cpu上面,再转为numpy
因此下面的会报错
先将tensor放到cpu上面即可
2.4 Summary
numpy 和 tensor 相互转换的代码为:
- torch.from_numpy() # numpy ----> tensor
- tensor.numpy() # tensor ----> numpy
需要注意的是,tensor 可以在 GPU 或者 CPU 上运行,而numpy只能在 CPU上面运行。所以,当tensor转为numpy 的时候,需要先将tensor放到cpu上
- tensor1.cuda() # GPU 和 tensor.to('cuda') 一个意思
- tensor1.cpu() # CPU 和 tensor.to('cpu') 一个意思
model在训练的时候,往往参数都非常多,基本上net都是在GPU训练。而训练结束,预测图像基本上也都是在GPU上计算。所以在最后显示的时候,需要将网络输出的tensor先放到cpu
然后再用numpy输出
而numpy ----> tensor用的不多,是为了其他预处理的一些操作,往往将这一过程在 transform 里面实现了。例如ToTensor()
3. 读取图片的相关操作
3.1 Image 读取图片
PIL 全称是 Python Imaging Library ,是 Python 平台一个功能非常强大而且简单易用的图像处理库
PIL 当中的 Image 可以用来读取图像,首先导入Image模块
然后利用 Image.open() 读取图像,如图,读取到的数据类型是image类型
3.2 image ---> numpy ----> tensor
image -----> numpy:
numpy ------> tensor:
将tensor 部署到 GPU 训练,然后转到 CPU ,最后转为 numpy
3.3 显示图像
显示图像为:
当然,picture = Image.open() 就是读取图像的,因此plt.imshow(picture) 也是可以的