Kaggle知識點:YOLO V5 超參數優化

超參數優化方法

https://en.wikipedia.org/wiki/Hyperparameter_optimization

深度學習(xi) 模型超參數優(you) 化是指通過調整模型的超參數(即不由模型自身學習(xi) 的參數)來改善模型的性能和泛化能力。超參數包括學習(xi) 率、批次大小、層的數量和大小、正則化參數等。

超參數優(you) 化可以被視為(wei) 在超參數空間中搜索最優(you) 解的過程。超參數空間由各種超參數的取值範圍組成,搜索的目標是找到最佳的超參數組合,使得模型在給定任務和數據集上達到最佳性能。

此外超參數優(you) 化是一個(ge) 迭代的過程,目標是找到一組最佳的超參數配置,以最大程度地提高模型的性能。以下是一些常見的超參數優(you) 化方法:

  1. 網格搜索(Grid Search):遍曆預定義的超參數組合,通過交叉驗證或驗證集上的性能評估來確定最佳組合。這種方法適用於超參數空間較小的情況,但當超參數數量增加時,計算成本會急劇增加。
  2. 隨機搜索(Random Search):隨機選擇一組超參數組合,並通過性能評估來選擇最佳組合。相對於網格搜索,隨機搜索可以更好地處理超參數空間較大的情況,並且通常具有更高的效率。
  3. 貝葉斯優化(Bayesian Optimization):使用貝葉斯方法建立超參數與模型性能之間的函數關係,通過不斷選擇具有最大期望改進的超參數進行迭代優化。貝葉斯優化通常能夠在相對較少的迭代次數內找到更好的超參數組合。
  4. 梯度優化(Gradient-based Optimization):將超參數優化問題轉化為梯度優化問題,通過計算超參數對模型性能的梯度來更新超參數。這種方法需要模型性能關於超參數的梯度信息,通常需要更複雜的推導和計算。
  5. 自動機器學習(AutoML):使用自動化工具和算法搜索超參數空間,以找到最佳的超參數組合。AutoML方法結合了以上的方法,並引入了自動化的流程來加速超參數搜索和模型選擇過程。
  6. 遺傳算法(Evolutionary optimization):將超參數組合看作是個體,並通過遺傳算法的操作(如選擇、交叉和變異)來模擬進化過程。初始時,隨機生成一組超參數組合作為種群,並通過交叉和變異等操作生成新的個體。
  7. 早停法(Early stopping-based):根據驗證集上的性能指標(如驗證誤差或準確率)來監控模型的訓練過程。訓練過程中,如果驗證集上的性能指標在一定輪次內不再改善或開始出現下降趨勢,就可以停止訓練,避免過擬合。

YOLO V5 超參數

https://raw.githubusercontent.com/ultralytics/yolov5/master/train.py

  • weights:初始權重路徑,指定用於模型初始化的權重文件的路徑。
  • cfg:模型配置文件的路徑,指定用於定義模型結構的配置文件。
  • data:數據集配置文件的路徑,指定用於加載訓練和驗證數據的配置文件。
  • hyp:超參數文件的路徑,指定包含訓練過程中的超參數設置的文件。
  • epochs:總的訓練輪數,指定要執行的訓練迭代次數。
  • batch-size:每個批次的圖像數量,指定每個訓練批次中要使用的圖像數目。
  • imgsz:訓練和驗證圖像的尺寸(像素),指定用於訓練和驗證的圖像的大小。
  • rect:是否進行矩形訓練,如果啟用,則在訓練過程中將圖像調整為固定的矩形尺寸。
  • resume:是否恢複最近的訓練,如果設置為True,則會自動加載最近的訓練檢查點並繼續訓練。
  • nosave:是否隻保存最終的檢查點,如果啟用,則隻保存最後一個訓練輪次的模型檢查點。
  • noval:是否隻驗證最終的訓練輪次,如果啟用,則隻在最後一個訓練輪次進行驗證。
  • noautoanchor:是否禁用自動錨框的計算。
  • noplots:是否保存不生成任何圖表文件。
  • evolve:進化超參數的代數數目,指定要對超參數進行進化優化的代數數目。
  • bucket:gsutil存儲桶的名稱,指定要將訓練結果上傳到的存儲桶。
  • cache:圖像緩存方式,指定訓練過程中使用的圖像緩存方式(ram或disk)。
  • image-weights:是否在訓練中使用加權圖像選擇。
  • device:設備選擇,指定要在哪個設備上進行訓練(cuda設備或CPU)。
  • multi-scale:是否在訓練過程中使用多尺度數據增強。
  • single-cls:是否將多類別數據訓練為單類別。
  • optimizer:優化器選擇,指定要使用的優化器(SGD、Adam或AdamW)。
  • sync-bn:是否使用同步批歸一化,在DDP模式下可用。
  • workers:最大數據加載器工作線程數目(DDP模式下每個RANK的最大工作線程數)。
  • project:保存路徑的項目名稱,指定保存訓練結果的項目名稱。
  • name:保存路徑的實驗名稱,指定保存訓練結果的實驗名稱。
  • exist-ok:是否允許使用已存在的項目和實驗名稱,如果啟用,則不會增加新的編號。
  • quad:是否使用四通道數據加載器。
  • cos-lr:是否使用餘弦學習率調度程序。
  • label-smoothing:標簽平滑的ε值,指定用於標簽平滑的ε值。
  • patience:EarlyStopping的等待次數(未改進的訓練輪次數)。
  • freeze:凍結層的索引列表,指定要凍結的網絡層。
  • save-period:每隔多少輪保存一次檢查點(如果小於1,則禁用保存)。
  • seed:全局訓練種子,指定用於訓練的隨機種子。
  • local_rank:自動DDP多GPU參數,不要修改。

