コンテンツへスキップ

ハイパーパラメーターの進化

📚 このガイドでは、YOLOv5 🚀 のハイパーパラメータ進化について説明します。ハイパーパラメータ進化とは、最適化にGA(遺伝的アルゴリズム)を用いたハイパーパラメータ最適化の手法です。

MLにおけるハイパーパラメータは学習の様々な側面を制御するものであり、その最適値を見つけることは困難である。グリッド探索のような伝統的な手法は、1)高次元の探索空間、2)次元間の未知の相関、3)各点でのフィットネス評価にコストがかかる、などの理由ですぐに実行不可能になる。

始める前に

レポをクローンし、requirements.txtをPython>=3.8.0環境にインストールする。 PyTorch>=1.8.モデルとデータセットは、最新のYOLOv5 リリースから自動的にダウンロードされます。

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

1.ハイパーパラメーターを初期化する

YOLOv5 には、さまざまな学習設定に使われる約30のハイパーパラメータがある。これらは *.yaml ファイルを /data/hyps ディレクトリにある。より良い初期推測はより良い最終結果を生むので、進化させる前にこれらの値を適切に初期化することが重要である。疑問がある場合は、YOLOv5 COCOトレーニングに最適化されたデフォルト値を使用してください。

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials

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)

2.フィットネスの定義

フィットネスとは、我々が最大化しようとする値である。YOLOv5 では、デフォルトのフィットネス関数をメトリクスの重み付けされた組み合わせとして定義しています: mAP@0.5 が重量の10%を占め mAP@0.5:0.95 が残りの90%を占めている。 精密 P リコール R がありません。適当に調整するか、utils/metrics.pyのデフォルトのフィットネス定義を使用してください(推奨)。

def fitness(x):
    # Model fitness as a weighted combination of metrics
    w = [0.0, 0.0, 0.1, 0.9]  # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
    return (x[:, :4] * w).sum(1)

3.進化する

進化は、改良を求める基本シナリオに対して行われる。この例でのベースシナリオは、事前に訓練された YOLOv5 を使って COCO128 を 10 エポック微調整することである。ベースシナリオのトレーニングコマンドは

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

ハイパーパラメータを進化させる このシナリオに特有で定義した初期値から始める。 第1節で定義されるフィットネスを最大化する。 第2節を追加する。 --evolve:

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

# Multi-GPU
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 30 \* $i) &&  # 30-second delay (optional)
  echo 'Starting GPU '$i'...' &&
  nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > evolve_gpu_$i.log &
done

# Multi-GPU bash-while (not recommended)
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 30 \* $i) &&  # 30-second delay (optional)
  echo 'Starting GPU '$i'...' &&
  "$(while true; do nohup python train.py... --device $i --evolve 1 > evolve_gpu_$i.log; done)" &
done

デフォルトの進化設定では、基本シナリオを300回、すなわち300世代実行する。世代は --evolve 引数、すなわち python train.py --evolve 1000.

主な遺伝演算子は以下の通りである。 クロスオーバー そして 突然変異.この作品では、突然変異を80%の確率と0.04の分散で使用し、前の世代のすべての最良の親の組み合わせに基づいて新しい子孫を作成します。結果は runs/evolve/exp/evolve.csvとして毎世代保存される。 runs/evolve/hyp_evolved.yaml:

# YOLOv5 Hyperparameter Evolution Results
# Best generation: 287
# Last generation: 300
#    metrics/precision,       metrics/recall,      metrics/mAP_0.5, metrics/mAP_0.5:0.95,         val/box_loss,         val/obj_loss,         val/cls_loss
#              0.54634,              0.55625,              0.58201,              0.33665,             0.056451,             0.042892,             0.013441

lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2  # 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)

最良の結果を得るためには、最低300世代の進化を推奨する。進化は一般的に高価で時間がかかることに注意してください。ベースシナリオは何百回もトレーニングされ、場合によっては何百、何千ものGPU時間を必要とします。

4.視覚化する

evolve.csv としてプロットされる。 evolve.png によって utils.plots.plot_evolve() 進化が終了した後、ハイパーパラメータごとに1つのサブプロットがあり、フィットネス(y軸)とハイパーパラメータ値(x軸)を示している。黄色は濃度が高いことを示す。垂直分布は、パラメータが無効化され、変異しないことを示す。これは meta この辞書はtrain.pyの辞書で、パラメータを固定したり、パラメータが進化しないようにするのに便利です。

進化する

対応環境

Ultralytics は、CUDAや CUDNNといった必要不可欠な依存関係がプリインストールされた、すぐに使えるさまざまな環境を提供します、 Pythonそして PyTorchなどの不可欠な依存関係がプリインストールされています。

プロジェクト状況

YOLOv5 CI

このバッジは、YOLOv5 GitHub ActionsContinuous Integration (CI) テストがすべて正常にパスしていることを示します。これらのCIテストは、トレーニング検証推論エクスポートベンチマークといったさまざまな重要な側面にわたって、YOLOv5 の機能とパフォーマンスを厳密にチェックします。これらのテストは、macOS、Windows、Ubuntu上で、24時間ごとおよび新しいコミットごとに実施され、一貫した信頼性の高い動作を保証します。



作成日:2023-11-12 更新日:2023-12-03
作成者:glenn-jocher(2)

コメント