专栏名称: AI开发者
AI研习社,雷锋网旗下关注AI开发技巧及技术教程订阅号。
目录
相关文章推荐
爱可可-爱生活  ·  【[42星]GIDD:一种新型离散扩散模型框 ... ·  22 小时前  
黄建同学  ·  Manus 开发团队成员的回复:这并不复杂 ... ·  2 天前  
黄建同学  ·  昨天最火🔥的是Manus被扒了↓网友Jian ... ·  2 天前  
爱可可-爱生活  ·  [CL]《Leveraging ... ·  2 天前  
51好读  ›  专栏  ›  AI开发者

专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化

AI开发者  · 公众号  · AI  · 2020-02-23 17:00

正文


点击上方“蓝字”关注“AI开发者”


本文来自 @BBuf 的社区专栏 GiantPandaCV ,文末扫码即可订阅专栏。

前言:YOLOv3代码中也提供了参数进化(搜索),可以为对应的数据集进化一套合适的超参数。本文建档分析一下有关这部分的操作方法以及其参数的具体进化方法。

1. 超参数

YOLOv3中的 超参数在train.py中提供,其中包含了一些数据增强参数设置,具体内容如下:

hyp = {'giou': 3.54,  # giou loss gain
      'cls': 37.4,  # cls loss gain
      'cls_pw': 1.0,  # cls BCELoss positive_weight
      'obj': 49.5,  # obj loss gain (*=img_size/320 if img_size != 320)
      'obj_pw': 1.0,  # obj BCELoss positive_weight
      'iou_t': 0.225,  # iou training threshold
      'lr0': 0.00579,  # initial learning rate (SGD=1E-3, Adam=9E-5)
      'lrf': -4.,  # final LambdaLR learning rate = lr0 * (10 ** lrf)
      'momentum': 0.937,  # SGD momentum
      'weight_decay': 0.000484,  # optimizer weight decay
      'fl_gamma': 0.5,  # focal loss gamma
      'hsv_h': 0.0138,  # image HSV-Hue augmentation (fraction)
      'hsv_s': 0.678,  # image HSV-Saturation augmentation (fraction)
      'hsv_v': 0.36,  # image HSV-Value augmentation (fraction)
      'degrees': 1.98,  # image rotation (+/- deg)
      'translate': 0.05,  # image translation (+/- fraction)
      'scale': 0.05,  # image scale (+/- gain)
      'shear': 0.641}  # image shear (+/- deg)

2. 使用方法

在训练的时候,train.py提供了一个可选参数 --evolve , 这个参数决定了是否进行超参数搜索与进化(默认是不开启超参数搜索的)。

具体使用方法也很简单:

python train.py --data data/voc.data
--cfg cfg/yolov3-tiny.cfg
--img-size 416
--epochs 273
--evolve

实际使用的时候,需要进行修改,train.py中的约444行:

for _ in range(1):  # generations to evolve

将其中的1修改为你想设置的迭代数,比如200代,如果不设置,结果将会如下图所示,实际上就是只有一代。

3. 原理

整个过程比较简单,对于进化过程中的新一代,都选了了适应性最高的前一代(在前几代中)进行突变。以上所有的参数将有约20%的 1-sigma的正态分布几率同时突变。

s = 0.2# sigma

整个进化过程需要搞清楚两个点:

  1. 如何评判其中一代的好坏?
  2. 下一代如何根据上一代进行进化?

**第一个问题:**判断好坏的标准。

def fitness(x):
   w = [0.0, 0.0, 0.8, 0.2]
   # weights for [P, R, mAP, F1]@0.5
   return (x[:, :4] * w).sum(1)

YOLOv3进化部分是通过以上的适应度函数判断的,适应度越高,代表这一代的性能越好。而在适应度中,是通过Precision,Recall ,mAP,F1这四个指标作为适应度的评价标准。

其中的w是设置的加权,如果更关心mAP的值,可以提高mAP的权重;如果更关心F1,则设置更高的权重在对应的F1上。这里分配mAP权重为0.8、F1权重为0.2。

**第二个问题:**如何进行进化?

进化过程中有 两个重要的参数 :

第一个参数为 parent , 可选值为 single 或者 weighted ,这个参数的作用是:决定如何选择上一代。如果选择single,代表只选择上一代中最好的那个。

if






请到「今天看啥」查看全文