YOLO V5 訓練建議

https://docs.ultralytics.com/yolov5/tutorials/tips_for_best_training_results/

如果數據集足夠大且標注良好,那麽(me) 在不改變模型或訓練設置的情況下,通常可以獲得良好的結果。如果一開始沒有獲得良好的結果,則可以采取一些措施來改善,但始終建議用戶首先使用默認YOLO V5設置進行訓練,然後再考慮是否進行任何更改。這有助於(yu) 建立性能基線並找出改進的方向。

如果對訓練結果有疑問,建議從(cong) 結果圖表(訓練損失、驗證損失、P、R、mAP)、PR曲線、混淆矩陣、訓練集合成圖像、測試結果以及數據集統計圖像中尋找答案。

數據集

  • 每類圖像:推薦每類至少1500張圖像。
  • 每類實例:推薦每類至少10000個實例(有標簽的對象)。
  • 圖像的多樣性:對於真實世界的使用情況,建議使用不同時間、不同季節、不同天氣、不同光照、不同角度、不同來源(在線獲取、本地采集、不同相機)的圖像等。
  • 標簽一致性:所有圖像中所有類別的實例必須都有標簽。部分標注將無法工作。
  • 標簽準確性:標簽必須緊密包圍每個對象。對象與其邊界框之間不應有空白。沒有對象應該缺少標簽。
  • 標簽驗證:在訓練開始時查看train_batch*.jpg以驗證標簽是否正確,即查看示例的合成圖像。
  • 背景圖像:背景圖像是沒有對象的圖像,將其添加到數據集中以減少誤報(FP)。

Kaggle知識點:YOLO V5 超參數優(you) 化

模型結構

較大的模型(如YOLOv5x和YOLOv5x6)在幾乎所有情況下都能產(chan) 生更好的結果,但是參數更多,訓練時需要更多的CUDA內(nei) 存,並且運行速度較慢。對於(yu) 移動部署,推薦使用YOLOv5s/m,對於(yu) 雲(yun) 端部署,推薦使用YOLOv5l/x。

Kaggle知識點:YOLO V5 超參數優(you) 化

在小到中等規模的數據集上訓練,建議直接使用訓練模型參數。

python train.py --data custom.yaml --weights yolov5s.pt                                              yolov5m.pt                                              yolov5l.pt                                              yolov5x.pt                                              custom_pretrained.pt

在大型數據集(如COCO、Objects365、OIv6)上訓練,建議可以考慮指定網絡結構從(cong) 頭訓練。

調參方法

在修改任何設置之前,首先使用默認設置進行訓練,以建立性能基準。

  • 訓練輪數:從300輪開始。如果早期出現過擬合,可以減少輪數。如果在300輪之後沒有出現過擬合,可以繼續訓練更多輪次,例如600、1200等。
  • 圖像大小:COCO數據集以640的本機分辨率進行訓練,但由於數據集中有大量小物體,因此可以嚐試更高分辨率的訓練,例如1280。如果數據集中有許多小物體,自定義數據集將受益於以本機分辨率或更高分辨率進行訓練。最佳的推理結果可以在與訓練時相同的。
  • Batch size:使用硬件允許的最大的batch size。太小的batch size會導致不良的批歸一化統計結果,
  • 超參數:默認的超參數在hyp.scratch-low.yaml文件中。我們建議在考慮修改任何超參數之前先使用默認超參數進行訓練。通常情況下,增加數據增強的超參數可以減少和延遲過擬合,從而實現更長的訓練和更高的最終mAP。

