PaddleClas 主要代码和目录结构如下
- benchmark: 文件夹下存放了一些 shell 脚本,主要是为了测试 PaddleClas 中不同模型的速度指标,如单卡训练速度指标、多卡训练速度指标等。
- dataset:文件夹下存放数据集和用于处理数据集的脚本。脚本负责将数据集处理为适合 Dataloader 处理的格式。
- deploy:部署核心代码,文件夹存放的是部署工具,支持 python/cpp inference、Hub Serveing、Paddle Lite、Slim 离线量化等多种部署方式。
- ppcls:训练核心代码,文件夹下存放 PaddleClas 框架主体。配置文件、模型训练、评估、预测、动转静导出等具体代码实现均在这里。
- tools:训练、评估、预测、模型动转静导出的入口函数和脚本均在该文件下。
- requirements.txt 文件用于安装 PaddleClas 的依赖项。使用 pip 进行升级安装使用。
- tests:PaddleClas 模型从训练到预测的全链路测试,验证各功能是否能够正常使用。
配置文件
# 训练时评估
"""
模型在训练的时候,可以设置模型保存的间隔,也可以选择每隔若干个 epoch 对验证集进行评估,从而可以保存在验证集上精度最佳的模型。配置文件中,可以通过下面的字段进行配置。
"""
Global:
checkpoints: null
pretrained_model: ./output/MobileNetV3_large_x1_0/best_model
# pretrained_model: null
output_dir: ./output/
device: gpu
save_interval: 100 # 模型保存的 epoch 间隔
eval_during_train: True # 是否进行训练时评估
eval_interval: 10 # 评估的 epoch 间隔
epochs: 500
print_batch_step: 10
use_visualdl: False
# used for static mode and model export
image_shape: [3, 224, 224]
save_inference_dir: ./inference
# model architecture
Arch:
name: MobileNetV3_large_x1_0
class_num: 2
# 损失函数
"""
PaddleClas 中,包含了 CELoss, JSDivLoss, TripletLoss, CenterLoss 等损失函数,均定义在 ppcls/loss 中。
在 ppcls/loss/__init__.py 文件中,使用 CombinedLoss 来构建及合并损失函数,不同训练策略中所需要的损失函数与计算方法不同,PaddleClas 在构建损失函数过程中,主要考虑了以下几个因素。
1是否使用 label smooth
2是否使用 mixup 或者 cutmix
3是否使用蒸馏方法进行训练
4是否是训练 metric learning
"""
Loss:
Train:
- CELoss:
weight: 1.0
epsilon: 0.1
Eval:
- CELoss:
weight: 1.0
# 优化器和学习率衰减、权重衰减策略
"""
图像分类任务中,Momentum 是一种比较常用的优化器,PaddleClas 中提供了 Momentum 、 RMSProp、Adam 及 AdamW 等几种优化器策略。
权重衰减策略是一种比较常用的正则化方法,主要用于防止模型过拟合。 PaddleClas 中提供了 L1Decay 和 L2Decay 两种权重衰减策略。
学习率衰减是图像分类任务中必不可少的精度提升训练方法,PaddleClas 目前支持 Cosine, Piecewise, Linear 等学习率衰减策略。
在配置文件中,优化器、权重衰减策略、学习率衰减策略可以通过以下的字段进行配置。
"""
Optimizer:
name: Momentum
momentum: 0.9
lr:
name: Cosine
learning_rate: 0.05
warmup_epoch: 5
regularizer:
name: 'L2'
coeff: 0.00002
# data loader for train and eval
DataLoader:
Train:
dataset:
name: ImageNetDataset
image_root: ../dataset/JiEr_Clas/train
cls_label_path: ../dataset/JiEr_Clas/train/train.txt
# 训练时,标准的数据预处理包含如下五个部分,按照顺序对数据进行如下转换
transform_ops:
- DecodeImage:
to_rgb: True
channel_first: False
- RandCropImage:
size: 224
- RandFlipImage:
flip_code: 1
- AutoAugment:
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
sampler:
name: DistributedBatchSampler
batch_size: 8
drop_last: False
shuffle: True
loader:
num_workers: 2
use_shared_memory: False
Eval:
dataset:
name: ImageNetDataset
image_root: ../dataset/JiEr_Clas/val
cls_label_path: ../dataset/JiEr_Clas/val/val.txt
transform_ops:
- DecodeImage:
to_rgb: True
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
sampler:
name: DistributedBatchSampler
batch_size: 8
drop_last: False
shuffle: False
loader:
num_workers: 2
use_shared_memory: True
Infer:
infer_imgs: docs/images/whl/demo.jpg
batch_size: 10
transforms:
- DecodeImage:
to_rgb: True
channel_first: False
- ResizeImage:
resize_short: 256
- CropImage:
size: 224
- NormalizeImage:
scale: 1.0/255.0
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
order: ''
- ToCHWImage:
PostProcess:
name: Topk
topk: 5
class_id_map_file: ppcls/utils/imagenet1k_label_list.txt
Metric:
Train:
- TopkAcc:
topk: [1, 2]
Eval:
- TopkAcc:
topk: [1, 2]