1-3.使用飞桨(paddlepaddle)以及VisualDL2.0对项目进行可视化调参_怎么将日志里损失函数可视化paddle-程序员宅基地

技术标签: paddle  

如果需要更好的阅读体验,可以在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工具对其参数进行可视化分析,以可视化的形式帮助开发者清楚了解这些参数的变化情况。

项目内容

  • 一.对数据进行一些处理以及简单配置一下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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43668325/article/details/109963099

智能推荐

mysql修改字段长度很慢-程序员宅基地

文章浏览阅读934次。SQL数据库修改某张表主键的长度在外码表设计中选择“关系”,将外码引用的更新规则改为“级联”后,即可修改。你这样设置了以后你修改主码表的字段长度,外码表对应的字段长度会自动修改的。如何更改字段的长度--Oraclealtertable表名modify(字段长度..);--MySQLalterta..._mysql修改字段类型执行过慢

docker小技巧(一) 使用iptables 映射docker容器端口_如何通过服务区ip和端口访问到docker容器内应用,iptables如何做转发-程序员宅基地

文章浏览阅读1.4k次。有天同事问我的问题,怎么给已有的容器不停止的情况下添加映射(。・∀・)ノ(我擦,我防火墙也不太懂)#需要开启路由转发echo "net.ipv4.ip_forward=1" >> /etc/sysctl.confsysctl -p#查看容器iddocker inspect [container_name] | grep IPAddress#添加转发iptables -t nat -A DOCKER -p tcp --dport 8082 -j DNAT --to 1._如何通过服务区ip和端口访问到docker容器内应用,iptables如何做转发

字节跳动Android岗经典面试真题,赶紧收藏备战金三银四!_字节android高频面试题-程序员宅基地

文章浏览阅读290次。前言今年上半年其实就已经有了换工作的想法,奈何疫情原因和岗位缩减,加之信心不足,到六月底投递了百度的Android岗位,本以为像我这种非211、985没工作经验的渣渣只能被直接pass,结果却意外的收到了电话,真是受宠若惊.经过电面,技术三面,然后就是等通知到最后拿到了OFFER,如梦一般,当时还是挺激动的。安卓基础知识安卓基础知识确实很多,如果日常积累不够的话确实比较头晕,比如我承认我只在 APP 升级的时候搞过一个前台的 Service,但是面试的时候就会问你 Service 生命周期,如何绑定,_字节android高频面试题

stable-diffusion-webui AutoDL 算力平台后台启动命令_when localhost is not accessible, a shareable link-程序员宅基地

文章浏览阅读3.1k次。stable-diffusion-webui AutoDL 算力平台后台启动命令、学术资源加速_when localhost is not accessible, a shareable link must be created. please s

【Java基础】获取输入日期是哪一年的哪一天的星期几_java计算出2050年5月1日那天是星期几-程序员宅基地

文章浏览阅读668次。分析以下需求,并用代码实现 1)已知日期字符串:"2015-10-20",将改日期字符串转换为日期对象 2)将(1)中的日期对象转换为日历类的对象 3)根据日历对象获取改日期是星期几,以及这一年的第几天 4)通过键盘录入日期字符串,格式(2015-10-20) ,如输入:2015-10-20,输出"2015年-10月-20日 是 星期二,是2015年的 10月 20日"。 ..._java计算出2050年5月1日那天是星期几

C语言mysql_query()插入数据库,中文乱码问题解决_c语言tcp通信插入数据库的信息是乱码的原因-程序员宅基地

文章浏览阅读738次。C语言mysql_query()插入数据库,中文乱码问题解决。数据显示乱码的原因,一般只有一个,就是数据输入方和接收方或者展示方的编码格式不一致。_c语言tcp通信插入数据库的信息是乱码的原因

随便推点

【评测】MP SARS-CoV-2单抗、重组蛋白_sarrs-cov-2基因组大小-程序员宅基地

文章浏览阅读636次。截至目前,已知引起人致病的冠状病毒包括7种,其中HCoV-229E、HCoV-OC43、HCoV-NL63和HCoV-HKU1致病性较低,一般引起轻微的呼吸道症状。基因测序结果显示,SARS-CoV-2与SARS-CoV的同源性约79%,与MERS-CoV的同源性约50%。文献报道,新型冠状病毒S蛋白ACE2亲和力较SARS-COV强,提示具有更强的传染性。到目前为止,还没有专门用于预防的疫苗和治疗冠状病毒的特效药物。一般采用非特异性治疗,预防严重的并发症,降低重症发病率和死亡率,提高治愈率。研发新型冠_sarrs-cov-2基因组大小

R语言绘制二项分布图,并着不同颜色7_r语言来自二项分布总体的样本比例的分布的绘制代码-程序员宅基地

文章浏览阅读254次。笔者使用R语言绘制二项分布图,并着不同颜色_r语言来自二项分布总体的样本比例的分布的绘制代码

Docker 安装 SonarQube_docker安装sonarqube-程序员宅基地

文章浏览阅读2.1k次。1、简介1.1、简介SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,等信息。1.2、官网SonarQube 官方网站2、准备工作2.1、安装 DockerCentOS7 安装 D_docker安装sonarqube

asp.net的弹出消息框_c# asp.net消息框-程序员宅基地

文章浏览阅读1k次。 Response.Write ("alert(/"你在没有输入前不可以做以下操作!/")");public void Pop(string Msg) { StringBuilder ghq=new StringBuilder(); ghq.Append("/n"); ghq.Append("alert("+""+M_c# asp.net消息框

python os创建txt文件_Python新建动态命名txt文件-程序员宅基地

文章浏览阅读1.2k次。# -*- coding: utf-8 -*-import os,sys,timefname=r"D:\01-学习资料\python"def GetNowTime():#获取当前时间并以年月日时间方式显示return time.strftime("%m%d%H%M%S",time.localtime(time.time()))#time=unicode(GetNowTime(),"utf8")ti..._os 生成txt python

arcgis 计算矢量坐标_arcgis矢量坐标乘以200-程序员宅基地

文章浏览阅读1.1k次。左下角经度 str(!shape.extent.XMin!)左下角纬度 str(!shape.extent.YMin!)右上角经度 str(!shape.extent.XMax!)右上角纬度 str(!shape.extent.YMax!)_arcgis矢量坐标乘以200

推荐文章

热门文章

相关标签