Тонкая настройка и трансферное обучение на примере YOLO

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

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

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

Мой последний вопрос заключается в следующем: я следовал этим инструкциям: 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 ответа

Решение

Если вы используете репозиторий 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, https://groups.google.com/forum/

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

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

Другие вопросы по тегам