百度飞桨学习笔记之深度学习模型训练和关键参数调优详解
1、深度学习模型训练前置基础
1.1 什么是人工智能?
我们追求的智能是什么?
生物的行为取决于两件事:后天学习 先天的本能
飞桨:源于产业实践的开源深度学习的平台
2、模型的选择
从任务类型出发 选择最合适的模型
2.1 回归任务
示例:人脸关键点检测
人脸关键点检测任务中,输出为 人脸关键点的数量x2,即每个人脸关键点的横坐标与纵坐标。在模型组网时,主要使用2个模块,分别是Inception模块和空间注意力模块。增加空间注意力模块是为了提高模型效果。
· Inception模块
GoogLeNet是由Inception模块进行组成的,GoogLeNet采用了模块化的结构,因此修改网络结构时非常简单方便。
· 空间注意力模块
· 空间注意力聚焦在“哪里”是最具信息量的部分。计算空间注意力的方法是沿着通道轴应用平均池化和最大池操作,然后将它们连接起来生成一个有效的特征描述符。
2.2 分类任务
CIFAR-10数据集也是分类任务中一个非常经典的数据集,在科研中,常常使用CIFAR数据集评估算法的性能。
图像分类
示例:
基于CIFAR-10数据集实现图像10分类。项目完整代码详见:从论文到代码深入解析带有门控单元的gMLP算法 gMLP中,最核心的部分就是空间选通单元(Spatial Gating Unit,SGU),它的结构如下图所示:
2.3 场景任务
这里说的场景任务是针对某一个特定的场景开发的深度学习任务,相比于回归和分类任务来说,场景任务的难度更高。这里说的场景任务包括但不限于目标检测、图像分割、文本生成、语音合成、强化学习等。
PaddleX模型库(https://paddlex.readthedocs.io/zh_CN/develop/appendix/model_zoo.html )
PaddleGAN模型库
(https://gitee.com/paddlepaddle/PaddleGAN/blob/master/docs/zh_CN/apis/apps.md)
PaddleOCR模型库
(https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/models_list.md)
PaddleHub模型库(https://www.paddlepaddle.org.cn/hublist)
目标检测
示例:基于PaddleX的YOLOv3模型快速实现昆虫检测
(https://aistudio.baidu.com/aistudio/projectdetail/442375)。
人像分割
基于PaddleX核心分割模型 Deeplabv3+Xcetion65 & HRNet_w18_small_v1 实现人像分割,PaddleX提供了人像分割的预训练模型,可直接使用,当然也可以根据自己的数据做微调。
简单的步骤:
1、下载PaddleX源码:
!git clone https://gitee.com/PaddlePaddle/PaddleX
2、下载预训练模型的代码位于PaddleX/examples/human_segmentation,进入该目录,并下载预训练模型:
%cd PaddleX/examples/human_segmentation
!python pretrain_weights/download_pretrain_weights.py
3、对人像视频进行分割处理:
!python video_infer.py --model_dir pretrain_weights/humanseg_mobile_inference --video_path data/test.mp4
4、预测结果会保存到output文件夹下的result.avi文件里。
文字识别
基于chinese_ocr_db_crnn_mobile实现文字识别,识别图片当中的汉字,该Module是一个超轻量级中文OCR模型,支持直接预测。
示例:
1、安装文字识别模型以及必要的资源库:
!hub install chinese_ocr_db_crnn_mobile==1.1.2
!pip install shapely
!pip install pyclipper
2 调用预训练模型进行预测:
import paddlehub as hubimport cv2
ocr = 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)
3、模型训练
仅基于原生Python和Numpy看模型训练基本原理:神经网络梯度下降原理
3、1.基于高层API训练模型
通过Model.prepare接口来对训练进行提前的配置准备工作,包括设置模型优化器,Loss计算方法,精度计算方法等。
import paddle
# 使用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)
加载数据集
......
模型封装
以使用paddle.Model完成模型的封装,将网络结构组合成一个可快速使用高层API进行训练和预测的对象。代码如下:
In [ ]
model = paddle.Model(gmlp_vision)
训练参数配置
用paddle.Model完成模型的封装后,在训练前,需要对模型进行配置,通过Model.prepare接口来对训练进行提前的配置准备工作,包括设置模型优化器,Loss计算方法,精度计算方法等。
callback = paddle.callbacks.VisualDL(log_dir='gMLP_log_dir')
def create_optim(parameters):
step_each_epoch = len(trainloader) // 128
lr=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))) # 评估指标
模型训练
做好模型训练的前期准备工作后,调用fit()接口来启动训练过程,需要指定至少3个关键参数:训练数据集,训练轮次和单次训练数据批次大小。
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, v
erbose=1)
.....
3、2 使用PaddleX训练模型
YOLOv3模型的训练接口示例,函数内置了piecewise学习率衰减策略和momentum优化器。
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)
4、超参优化
4.1、超参优化的基本概念
参数
参数是机器学习算法的关键,是从训练数据中学习到的,属于模型的一部分。
输入一个值(x),乘以权重,结果就是网络的输出值。权重可以随着网络的训练进行更新,从而找到最佳的值,这样网络就能尝试匹配输出值与目标值。
这里的权重其实就是一种参数。
超参数
模型的超参数指的是模型外部的配置变量,是不能通过训练的进行来估计其取值不同的,且不同的训练任务往往需要不同的超参数。
超参数不同,最终得到的模型也是不同的。
一般来说,超参数有:学习率,迭代次数,网络的层数,每层神经元的个数等等。
常见的超参数有以下三类:
1、网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等 .
2、优化参数,包括优化方法、学习率、小批量的样本数量等 .
3、正则化系数
4.2.手动调整超参数的四大方法
1)使用提前停止来确定训练的迭代次数
2)让学习率从高逐渐降低
3)宽泛策略
4)小批量数据(mini-batch)大小不必最优