paddlepaddle训练网络的基本流程二(进阶Paddle-detection框架)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
paddlepaddle训练⽹络的基本流程⼆(进阶Paddle-detection框架)
包含项⽬结构、整体训练流程、训练调⽤细节
⽬的仅为梳理paddle在⽬标检测⽅⾯的训练流程以及调⽤细节,详见官⽅⽂档及代码
Paddle-detection框架
⾸先,观察整个项⽬的⽬录结构:
静态图选择配置模型在configs中,⽀持数据类型在dataset中,所有模型具体代码在ppdet中,数据加载处理部分在ppdet/data中,slim是模型蒸馏压缩,tools是常⽤的训练⽂件(包含train.py,eval.py,infer.py等),
dygraph即动态图部分,配置⽐上述静态图简单的多,与pytorch类似不做过多介绍。
pdpd配置⽂件:
Paddle-detection⾥⾯采⽤⽐较灵活的config设置,要记住⾮常多的设置都是在config⾥调整的,⼀套config设置联系了训练⽂件、模型、模型的结构、数据集、评估等系统。
从⾃动化和静态分析的原则出发,PaddleDetection采⽤了⼀种⽤户友好、易于维护和扩展的配置设计。
利⽤Python的反射机制,
PaddleDection的配置系统从Python类的构造函数抽取多种信息 - 如参数名、初始值、参数注释、数据类型(如果给出type hint)- 来作为配置规则。
这种设计便于设计的模块化,提升可测试性及扩展性。
简单地说就是类上⽅有装饰器函数,类内有__inject__等定义具体的配置参数。
⽬标检测的完整流程:
1.准备数据
2.模型选择(选择、修改config⽂件)
3.训练
4.评估和推理
5.模型压缩以及部署
1.数据相关
数据配置部分都在config⽬录中每个模型的配置⽂件中reader项,包括(TrainReader,EvalReader,TestReader)
具体如何准备训练数据参照:(⽀持coco\voc\⾃定义)
2.模型选择(选择、修改config⽂件)
⼀级⽂件夹代表可⽤模型,⼆级代表不同配置(例如backbone不同)
参照中每个模型的具体参数(推理时间、准确率等),选择合适的模型
常改的参数包括:max_iters、num_classes、LearningRate、dataset路径、batch-size 3.开始训练
python tools/train.py -c configs/yolov3_mobilenet_v1_roadsign.yml -o use_gpu=true --eval
利⽤tools/train.py启动训练,参数带上configs⽂件等
多卡使⽤tools/train_multi_machine.py训练
python -m unch \
--selected_gpus 0,1,2,3,4,5,6,7 \
tools/train_multi_machine.py \
-c configs/yolov3_mobilenet_v1_roadsign.yml
4.评估推理
利⽤tools/eval.py以及infer.py进⾏评估以及推理
5.模型压缩以及部署
压缩部分在slim⽂件夹⾥,包含剪枝、蒸馏、量化等操作,加速模型推理。
部署部分参考,⽀持服务端、移动端、嵌⼊式多种⽅式,⽀持python\c++部署
使⽤tools/export_serving_model.py导出模型时,即可使⽤PaddleServing部署⽅式直接部署。
训练时调⽤细节(以ppyolo模型为例)
⾸先从训练⽂件train.py找起
加载全局配置⽂件,解析传⼊的ppyolo.yml,配置各种运⾏环境。
构建program,获取模型结构,损失函数、优化器等
初始化以及编译program
创建reader
执⾏训练
再从模型⽂件yolo.py找起
位于ppdet\modeling\architectures\yolo.py
定义了yolov3的结构,主要分为backbone、yolo_head、yolo_loss⼏部分,可参考ppyolo的结构图:
每个模型中包含build、build_inputs函数,在训练时主要调⽤这两个函数。
build_inputs是定义模型输⼊的函数,在这⾥可以认为是feed_var
build函数主要是定义如何从inputs获得outputs的过程,中间经历了什么算⼦。
⼀般是inputs通过backbone、neck、head得到loss,backbone定义在ppdet/modeling/backbones 中,
neck即类fpn操作也是在ppdet/modeling/backbones中,head存在ppdt/modeling/anchor_heads中。
整个modeling的⽬录定义了⾮常全的结构:
再从数据配置找起:
在train.py中定义的train_reader,调⽤了ppdet/data/reader中的create_reader函数
此函数中实例化⼀个reader对象,reader类中包含了各种对于数据的处理(获取参数、数据增强、预加载、返回batch等等)。
config⽂件中对于数据集的数据增强
对照reader类中transforms属性,
最后调⽤_reader函数返回训练数据。
训练时互相调⽤的关系、位置⼤概就是这样,先有⼤致印象,具体参照完整代码理解更佳。