如果需要更好的阅读体验,可以在ai studio上fork该项目:使用VisualDL2.0对项目进行可视化调参
调参是深度学习必须要做的事情。数据和模型处理好后,需要进行模型训练,这个时候就需要进行调参了。一种好的参数配置,可以使得训练出来的模型在测试集上表现出很好的效果。可是要如何调呢?这里用飞桨(paddlepaddle深度学习框架)
我们通常说的调参是指调整超参数这些,例如:
- 先给他个设置一个不大不小的epoch,和一些其他超参数,例如epoch=10?然后跑一下,每多少iter(batch步数)打印一次loss看看,这其实是很不直观的,得一条条输出看过去。
- batch_size给个32?还是64?又或者更大更小?大的batch容易收敛,可是又容易陷入局部最小值(鞍点);小的batch训练的模型鲁棒性好,可是又难收敛!
- 学习率先给个0.01,观察loss,如果loss上升就说明loss过大,给他减小到0.001?又或者0.005之类。如果loss下降很慢,这个时候是否考虑给他增大学习率呢?学习率衰减使用哪些策略比较好呢?是选择分段衰减?还是按按步数衰减之类?等等…
- 这些超参数都是需要尽可能的去试,在不同模型和数据上这些参数选择哪种是比较好的,都是不确定的(也就是所谓炼丹了)。
- 显而易见调参这项工作是十分的耗费费时间和资源的,如果可以快速找到这些最好的参数,可以节约很多时间和算力资源。这也是本文的主要问题:如何进行高效的调参?这里推荐使用VisualDL工具进行可视化分析
- PaddleSeg是基于PaddlePaddle开发的端到端图像分割开发套件,覆盖了DeepLabv3+, U-Net, ICNet, PSPNet, HRNet, Fast-SCNN等主流分割网络。通过模块化的设计,以配置化方式驱动模型组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。
- 本文将使用paddleSeg套件实现一个语义分割项目,并用VisualDL工具对其参数进行可视化分析,以可视化的形式帮助开发者清楚了解这些参数的变化情况。
下载安装命令## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
项目内容
- 一.对数据进行一些处理以及简单配置一下paddleSeg中提供的模型的参数
- 二.训练模型,期间调整一些超参数/参数
- 三.使用VisualDL2.0工具进行可视化
- 四.总结
一.数据和配置准备:
- 数据这里采用第八届CCF BDCI遥感影像地块分割的初赛数据集,由于数据比较多,语义分割训练较慢,我们这边只是为了观察vdl的使用。因此,我们就从这14万张训练集里划分出一万张来作为我们的训练集。模型使用deeplabv3+exception65(轻量级网络)
#下载paddleSeg
!git clone https://hub.fastgit.org/PaddlePaddle/PaddleSeg.git
#配置
%cd PaddleSeg
!pip install -r requirements.txt
%cd PaddleSeg/
#下载预训练模型
!python pretrained_model/download_model.py deeplabv3p_xception65_bn_coco
#将数据集解压到PaddleSeg路径下,如果在本地运行,注意更改data/data55400/
!unzip data/data55400/img_train.zip -d PaddleSeg/dataset/rs_data
!unzip data/data55400/lab_train.zip -d PaddleSeg/dataset/rs_data
#为了方便训练,从14万张数据集中划分出1万张作为数据集,这边已经划分好了,如果想用完整数据集,或者进行一些数据增强操作,可以在下面代码基础上修改
%cd PaddleSeg/dataset/rs_data
%mkdir new_img
%mkdir new_lab
import os.path
import glob
import cv2
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np
from PIL import Image, ImageEnhance, ImageDrawnums_id = 0#计数器
with open("train_list.txt", "w", encoding='utf-8') as f1:#训练集with open("val_list.txt", "w", encoding='utf-8') as f2:#验证集with open("test_list.txt", "w", encoding='utf-8') as f3:#测试集for file1 in glob.glob(r'lab_train/*.png'):nums_id += 1#原文件保存路径path1, pngfile = file1.split()[0], file1.split("/")[1]path2, jpgfile = "img_train", pngfile.split(".")[0] + ".jpg"file2 = os.path.join(path2, jpgfile)#新文件保存路径new_file1 = os.path.join("new_lab", pngfile)new_file2 = os.path.join("new_img", jpgfile)##遍历lab_train下的png图片,复制1万张到另一个文件夹new_lab下'''img1 = cv2.imread(file1,flags=-1)cv2.imwrite(new_file1, img1)#'''img1 = Image.open(file1)img1.save(new_file1)#保存图片,用PIL读取png图片##对应的img_train目录下的1万张jpg图片,也复制到一个新文件夹new_img下img2 = cv2.imread(file2)cv2.imwrite(new_file2, img2, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])#保存图片#保存list文件if nums_id <= 900:f1.write(new_file2 + " " + new_file1 + "\n")#生成训练集列表else:f2.write(new_file2 + " " + new_file1 + "\n")#生成验证集列表if nums_id > 9980:f3.write(new_file2 + "\n")#生成测试集列表,用于可视化数据,就取最后20张#打印进度if nums_id %100 == 0:print("处理到:",nums_id)if nums_id == 1000:break
%cd ../../
二.开始训练:打印loss等信息(正常的观察模型训练情况的方式)以及保存日志文件(用于VDL可视化显示训练情况)
- 训练过程中,设置参数:–use_vdl(使用vdl) --vdl_log_dir “vis”(指定日志保存的路径)
#进入到PaddleSeg路径下,如果在终端运行,需要删去代码前面符号。
%cd PaddleSeg
!python pdseg/train.py --cfg ../work/deeplabv3.yaml --use_gpu --use_vdl --do_eval --vdl_log_dir "vis5"
三.使用VDL可视化分析训练过程的各参数变化情况
1.训练完后(训练过程中也可以动态查看),如何使用vdl可视化查看数据变化呢?
2.完成准备工作后,我们就可以进行可视化了!
训练过程中就打开vdl,观察数据在训练过程中的动态变化情况
3.查看模型结构:使用deeplabv3p_xception65模型训练,选择模型文件,然后打开vdl,就可以查看模型结构了
- 如果想看自己搭的一个模型结构图,那么也可以不需要自己去辛苦画了,直接vdl打开,跑一下,就可以显示出来啦!用处多多,有待挖掘!
4.我们还可以分成多组实验,观察不同超参数下,loss等数据的变化情况,在一张图上展示出来
- 从最简单的来:学习率
- vis1:lr1=0.01
- vis2:lr2=0.02
- vis3:lr3=0.05
- lr1、lr2、lr3在步数(横坐标)为280的时候,miou分别为0.49357,0.43952,0.2408,可以帮助我们分析学习率衰减情况对miou提升的影响。对于某一阶段的miou如果是单纯看打印信息,是基本上都是没显示的,使用vdl后可以看任意阶段的数值变化。Relative是训练到该位置的时间,通过这个参数可以查看训练多少步数,需要多长时间,调参时候可以先跑几个epoch,就可以较为准确的算出一个训练一个epoch要多长时间,方便我们调整总epoch数的设置。
5.查看数据集
- 在aistudio环境中查看图片其实不太方便的,不过很多和我一样的小伙伴们又得用aistudio上的gpu环境,这个时候怎么办呢?就可以用我们的vdl工具了,直接可视化出来你要看的一部分数据,想看哪些看哪些!
- log日志在vis4中
- 要在vdl查看数据集的话,需要配置deeplabv3.yaml文件中的一个参数:
VIS_FILE_LIST: "./dataset/rs_data/test_list.txt"
- 会在训练过程中保存模型时候打印一次,如果不想打印/在vdl中查看数据,可以将此参数设置为None:
VIS_FILE_LIST: None
四.总结
- 在训练过程中,也有打印loss等信息,可是训练多个epoch的话,打印的信息会非常多,每一条挨个看过去是非常累的。使用VDL2.0工具,可以将这些信息用几张图片展示出来,鼠标移动到图上,数据也会动态显示,可以帮助开发者们去更好的分析模型的一些情况。目前VisualDL2.0工具有6大功能,支持多个框架的模型可视化。
- 标量数据的展示
- 直方图
- 样本数据
- 网络结构
- P-R曲线
- high dimensional
- 最后,欢迎大家去VDL GitHub上点个star鸭!!
- github首页:https://github.com/PaddlePaddle/VisualDL
- 官网:https://www.paddlepaddle.org.cn/paddle/visualdl
- aistudio项目:【VisualDL2.0–眼疾识别训练可视化】https://aistudio.baidu.com/aistudio/projectdetail/502834
- aistudio项目:【VisualDL2.0–基于「手写数字识别」模型的全功能展示】https://aistudio.baidu.com/aistudio/projectdetail/622772
- aistudio论坛:https://ai.baidu.com/forum/topic/show/960053?pageNo=2
下载安装命令## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu