1、Fine-tune其他任务
使用预训练模型fine-tune其他任务时,可以直接加载预训练模型,形状不匹配的参数将自动忽略,例如:
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u tools/train.py -c configs/faster_rcnn_r50_1x.yml -o pretrain_weights=output/faster_rcnn_r50_1x/model_final
也可以显示的指定忽略参数名,可采用如下两种方式:
(1)在YAML配置文件中设置finetune_exclude_pretrained_params
(2)在命令行中添加-o finetune_exclude_pretrained_params对预训练模型进行选择性加载。
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python -u tools/train.py -c configs/faster_rcnn_r50_1x.yml \
-o pretrain_weights=output/faster_rcnn_r50_1x/model_final \
finetune_exclude_pretrained_params=['cls_score','bbox_pred']
2、混合精度训练
混合精度训练会降低mAP值,但是在训练速度上会有所提升(速度和精度trade-off较好的一种策略)。通过设置 --fp16 命令行选项可以启用混合精度训练。目前混合精度训练已经在Faster-FPN, Mask-FPN 及 Yolov3 上进行验证,几乎没有精度损失(小于0.2 mAP)。可使用多进程方式来进一步加速混合精度训练。示例如下:
python -m paddle.distributed.launch --selected_gpus 0,1,2 tools/train.py --fp16 -c configs/faster_rcnn_r50_fpn_1x.yml
如果训练loss出现NaN现象,可调节–loss_scale参数(在train.py脚本中的参数处理部分;调小),还可以将配置文件中的norm-type由affine_channel改为bn
3、生成适合自己数据集的Anchor
python tools/anchor_cluster.py -c configs/ppyolo/ppyolo.yml -n 9 -s 608 -m v2 -i 1000
目前anchor_cluster.py支持的主要参数配置如下表所示:
参数 用途 默认值 备注
-c/–config 模型的配置文件 无默认值 必须指定
-n/–n 聚类的簇数 9 Anchor的数目
-s/–size 图片的输入尺寸 None 若指定,则使用指定的尺寸,如果不指定, 则尝试从配置文件中读取图片尺寸
-m/–method 使用的Anchor聚类方法 v2 目前只支持yolov2/v5的聚类算法
-i/–iters kmeans聚类算法的迭代次数 1000 kmeans算法收敛或者达到迭代次数后终止
-gi/–gen_iters 遗传算法的迭代次数 1000 该参数只用于yolov5的Anchor聚类算法
-t/–thresh Anchor尺度的阈值 0.25 该参数只用于yolov5的Anchor聚类算法
4、训练轮数与学习率等参数设置
根据训练集数量与总batch_size大小计算epoch数,然后将epoch数换算得到训练总轮数max_iters。milestones(学习率变化界限)也是同理。
(1)原配置文件中总batch_size=2*8=16(8卡训练),训练集数量约为12万张,max_iters=90000,所以epoch数=16x90000/120000=12。
(2)在AI识虫数据集中,训练集数量约为1700,在单卡GPU上训练,max_iters=12x1700/2=10200。同理计算milestones为: [6800, 9000]。
(3)学习率与GPU数量呈线性变换关系,如果GPU数量减半,那么学习率也将减半。由于PaddleDetection中的faster_rcnn_r50_fpn模型是在8卡GPU环境下训练得到的,所以我们要将学习率除以8: