1-3.使用飞桨(paddlepaddle)以及VisualDL2.0对项目进行可视化调参

原创
2020/11/22 20:45
阅读数 3.1K

如果需要更好的阅读体验,可以在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, ImageDraw

nums_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

​​​​​​​

本文同步分享在 博客“我不是坏人...真的”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部