YOLO V5 遺傳優化

https://docs.ultralytics.com/yolov5/tutorials/hyperparameter_evolution/

YOLO自帶了使用遺傳(chuan) 算法(GA)進行優(you) 化的超參數優(you) 化的教程,也是推薦大家來進行使用。

默認超參數

YOLOv5使用大約30個(ge) 超參數來進行各種訓練設置。這些超參數在/data/hyps目錄下的*.yaml文件中進行定義(yi) 。更好的初始猜測將產(chan) 生更好的最終結果,但在進行進化之前正確初始化這些值非常重要。

定義適應度

適應度是我們(men) 希望最大化的值。在YOLOv5中,我們(men) 定義(yi) 了一個(ge) 默認的適應度函數,它是一組指標的加權組合:mAP@0.5貢獻10%的權重,mAP@0.5:0.95貢獻剩餘(yu) 的90%,其中精確率P和召回率R沒有被考慮進來。您可以根據需要調整這些權重。

def fitness(x): # 將模型的適應度定義(yi) 為(wei) 指標的加權組合 w = [0.0, 0.0, 0.1, 0.9] # [P, R, mAP@0.5, mAP@0.5:0.95] 的權重 return (x[:, :4] * w).sum(1)

演化搜索

通過添加--evolve參數,可以啟動超參數的進化過程,使用遺傳(chuan) 算法來搜索更優(you) 的超參數配置。

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve

默認的進化設置將運行基礎場景300次,即進行300代的進化。您可以通過--evolve參數來修改代數,例如python train.py --evolve 1000。

主要的遺傳(chuan) 操作包括交叉和突變。在這個(ge) 工作中,使用突變操作,以前幾代中最好的父代為(wei) 基礎,以80%的概率和0.04的變異率生成新的後代。結果將記錄在runs/evolve/exp/evolve.csv中。

Kaggle知識點:YOLO V5 超參數優(you) 化

YOLO V5默認超參數

無數據增強版本

https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.no-augmentation.yaml

# YOLOv5 ? by Ultralytics, AGPL-3.0 license # Hyperparameters when using Albumentations frameworks # python train.py --hyp hyp.no-augmentation.yaml # See https://github.com/ultralytics/yolov5/pull/3882 for YOLOv5 + Albumentations Usage examples

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) lrf: 0.1 # final OneCycleLR learning rate (lr0 * lrf) momentum: 0.937 # SGD momentum/Adam beta1 weight_decay: 0.0005 # optimizer weight decay 5e-4 warmup_epochs: 3.0 # warmup epochs (fractions ok) warmup_momentum: 0.8 # warmup initial momentum warmup_bias_lr: 0.1 # warmup initial bias lr box: 0.05 # box loss gain cls: 0.3 # cls loss gain cls_pw: 1.0 # cls BCELoss positive_weight obj: 0.7 # obj loss gain (scale with pixels) obj_pw: 1.0 # obj BCELoss positive_weight iou_t: 0.20 # IoU training threshold anchor_t: 4.0 # anchor-multiple threshold # anchors: 3  # anchors per output layer (0 to ignore) # this parameters are all zero since we want to use albumentation framework fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5) hsv_h: 0 # image HSV-Hue augmentation (fraction) hsv_s: 0 # image HSV-Saturation augmentation (fraction) hsv_v: 0 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (+/- deg) translate: 0 # image translation (+/- fraction) scale: 0 # image scale (+/- gain) shear: 0 # image shear (+/- deg) perspective: 0.0 # image perspective (+/- fraction), range 0-0.001 flipud: 0.0 # image flip up-down (probability) fliplr: 0.0 # image flip left-right (probability) mosaic: 0.0 # image mosaic (probability) mixup: 0.0 # image mixup (probability) copy_paste: 0.0 # segment copy-paste (probability)

輕度數據增強版本

