目录

一、模型选择:

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.模型训练通用配置基本原则

  1. 每个输入数据的维度要保持一致,且一定要和模型输入保持一致。
  2. 配置学习率衰减策略时,训练的上限轮数一定要计算正确。
  3. BatchSize不宜过大,太大容易内存溢出,且一般为2次幂。

三、超参优化:

1.超参优化的基本概念

超参数

模型的超参数指的是模型外部的配置变量,是不能通过训练的进行来估计其取值不同的,且不同的训练任务往往需要不同的超参数。

超参数不同,最终得到的模型也是不同的。

一般来说,超参数有:学习率迭代次数网络的层数每层神经元的个数等等。

常见的超参数有以下三类:

  1. 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函数的类型等 .
  2. 优化参数,包括优化方法、学习率、小批量的样本数量等 .
  3. 正则化系数

实践中,当你使⽤神经⽹络解决问题时,寻找好的超参数其实是一件非常困难的事情,对于刚刚接触的同学来说,都是"佛系调优",这也是一开始就"入土"的原因,没有依据的盲目瞎调肯定是不行的。

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可视化流程

  1. 创建日志文件:

*为了快速找到最佳超参,训练9个不同组合的超参实验,创建方式均相同如下:

writer = LogWriter("./log/lenet/run1")
  1. 训练前记录每组实验的超参数名称和数值,且记录想要展示的模型指标名称
writer.add_hparams({'learning rate':0.0001, 'batch size':64, 'optimizer':'Adam'}, ['train/loss', 'train/acc'])

注意:这里记录的想要展示的模型指标为'train/loss'和 'train/acc',后续切记需要用add_scalar接口记录对应数值

  1. 训练过程中插入作图语句,记录accuracy和loss的变化趋势,同时将展示于Scalar和HyperParameters两个界面中:
writer.add_scalar(tag="train/loss", step=step, value=cost)writer.add_scalar(tag="train/acc", step=step, value=accuracy)
  1. 记录每一批次中的第一张图片:
img = np.reshape(batch[0][0], [28, 28, 1]) * 255writer.add_image(tag="train/input", step=step, img=img)
  1. 记录训练过程中每一层网络权重(weight)、偏差(bias)的变化趋势:
writer.add_histogram(tag='train/{}'.format(param), step=step, values=values)
  1. 记录分类效果--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)
  1. 保存模型结构:
fluid.io.save_inference_model(dirname='./model', feeded_var_names=['img'],target_vars=[predictions], executor=exe)

3.权重可视化


五、总结与升华:

  • 本文最重要的地方在于神经网络工作的基本原理,只有搞懂了原理,才能更好地进行超参优化,得到的模型效果才会更好。
  • 对于模型组网,最重要的是学会使用SubClass形式组网,使用套件虽然简单,但是可定制化程度较低,如果是科研需要,建议一定要学会用SubClass形式组网。
  • 模型训练是本文中最简单的部分,只需要按照文档在操作即可,但是超参数的选择有很多讲究,超参的好坏往往会影响模型的最终结果
  • 效果展示是一个项目的加分项,如果是科研需要,那么你也需要可视化地展示你的工作成果,这也是十分重要的

