百度飞桨第3课|深度学习模型训练和关键参数调优详解
目录
一、模型选择:
1.回归任务
2.分类任务
3.场景任务
二、模型训练:
1.基于高层API训练模型
2.使用PaddleX训练模型
3.模型训练通用配置基本原则
三、超参优化:
1.超参优化的基本概念
2.手动调整超参数的四大方法
四、效果展示:
1.可视化输入与输出
2.巧用VisualDL
3.权重可视化
五、总结与升华:
一、模型选择:
1.回归任务
- 人脸关键点检测
人脸关键点检测任务中,输出为 人脸关键点的数量x2,即每个人脸关键点的横坐标与纵坐标。在模型组网时,主要使用2个模块,分别是Inception模块和空间注意力模块。增加空间注意力模块是为了提高模型效果。
Inception模块
import paddle
import paddle.nn as nn# GoogLeNet加BN层加速模型收敛
class Inception(nn.Layer): # 定义Inception块(Inception v1)def __init__(self,c1, c2, c3, c4):super(Inception, self).__init__()self.relu = nn.ReLU()self.p1_1 = nn.Conv2D(c1[0], c1[1], 1)self.p2_1 = nn.Conv2D(c1[0], c2[0], 1)self.p2_2 = nn.Conv2D(c2[0], c2[1], 3, padding=1)self.p3_1 = nn.Conv2D(c1[0], c3[0], 1)self.p3_2 = nn.Conv2D(c3[0], c3[1], 5, padding=2)self.p4_1 = nn.MaxPool2D(kernel_size=3, stride=1, padding=1)self.p4_2 = nn.Conv2D(c1[0], c4, 1)def forward(self, x):p1 = self.relu(self.p1_1(x))p2 = self.relu(self.p2_2(self.p2_1(x)))p3 = self.relu(self.p3_2(self.p3_1(x)))p4 = self.relu(self.p4_2(self.p4_1(x)))return paddle.concat([p1, p2, p3, p4], axis=1)
空间注意力模块
import paddle
import paddle.nn as nn# 空间注意力机制
class SAM_Module(nn.Layer): def __init__(self): super(SAM_Module, self).__init__() self.conv_after_concat = nn.Conv2D(in_channels=2, out_channels=1, kernel_size=7, stride=1, padding=3) self.sigmoid_spatial = nn.Sigmoid() def forward(self, x): # Spatial Attention Module module_input = x avg = paddle.mean(x, axis=1, keepdim=True) mx = paddle.argmax(x, axis=1, keepdim=True)mx = paddle.cast(mx, 'float32')x = paddle.concat([avg, mx], axis=1)x = self.conv_after_concat(x) x = self.sigmoid_spatial(x) x = module_input * x return x
2.分类任务
- 图像分类
3.场景任务
这里说的场景任务是针对某一个特定的场景开发的深度学习任务,相比于回归和分类任务来说,场景任务的难度更高。这里说的场景任务包括但不限于目标检测、图像分割、文本生成、语音合成、强化学习等。
- 目标检测
PaddleX里的目标检测模型,这里选择骨干网络为DarkNet53的YOLO-V3模型:
import paddlex as pdxyolo_v3 = pdx.det.YOLOv3(num_classes=2, backbone='DarkNet53'
)yolo_v3.get_model_info()
{'version': '1.3.11','Model': 'YOLOv3','_Attributes': {'model_type': 'detector','num_classes': 2,'labels': None,'fixed_input_shape': None},'_init_params': {'num_classes': 2,'backbone': 'DarkNet53','anchors': None,'anchor_masks': None,'ignore_threshold': 0.7,'nms_score_threshold': 0.01,'nms_topk': 1000,'nms_keep_topk': 100,'nms_iou_threshold': 0.45,'label_smooth': False,'train_random_shapes': [320, 352, 384, 416, 448, 480, 512, 544, 576, 608],'input_channel': 3},'completed_epochs': 0}
- 人像分割
基于PaddleX核心分割模型 Deeplabv3+Xcetion65 & HRNet_w18_small_v1 实现人像分割,PaddleX提供了人像分割的预训练模型,可直接使用,当然也可以根据自己的数据做微调。
- 文字识别
基于chinese_ocr_db_crnn_mobile实现文字识别,识别图片当中的汉字,该Module是一个超轻量级中文OCR模型,支持直接预测。
import paddlehub as hub
import cv2ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
result = ocr.recognize_text(images=[cv2.imread('/home/aistudio/work/OCR/ocrdemo.png')], output_dir='/home/aistudio/work/OCR/ocr_result', visualization=True)
二、模型训练:
1.基于高层API训练模型
通过Model.prepare接口来对训练进行提前的配置准备工作,包括设置模型优化器,Loss计算方法,精度计算方法等。
import paddle.vision as vision
import paddle
import paddle.vision.transforms as transforms
from paddle.vision.transforms import Normalize# 使用paddle.Model完成模型的封装
model = paddle.Model(Net)# 为模型训练做准备,设置优化器,损失函数和精度计算方式
model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters()),loss=paddle.nn.CrossEntropyLoss(),metrics=paddle.metric.Accuracy())# 调用fit()接口来启动训练过程
model.fit(train_dataset,epochs=1,batch_size=64,verbose=1)normalize = transforms.Normalize([0.4914*255, 0.4822*255, 0.4465*255], [0.2023*255, 0.1994*255, 0.2010*255])trainTransforms = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(), transforms.Transpose(),normalize])testTransforms = transforms.Compose([transforms.Transpose(),normalize])trainset = vision.datasets.Cifar10(mode='train', transform=trainTransforms)
trainloader = paddle.io.DataLoader(trainset, batch_size=128, num_workers=0, shuffle=True)
testset = vision.datasets.Cifar10(mode='test', transform=testTransforms)
testloader = paddle.io.DataLoader(testset, batch_size=128, num_workers=0, shuffle=True)# 调用飞桨框架的VisualDL模块,保存信息到目录中。
callback = paddle.callbacks.VisualDL(log_dir='gMLP_log_dir')def create_optim(parameters):step_each_epoch = len(trainloader) // 128lr = paddle.optimizer.lr.CosineAnnealingDecay(learning_rate=0.25,T_max=step_each_epoch * 120)return paddle.optimizer.Adam(learning_rate=lr,parameters=parameters,weight_decay=paddle.regularizer.L2Decay(3e-4))model.prepare(create_optim(model.parameters()), # 优化器paddle.nn.CrossEntropyLoss(), # 损失函数paddle.metric.Accuracy(topk=(1, 5))) # 评估指标model.fit(trainloader,testloader,epochs=120,eval_freq=2,shuffle=True, save_dir='gMLP_case1_chk_points/',save_freq=20,batch_size=128,callbacks=callback,verbose=1)
2.使用PaddleX训练模型
YOLOv3模型的训练接口示例,函数内置了piecewise学习率衰减策略和momentum优化器。
from paddlex.det import transforms
import paddlex as pdx# 下载和解压昆虫检测数据集
insect_dataset = 'https://bj.bcebos.com/paddlex/datasets/insect_det.tar.gz'
pdx.utils.download_and_decompress(insect_dataset, path='./')# 定义训练和验证时的transforms
# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
train_transforms = transforms.Compose([transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(),transforms.RandomExpand(), transforms.RandomCrop(), transforms.Resize(target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(),transforms.Normalize()
])eval_transforms = transforms.Compose([transforms.Resize(target_size=608, interp='CUBIC'), transforms.Normalize()
])# 定义训练和验证所用的数据集
# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-vocdetection
train_dataset = pdx.datasets.VOCDetection(data_dir='insect_det',file_list='insect_det/train_list.txt',label_list='insect_det/labels.txt',transforms=train_transforms,shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(data_dir='insect_det',file_list='insect_det/val_list.txt',label_list='insect_det/labels.txt',transforms=eval_transforms)# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
num_classes = len(train_dataset.labels)# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-yolov3
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='DarkNet53')
# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#id1
# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
model.train(num_epochs=270,train_dataset=train_dataset,train_batch_size=8,eval_dataset=eval_dataset,learning_rate=0.000125,lr_decay_epochs=[210, 240],save_dir='output/yolov3_darknet53',use_vdl=True)
3.模型训练通用配置基本原则
- 每个输入数据的维度要保持一致,且一定要和模型输入保持一致。
- 配置学习率衰减策略时,训练的上限轮数一定要计算正确。
- BatchSize不宜过大,太大容易内存溢出,且一般为2次幂。
三、超参优化:
1.超参优化的基本概念
超参数
模型的超参数指的是模型外部的配置变量,是不能通过训练的进行来估计其取值不同的,且不同的训练任务往往需要不同的超参数。
超参数不同,最终得到的模型也是不同的。
一般来说,超参数有:学习率,迭代次数,网络的层数,每层神经元的个数等等。
常见的超参数有以下三类:
- 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等 .
- 优化参数,包括优化方法、学习率、小批量的样本数量等 .
- 正则化系数
实践中,当你使⽤神经⽹络解决问题时,寻找好的超参数其实是一件非常困难的事情,对于刚刚接触的同学来说,都是"佛系调优",这也是一开始就"入土"的原因,没有依据的盲目瞎调肯定是不行的。
2.手动调整超参数的四大方法
1)使用提前停止来确定训练的迭代次数
2)让学习率从高逐渐降低
3)宽泛策略
4)小批量数据(mini-batch)大小不必最优
四、效果展示:
1.可视化输入与输出
直接可视化输入与输出是最直接的方法。
import numpy as np
import cv2
import matplotlib.pyplot as pltimg = cv2.imread(PATH_TO_IMAGE)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)plt.imshow(img)
plt.show()
2.巧用VisualDL
VisualDL可视化流程
- 创建日志文件:
*为了快速找到最佳超参,训练9个不同组合的超参实验,创建方式均相同如下:
writer = LogWriter("./log/lenet/run1")
- 训练前记录每组实验的超参数名称和数值,且记录想要展示的模型指标名称
writer.add_hparams({'learning rate':0.0001, 'batch size':64, 'optimizer':'Adam'}, ['train/loss', 'train/acc'])
注意:这里记录的想要展示的模型指标为'train/loss'和 'train/acc',后续切记需要用add_scalar
接口记录对应数值
- 训练过程中插入作图语句,记录accuracy和loss的变化趋势,同时将展示于Scalar和HyperParameters两个界面中:
writer.add_scalar(tag="train/loss", step=step, value=cost)writer.add_scalar(tag="train/acc", step=step, value=accuracy)
- 记录每一批次中的第一张图片:
img = np.reshape(batch[0][0], [28, 28, 1]) * 255writer.add_image(tag="train/input", step=step, img=img)
- 记录训练过程中每一层网络权重(weight)、偏差(bias)的变化趋势:
writer.add_histogram(tag='train/{}'.format(param), step=step, values=values)
- 记录分类效果--precision & recall曲线:
writer.add_pr_curve(tag='train/class_{}_pr_curve'.format(i),labels=label_i,predictions=prediction_i,step=step,num_thresholds=20)writer.add_roc_curve(tag='train/class_{}_pr_curve'.format(i),labels=label_i,predictions=prediction_i,step=step,num_thresholds=20)
- 保存模型结构:
fluid.io.save_inference_model(dirname='./model', feeded_var_names=['img'],target_vars=[predictions], executor=exe)
3.权重可视化
五、总结与升华:
- 本文最重要的地方在于神经网络工作的基本原理,只有搞懂了原理,才能更好地进行超参优化,得到的模型效果才会更好。
- 对于模型组网,最重要的是学会使用SubClass形式组网,使用套件虽然简单,但是可定制化程度较低,如果是科研需要,建议一定要学会用SubClass形式组网。
- 模型训练是本文中最简单的部分,只需要按照文档在操作即可,但是超参数的选择有很多讲究,超参的好坏往往会影响模型的最终结果
- 效果展示是一个项目的加分项,如果是科研需要,那么你也需要可视化地展示你的工作成果,这也是十分重要的
百度飞桨第3课|深度学习模型训练和关键参数调优详解相关推荐
- 笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解
笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解 针对特定场景任务从模型选择.模型训练.超参优化.效果展示这四个方面进行模型开发. 一.模型选择 从任务类型出发,选择最合适的模型. ...
- 深度学习模型训练和关键参数调优详解
深度学习模型训练和关键参数调优详解 一.模型选择 1.回归任务 人脸关键点检测 2.分类任务 图像分类 3.场景任务 目标检测 人像分割 文字识别 二.模型训练 1.基于高层API训练模型 加载数据集 ...
- CSIG AI前沿技术培训首期开讲,携手百度飞桨走进北科大开启深度学习实战
点击左上方蓝字关注我们 人工智能正进入规模化落地阶段,AI人才培养需求成为重中之重.为积极推进校企人才共育,产教深度融合,6月23日,由中国图象图形学学会(CSIG)主办的「AI前沿技术培训系列」活动 ...
- 二、代码实现深度学习道路训练样本数据的制作(代码部分详解)——重复工作+多次返工的血泪史
使用python读取文件夹对图片进行批量裁剪 通过第一部分操作arcgis制作了一部分样本数据 分辨率与原相片保持一致 为6060*6060 具体如图所示: 而我们深度学习一般使用的分辨率是1024和 ...
- 一、使用arcgis进行深度学习道路训练样本数据的制作(arcgis操作详解)——重复工作+多次返工的血泪史
arcgis只保留图片范围内的要素 首先设置个坐标系才好操作 然后如何只保存我需要的范围内的要素 如图,我要只保留图片上的线段 最好是对影像处理 获取其轮廓线,然后再进行裁剪 这里尝试了很多方法,最好 ...
- Intro to Deep Learning Backpropagation 深度学习模型介绍及反向传播算法推导详解
文章目录 往期文章链接目录 Deep Learning v.s. Machine Learning Forward Propagation Loss functions of neural netwo ...
- AI Studio 飞桨 零基础入门深度学习笔记4-飞桨开源深度学习平台介绍
AI Studio 飞桨 零基础入门深度学习笔记4-飞桨开源深度学习平台介绍 深度学习框架 深度学习框架优势 深度学习框架设计思路 飞桨开源深度学习平台 飞桨开源深度学习平台全景 框架和全流程工具 模 ...
- AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型
AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型 波士顿房价预测任务 线性回归模型 线性回归模型的神经网络结构 构建波士顿房价预测任务的神经网络模 ...
- AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理
AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理) 概述 前提条件 读入数据并划分数据集 扩展阅读:为什么学术界的模型总在不断精进呢? 训练样本乱序.生成批次数据 校验数 ...
- AI Studio 飞桨 零基础入门深度学习笔记1-深度学习的定义
AI Studio 飞桨 零基础入门深度学习-笔记 人工智能.机器学习.深度学习的关系 机器学习 机器学习的实现 机器学习的方法论 案例:牛顿第二定律 确定模型参数 模型结构介绍 深度学习 神经网络的 ...
最新文章
- Git 高级用法,喜欢就拿去用!
- Specified key was too long; max key length is 1000 bytes问题解决
- Python基础知识(第十一天)
- python3 从尾部读取_Python3基础:列表详解
- 2021-2022ACM赛季小总结
- 关于“抵制”易语言的通告
- 基于mykernel的时间片轮转调度
- Matlab重建信号实验总结,实验三信号采样与重建(实验报告).doc
- 怎么把照片做成计算机主题,windows10主题制作怎么操作_windows10电脑主题如何自己制作...
- 苹果手机怎么定位安卓手机_苹果AirPods搭配安卓手机怎么样?那是相当好
- 【AAAI 2021】自监督目标检测知识蒸馏:Distilling Localization for Self-Supervised Representation Learning
- 自学c语言从哪开始,C语言从何开始学习
- WEB 网页增加 数字盲水印
- TCP/UDP网络的通信
- 身份证ocr的API接口,让身份证信息录入更快捷
- 设计一个长方体类Cuboid
- 从零开始perp交叉编译及配置
- 如何使用Arthas查看类变量值
- 关于纸质书管理APP的测评
- 【微信小程序】一文带你读懂云开发
热门文章
- Qt三种方式远程连接MySQL数据库(ODBC方式、DSN方式、直连方式)
- 罗振宇跨年演讲之夜 阿里云护航得到App
- 从零开始学android:Android事件处理—单击事件
- 检查计算机课存在的问题,信息技术课堂存在的问题及应对策略
- 【面试总结】五年Java开发者小米、阿里面经
- python 获取li的内容_【师兄带你学Python-5】摆盘齐整的羊肉卷(列表)lt;赠PDF批量转Word代码gt;...
- VMware 16安装CentOS7.9教程
- Fedora 18针​对​系​统​管​理​员​所​做​的​变​更
- 语法基础——C++语法基础
- 推动智慧社区建设,容联“慧眼”上线5类综合改造视觉算法