https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.scratch-low.yaml

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf) momentum: 0.937 # SGD momentum/Adam beta1 weight_decay: 0.0005 # optimizer weight decay 5e-4 warmup_epochs: 3.0 # warmup epochs (fractions ok) warmup_momentum: 0.8 # warmup initial momentum warmup_bias_lr: 0.1 # warmup initial bias lr box: 0.05 # box loss gain cls: 0.5 # cls loss gain cls_pw: 1.0 # cls BCELoss positive_weight obj: 1.0 # obj loss gain (scale with pixels) obj_pw: 1.0 # obj BCELoss positive_weight iou_t: 0.20 # IoU training threshold anchor_t: 4.0 # anchor-multiple threshold # anchors: 3  # anchors per output layer (0 to ignore) fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5) hsv_h: 0.015 # image HSV-Hue augmentation (fraction) hsv_s: 0.7 # image HSV-Saturation augmentation (fraction) hsv_v: 0.4 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (+/- deg) translate: 0.1 # image translation (+/- fraction) scale: 0.5 # image scale (+/- gain) shear: 0.0 # image shear (+/- deg) perspective: 0.0 # image perspective (+/- fraction), range 0-0.001 flipud: 0.0 # image flip up-down (probability) fliplr: 0.5 # image flip left-right (probability) mosaic: 1.0 # image mosaic (probability) mixup: 0.0 # image mixup (probability) copy_paste: 0.0 # segment copy-paste (probability)

中度數據增強版本

https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.scratch-med.yaml

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) lrf: 0.1 # final OneCycleLR learning rate (lr0 * lrf) momentum: 0.937 # SGD momentum/Adam beta1 weight_decay: 0.0005 # optimizer weight decay 5e-4 warmup_epochs: 3.0 # warmup epochs (fractions ok) warmup_momentum: 0.8 # warmup initial momentum warmup_bias_lr: 0.1 # warmup initial bias lr box: 0.05 # box loss gain cls: 0.3 # cls loss gain cls_pw: 1.0 # cls BCELoss positive_weight obj: 0.7 # obj loss gain (scale with pixels) obj_pw: 1.0 # obj BCELoss positive_weight iou_t: 0.20 # IoU training threshold anchor_t: 4.0 # anchor-multiple threshold # anchors: 3  # anchors per output layer (0 to ignore) fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5) hsv_h: 0.015 # image HSV-Hue augmentation (fraction) hsv_s: 0.7 # image HSV-Saturation augmentation (fraction) hsv_v: 0.4 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (+/- deg) translate: 0.1 # image translation (+/- fraction) scale: 0.9 # image scale (+/- gain) shear: 0.0 # image shear (+/- deg) perspective: 0.0 # image perspective (+/- fraction), range 0-0.001 flipud: 0.0 # image flip up-down (probability) fliplr: 0.5 # image flip left-right (probability) mosaic: 1.0 # image mosaic (probability) mixup: 0.1 # image mixup (probability) copy_paste: 0.0 # segment copy-paste (probability)

重度數據增強版本

https://github.com/ultralytics/yolov5/blob/master/data/hyps/hyp.scratch-high.yaml

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3) lrf: 0.1 # final OneCycleLR learning rate (lr0 * lrf) momentum: 0.937 # SGD momentum/Adam beta1 weight_decay: 0.0005 # optimizer weight decay 5e-4 warmup_epochs: 3.0 # warmup epochs (fractions ok) warmup_momentum: 0.8 # warmup initial momentum warmup_bias_lr: 0.1 # warmup initial bias lr box: 0.05 # box loss gain cls: 0.3 # cls loss gain cls_pw: 1.0 # cls BCELoss positive_weight obj: 0.7 # obj loss gain (scale with pixels) obj_pw: 1.0 # obj BCELoss positive_weight iou_t: 0.20 # IoU training threshold anchor_t: 4.0 # anchor-multiple threshold # anchors: 3  # anchors per output layer (0 to ignore) fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5) hsv_h: 0.015 # image HSV-Hue augmentation (fraction) hsv_s: 0.7 # image HSV-Saturation augmentation (fraction) hsv_v: 0.4 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (+/- deg) translate: 0.1 # image translation (+/- fraction) scale: 0.9 # image scale (+/- gain) shear: 0.0 # image shear (+/- deg) perspective: 0.0 # image perspective (+/- fraction), range 0-0.001 flipud: 0.0 # image flip up-down (probability) fliplr: 0.5 # image flip left-right (probability) mosaic: 1.0 # image mosaic (probability) mixup: 0.1 # image mixup (probability) copy_paste: 0.1 # segment copy-paste (probability)

【競賽報名/項目谘詢+微信:mollywei007】

上一篇

6.3大陸雅思大作文8分範文及解析:老年人運動的問題

下一篇

香港浸會大學在內地相當於什麽水平?等同於211還是雙非?

你也可能喜歡

  • 暫無相關文章!

評論已經被關(guan) 閉。

插入圖片
返回頂部