百度飞桨第3课|深度学习模型训练和关键参数调优详解相关推荐

  1. 笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解

    笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解 针对特定场景任务从模型选择.模型训练.超参优化.效果展示这四个方面进行模型开发. 一.模型选择 从任务类型出发,选择最合适的模型. ...

  2. 深度学习模型训练和关键参数调优详解

    深度学习模型训练和关键参数调优详解 一.模型选择 1.回归任务 人脸关键点检测 2.分类任务 图像分类 3.场景任务 目标检测 人像分割 文字识别 二.模型训练 1.基于高层API训练模型 加载数据集 ...

  3. CSIG AI前沿技术培训首期开讲,携手百度飞桨走进北科大开启深度学习实战

    点击左上方蓝字关注我们 人工智能正进入规模化落地阶段,AI人才培养需求成为重中之重.为积极推进校企人才共育,产教深度融合,6月23日,由中国图象图形学学会(CSIG)主办的「AI前沿技术培训系列」活动 ...

  4. 二、代码实现深度学习道路训练样本数据的制作(代码部分详解)——重复工作+多次返工的血泪史

    使用python读取文件夹对图片进行批量裁剪 通过第一部分操作arcgis制作了一部分样本数据 分辨率与原相片保持一致 为6060*6060 具体如图所示: 而我们深度学习一般使用的分辨率是1024和 ...

  5. 一、使用arcgis进行深度学习道路训练样本数据的制作(arcgis操作详解)——重复工作+多次返工的血泪史

    arcgis只保留图片范围内的要素 首先设置个坐标系才好操作 然后如何只保存我需要的范围内的要素 如图,我要只保留图片上的线段 最好是对影像处理 获取其轮廓线,然后再进行裁剪 这里尝试了很多方法,最好 ...

  6. Intro to Deep Learning Backpropagation 深度学习模型介绍及反向传播算法推导详解

    文章目录 往期文章链接目录 Deep Learning v.s. Machine Learning Forward Propagation Loss functions of neural netwo ...

  7. AI Studio 飞桨 零基础入门深度学习笔记4-飞桨开源深度学习平台介绍

    AI Studio 飞桨 零基础入门深度学习笔记4-飞桨开源深度学习平台介绍 深度学习框架 深度学习框架优势 深度学习框架设计思路 飞桨开源深度学习平台 飞桨开源深度学习平台全景 框架和全流程工具 模 ...

  8. AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型

    AI Studio 飞桨 零基础入门深度学习笔记2-基于Python编写完成房价预测任务的神经网络模型 波士顿房价预测任务 线性回归模型 线性回归模型的神经网络结构 构建波士顿房价预测任务的神经网络模 ...

  9. AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理

    AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理) 概述 前提条件 读入数据并划分数据集 扩展阅读:为什么学术界的模型总在不断精进呢? 训练样本乱序.生成批次数据 校验数 ...

  10. AI Studio 飞桨 零基础入门深度学习笔记1-深度学习的定义

    AI Studio 飞桨 零基础入门深度学习-笔记 人工智能.机器学习.深度学习的关系 机器学习 机器学习的实现 机器学习的方法论 案例:牛顿第二定律 确定模型参数 模型结构介绍 深度学习 神经网络的 ...

最新文章

  1. Git 高级用法,喜欢就拿去用!
  2. Specified key was too long; max key length is 1000 bytes问题解决
  3. Python基础知识(第十一天)
  4. python3 从尾部读取_Python3基础:列表详解
  5. 2021-2022ACM赛季小总结
  6. 关于“抵制”易语言的通告
  7. 基于mykernel的时间片轮转调度
  8. Matlab重建信号实验总结,实验三信号采样与重建(实验报告).doc
  9. 怎么把照片做成计算机主题,windows10主题制作怎么操作_windows10电脑主题如何自己制作...
  10. 苹果手机怎么定位安卓手机_苹果AirPods搭配安卓手机怎么样?那是相当好
  11. 【AAAI 2021】自监督目标检测知识蒸馏:Distilling Localization for Self-Supervised Representation Learning
  12. 自学c语言从哪开始,C语言从何开始学习
  13. WEB 网页增加 数字盲水印
  14. TCP/UDP网络的通信
  15. 身份证ocr的API接口,让身份证信息录入更快捷
  16. 设计一个长方体类Cuboid
  17. 从零开始perp交叉编译及配置
  18. 如何使用Arthas查看类变量值
  19. 关于纸质书管理APP的测评
  20. 【微信小程序】一文带你读懂云开发

热门文章

  1. Qt三种方式远程连接MySQL数据库(ODBC方式、DSN方式、直连方式)
  2. 罗振宇跨年演讲之夜 阿里云护航得到App
  3. 从零开始学android:Android事件处理—单击事件
  4. 检查计算机课存在的问题,信息技术课堂存在的问题及应对策略
  5. 【面试总结】五年Java开发者小米、阿里面经
  6. python 获取li的内容_【师兄带你学Python-5】摆盘齐整的羊肉卷(列表)lt;赠PDF批量转Word代码gt;...
  7. VMware 16安装CentOS7.9教程
  8. Fedora 18针​对​系​统​管​理​员​所​做​的​变​更
  9. 语法基础——C++语法基础
  10. 推动智慧社区建设,容联“慧眼”上线5类综合改造视觉算法