Тонкая настройка и трансферное обучение на примере 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
здесь загружаются предварительно обученные веса - это может означать, что вы немного корректируете веса с низкой скоростью обучения или, возможно, не меняете их вообще. Во втором случае, однако, вы не загружаете какие-либо веса, поэтому, вероятно, вы тренируете его с нуля.
Там могут быть отдельные способы, которыми вы можете замораживать некоторые слои по желанию.