Pytorch简易入门教程
Pytorch简易入门教程
声明:本教程依照Bilibili Up主我是土堆出品系列视频编撰,有兴趣的读者可以去原视频进行详细学习。
1. 环境配置
使用Anaconda作为包管理工具,创建初始环境、安装torch,cuda和cudnn。
推荐安装Jupyter notebook解锁新天地。
使用代码检测环境是否配置成功:
1 |
|
笔者配置的环境如下:
1 |
|
在学习过程中,我们遇到问题往往会有多种信息来源进行参考,那么这时我们就会面临一个信息的筛选。建议在学习时依照官方文档进行对照,常用的函数为dir()
以及help()
,后者在例如Pycharm、Visuial Studio Code等编辑器中可以用快捷键Ctrl+左键
进行替代。
2. PyTorch数据加载初认识
在PyTorch中,读取数据主要涉及两种方式:Dataset以及Dataloader。
对于Dataset,它是对于数据集的抽象,定义了数据的类型、来源和格式,并且进行编号。通常Dataset只处理单条数据。
而对于Dataloader,它是一个数据加载器,用于控制数据的加载方式,主要负责将Dataset中的数据批量(batch)加载出来,同时提供了例如shuffle
、batch_size
等基本功能,返回一个可迭代对象,每次迭代返回一个batch
。
这里我们以一个蚂蚁蜜蜂图片数据集为例(下载链接)进行具体的学习。
数据集的基本结构如下:
1 |
|
其中,ants
和bees
目录下存放对应的图片。
下面我们来具体构造一个Dataset。构造一个Dataset一般只需要重写torch提供的类的三个函数:__init__
,__getitem__
和__len__
,分别执行初始化、获得数据与标签、获取数据集长度的功能。
对于我们本案例中的数据集,将相同标签的所有数据条目放在同一目录下,因此文件夹名ants
和bees
为我们的二分类标签。在另一种数据集的组织方式中,每一条数据会有对应的同名txt文件,里面存放相关的标签信息。
1 |
|
1 |
|
1 |
|
这样,我们就完成了一个基本数据集的加载。总而言之,加载数据集最为核心的部分便是分辨不同数据的格式(图片、语音、文本等),利用不同的工具进行加载,并同时加载对应的label
信息。
3. PyTorch图片处理和可视化
在训练过程中,对于时间成本较高的训练过程,我们往往需要实时跟踪训练过程中一些变量的变化来判断训练是否正常;对于训练结果,我们也需要可视化的展示。另一方面,对于一些图片数据,我们需要进行预处理。在这里介绍Tensorboard的使用和torchvision.transform的使用。
TensorBoard
是 TensorFlow 的可视化工具,PyTorch 提供了对它的支持。可以用来可视化:
- 损失函数与准确率变化曲线
- 模型结构(graph)
- 权重直方图
- 图片、音频、文本等
- Embedding 映射
在使用的过程中,Tensorboard会维护一个log目录,下面存放每一次迭代产生的记录。
3.1 用add_scalar方法添加标量数据
函数原型:add_scalar(tag, scalar_value, global_step=None, walltime=None)
1 |
|
3.2 用add_image方法添加图片
函数原型:add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
参数名 | 类型 | 说明 |
---|---|---|
tag |
str |
标签名,如 "Input/Image" ,用于标识图像 |
img_tensor |
Tensor 或 numpy.ndarray |
图像数据,推荐格式为 Tensor (如 torch.Tensor ) |
global_step |
int |
步数或 epoch(可选) |
walltime |
float |
时间戳(可选) |
dataformats |
str |
图像格式,常用有:'CHW' (默认),'HWC' ,'NCHW' (多图像)等 |
可以看到,使用add_image
方法接受的数据为Tensor或者numpy.array类型。而我们通过:
1 |
|
这种方式获得的image的数据格式为PIL.JpegImagePlugin.JpegImageFile,是无法直接作为该方法的参数传递的。因此我们需要进行类型转换。这里就引出了我们transform函数的使用。
3.2.1 转换为numpy.array
利用opencv库的cv2.imread(image_path)
或者numpy库的np.array(pil_image)
都能够实现将图片读取为numpy.array类型。
1 |
|
1 |
|
这样就完成了转换,并且注意输出格式为HWC,详见shape内容。之后再利用add_image
方法便可以实现在tensorboard中插入图片
1 |
|
3.2.2 使用torchvison.transforms转换为Tensor
利用torchvision库的transforms可以实现将图片转换为多种格式的Tensor。
原理是利用transforms下面的几个不同类实现。
transforms.ToTensor(image):
功能 | 说明 |
---|---|
格式转换 | 将图像从 PIL.Image或 numpy.ndarray转换为 torch.Tensor |
维度调整 | 图像从形状 (H, W, C)(常见于 PIL/NumPy)转为 (C, H, W),PyTorch标准格式 |
数据归一化 | 将像素值从 [0, 255]的整数范围 → [0.0, 1.0]的浮点数(除以255) |
1 |
|
1 |
|
transforms.Normalize(mean, std):
对每个通道c,将像素值x执行下面的变换:
$$
x’ = \frac{x- \rm mean [c]}{\rm std[c]}
$$
1 |
|
transforms.Resize(size):
对图片进行缩放,有两种方式:
1 |
|