私は、微調整と転移学習に関して一般的な質問があります。それは、yoloがカスタムオブジェクト(手)を検出するための最良の方法を見つけようとしたときに出てきました。
長いテキストに誤った情報が多く含まれている可能性があります。誰かがそれを読んで私の混乱を解消するのを手伝ってくれる忍耐力があれば、私はうれしいです。
多くのグーグルの後で、多くの人が微調整を転移学習のサブクラスであると考えていることを学びましたが、他の人はモデルをトレーニングするための異なるアプローチに対するものであると信じています。同時に、人々は、カスタムデータセットのモデルの最後の分類子レイヤーのみを再トレーニングすることと、モデルの他のレイヤーを再トレーニングすること(そしておそらく再トレーニングする代わりに、まったく新しい分類子を追加すること)を区別します。どちらのアプローチも事前トレーニング済みモデルを使用します。
私の最終的な混乱はここにあります:私はこれらの指示に従いました: https://github.com/thtrieu/darkflow コマンドを使用して、darkflow経由で小さなyoloをトレーニングします:
# Initialize yolo-new from yolo-tiny, then train the net on 100% GPU: flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0
しかし、ここで何が起こりますか?設定ファイルの最後のレイヤーのクラス数を変更するように指示されているため、分類子のみを再トレーニングすると思います。ただし、この場合も、2番目の最後の層である畳み込み層のフィルター数を変更する必要があります。
最後に、手順は代替トレーニングの例を提供します:# Completely initialize yolo-new and train it with ADAM optimizer flow --model cfg/yolo-new.cfg --train --trainer adam
そして私は、これが転移学習のさまざまな方法にどのように関係するのかまったく理解していません。
AlexeyABの(darkflowではなく)darknetリポジトリを使用している場合、cfgファイルでこのパラメーターを設定することにより、転移学習ではなく微調整を行うことをお勧めします:stopbackward=1
。
次に./darknet partial yourConfigFile.cfg yourWeightsFile.weights outPutName.LastLayer# LastLayer#
を入力します。
./darknet partial cfg/yolov3.cfg yolov3.weights yolov3.conv.81 81
yolov3.conv.81
が作成され、下位レイヤーがフリーズするため、元のyolov3.conv.81
の代わりにウェイトファイルdarknet53.conv.74
を使用してトレーニングできます。
参照: https://github.com/AlexeyAB/darknet#how-to-improve-object-detection 、 https://groups.google.com/forum/#!topic/darknet/mKkQrjuLPD
私はYOLOには取り組みませんでしたが、あなたの問題を見て、私は助けることができると思います。微調整、再トレーニング、ポストチューニングはすべて、しばしば同じ意味で使用されるややあいまいな用語です。すべては、事前トレーニング済みのウェイトをどの程度変更するかです。最初のケースでは--load
を使用して重みを読み込んでいるので、事前トレーニング済みの重みがここに読み込まれています-低い学習率で重みを少し調整しているか、まったく変更していない可能性があります。ただし、2番目のケースでは、ウェイトをロードしていないため、おそらく最初からウェイトをトレーニングしています。
一部のレイヤーをオプションでフリーズできる別の方法があります。