YOLO模型train.py文件训练参数详解
YOLO模型train.py文件训练参数详解
深度学习
文章目录
- 深度学习
- 前言
- --epochs ,--batch-size和 --patience
- --imgsz
- --rect
- --resume
- --evolve
- --cache
- --image-weights
- --device
- --multi-scale
- --optimizer
- --workers
- --project和--name
- --quad
- --cos-lr
- --label-smoothing
- --freeze
- --save-period
前言
本文将详细介绍YOLO模型训练参数的使用方法,帮助读者更好地理解和使用这些参数。
1. --epochs ,--batch-size和 --patience
--epoch直译为“时期”,在算法中表示模型对整个训练数据集的一次完整迭代。当所有训练样本在神经网络中都进行了一次正向传播和一次反向传播,称为进行了一次epoch。
当1个Epoch(也就是所有的训练样本)数量太过庞大,就需要把它分成多个小块,也就是分成多个Batch 来进行训练。每个batch的大小便称为Batch_Size。
Batch Size合适的优点:
- 通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
- 单个epoch的迭代次数减少了,参数的调整也慢了,假如要达到相同的识别精度,需要更多的epoch。
- 适当Batch Size使得梯度下降方向更加准确。
Batch Size从小到大的变化对网络影响
- 没有Batch Size,梯度准确,只适用于小样本数据库 todo: 何谓“没有Batch Size”?
- Batch Size=1,梯度变来变去,非常不准确,网络很难收敛。
- Batch Size增大,梯度变准确,
- Batch Size增大,梯度已经非常准确,再增加Batch Size也没有用
注意:Batch Size增大了,要到达相同的准确度,必须要增大epoch。
如何找到合适的batch size?
我认为可以使用--patience这个参数, 其作用是:如果模型在default值轮数里没有提升,则停止训练模型。
我们可以给一个很大的epoch去训练,再加上--patience,通过它停止时已训练的epoch数即可得知最佳epoch数。
2. --imgsz
训练集和测试集图片的像素大小;输入默认640*640。
3. --rect
是否采用矩阵推理的方式去训练模型。添加了这个参数就是采用矩阵推理。
矩阵推理不再要求训练的图片是正方形。矩阵推理会加速模型的推理过程,减少一些冗余信息。
下图分别是方形推理方式和矩阵推理方式:
显然矩阵推理的大小和计算量都更小。
4. --resume
断点续训:即在之前训练的一个模型基础上继续训练,默认是 false;
如果想采用断点续训的方式,这里我推荐一种写法,即首先将default=False 改为 default=True 随后在终端中键入如下指令:
python train.py --resume 待训练模型文件路径
输入指令后就可以看到模型是继续从上次结束时开始训练的。
5. --evolve
遗传超参数进化。由于超参数进化会耗费大量的资源和时间,所以建议大家不要动这个参数。
遗传算法是利用种群搜索技术将种群作为一组问题解,通过对当前种群施加类似生物遗传环境因素的选择、交叉、变异等一系列的遗传操作来产生新一代的种群,并逐步使种群优化到包含近似最优解的状态,遗传算法调优能够求出优化问题的全局最优解,优化结果与初始条件无关,算法独立于求解域,具有较强的鲁棒性,适合于求解复杂的优化问题,应用较为广泛。
6. --cache
是否提前缓存图片到内存,默认False。
开启这个参数就会对图片进行缓存,从而更好的训练模型。建议开启。
7. --image-weights
是否启用加权图像策略,默认不开启。
主要是为了解决样本不平衡问题;开启后会对于上一轮训练效果不好的图片,在下一轮中增加一些权重。
8. --device
指定训练使用的硬件设备。
如果使用独立显卡训练,--device 参数通常设置为 --device 0。如果是CUDA兼容的GPU设备,可以使用--device cuda。如果想使用CPU训练,则是--device cpu
9. --multi-scale
是否启用多尺度训练,默认不开启。
多尺度训练是指设置几种不同的图片输入尺度,训练时每隔一定iterations随机选取一种尺度训练,这样训练出来的模型鲁棒性更强。
10. --optimizer
选择优化器;默认为SGD,可选SGD,Adam,AdamW。
SGD适用:
小型数据集和任务:当训练数据较小,且对计算资源要求不高时,SGD可以在较少的计算资源下高效完成训练。
需要高泛化能力的任务:对于需要较强泛化能力的任务,尤其是在数据量较大时,SGD可能比其他优化器效果更好。
大规模训练:对于大规模训练(例如使用大数据集进行训练),SGD的计算效率较高,且可以通过小批量数据来提升训练速度。
Adam适用:
大规模数据和复杂网络:Adam在大规模数据集(如图像分类、NLP任务)和深度神经网络(如Transformer、BERT等)中表现较好。
稀疏梯度任务:Adam在处理稀疏数据(如NLP任务中词嵌入的训练)时效果较好。
快速实验和原型开发:如果你需要快速训练模型,Adam是一个不错的选择,因为它在大多数任务中通常能更快收敛。
AdamW适用:
需要正则化的任务:在许多现代神经网络训练中,AdamW被认为是训练深度学习模型(尤其是大型模型)时更合适的优化器,尤其当你需要更有效的权重衰减时。
深度神经网络:如Transformer架构、BERT等大型模型,AdamW通常表现更好,尤其在需要较强正则化时。
11. --workers
最大worker数量,默认值为8。
它定义了有多少个进程用于并行加载训练数据。它是一个整数,通常建议设置为机器的CPU核心数的1/2或1/4。如果你的GPU计算能力较强,但数据加载速度成为瓶颈,则增加--workers数量可以提高训练效率。但是,如果数据集较小或I/O带宽不足,增加进程数可能不会带来太大提升,甚至可能因CPU资源过度占用而降低性能。
12. --project和--name
--project指定训练好的模型的保存路径;默认在runs/train
--name设定保存的模型文件夹名,默认在exp
13. --quad
--quad参数用于启用四倍数据并行。该参数主要在多GPU训练时使用,旨在优化训练效率,尤其是在大规模训练和分布式训练场景下。
14. --cos-lr
--cos-lr参数用于启用余弦退火学习率调度器。
该参数的作用是动态调整学习率,在训练过程中使用余弦退火的方式逐步降低学习率,以促进模型的收敛并提高最终的性能。启用后,学习率逐步减小,训练得到的模型适应性强。但是对于小规模数据集,性能的提升可能并不明显,却会花费更长的训练时间。
15. --label-smoothing
是否对标签进行平滑处理,默认不启用。
在训练样本中,我们并不能保证所有sample都标注正确,如果某个样本标注错误,就可能产生负面印象,如果我们有办法“告诉”模型,样本的标签不一定正确(比如说告诉模型只有0.95概率是那个标签),那么训练出来的模型对于少量的样本错误就会有“免疫力”。
16. --freeze
冻结某些层的权重,以防止它们在训练过程中进行更新。据说可以防止过拟合,但是我目前还用不到吧。
17. --save-period
用于设置每隔多少个epoch保存一次权重。
对于长时间训练任务来说,这个参数可以防止模型训练意外中断后从头来过。