Тонкая настройка и трансферное обучение на примере YOLO - PullRequest
1 голос
/ 12 марта 2019

У меня есть общий вопрос, касающийся тонкой настройки и трансферного обучения, который возник, когда я попытался выяснить, как наилучшим образом заставить Йоло обнаруживать мой пользовательский объект (будучи руками).

Я прошу прощения за длинный текст, возможно содержащий много ложной информации. Я был бы рад, если бы у кого-то было терпение прочитать это и помочь мне очистить мою путаницу.

После долгих поисков я узнал, что многие люди считают подстройку подклассом трансферного обучения, в то время как другие считают, что они придерживаются разных подходов к обучению модели. В то же время люди проводят различие между переобучением только последнего слоя классификатора модели в пользовательском наборе данных и переобучением других слоев модели (и, возможно, добавлением совершенно нового классификатора вместо переподготовки?). Оба подхода используют предварительно обученные модели.

Мое последнее замешательство лежит здесь: я следовал этим инструкциям: https://github.com/thtrieu/darkflow, чтобы тренировать крошечное йоло через darkflow, используя команду:

# 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 Но что здесь происходит? Я полагаю, что я переобучу классификатор только потому, что в инструкциях сказано изменить количество классов в последнем слое в файле конфигурации. Но опять же, также необходимо изменить количество фильтров во втором последнем слое, сверточном слое.

Наконец, в инструкциях приведен пример альтернативного обучения: # Completely initialize yolo-new and train it with ADAM optimizer flow --model cfg/yolo-new.cfg --train --trainer adam и я совсем не понимаю, как это связано с различными способами трансферного обучения.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Если вы используете репозиторий darknet от AlexeyAB (не darkflow), он предлагает выполнить тонкую настройку вместо Transfer Learning, установив этот параметр в файле 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/mKkQrjuLPDU

0 голосов
/ 12 марта 2019

Я не работал над YOLO, но, глядя на твои проблемы, я думаю, что могу помочь. Тонкая настройка, переобучение, пост-настройка - все это несколько двусмысленные термины, часто используемые взаимозаменяемо. Все дело в том, насколько сильно вы хотите изменить предварительно обученные веса. Поскольку вы загружаете веса в первом случае с помощью --load, здесь загружаются предварительно обученные веса - это может означать, что вы немного корректируете веса с низкой скоростью обучения или, возможно, не меняете их вообще. Во втором случае, однако, вы не загружаете какие-либо веса, поэтому, вероятно, вы тренируете его с нуля.

Существуют отдельные способы, которыми вы можете по желанию заморозить некоторые слои.

...