Вопрос или проблема
Я установил фреймворк yolo4 на pytorch в google colab, клонировав репозиторий https://github.com/roboflow-ai/pytorch-YOLOv4.git
.
Я сгенерировал контрольные точки, проведя обучение. Поскольку нам нужна более надежная модель обучения, я снова провел обучение, назначив предварительно обученные контрольные точки, но, похоже, значение потерь началось с высокого значения, как и при первом обучении.
Код для обучения !python train.py -b 2 -s 1 -l 0.001 -g 0 -pretrained ./Yolov4_epoch100_latest.pth -classes 1 -dir ./train -epochs 100
.
Не уверен, используется ли моя предварительно обученная контрольная точка во втором обучении? Если она используется, то почему во второй раз начальное значение потерь снова кажется высоким, как при первом обучении? Пожалуйста, поделитесь своими мыслями, если у вас есть какие-либо.
Очевидно, что обновляются только веса нижних слоев предварительно обученной модели. Чтобы изменить это, откройте models.py и прокрутите вниз до определения класса Yolov4. Как видно, только слои down1-down5 и neck обновляются весами предварительно обученной модели, в то время как голова начинается заново. Вам следует изменить этот участок кода на что-то подобное:
if yolov4conv137weight:
self.neck = Neck()
**self.head = Yolov4Head(output_ch)**
_model = nn.Sequential(self.down1, self.down2, self.down3, self.down4, self.down5, self.neck, **self.head**)
pretrained_dict = torch.load(yolov4conv137weight)
model_dict = _model.state_dict()
# 1. отфильтровать ненужные ключи
pretrained_dict = {k1: v for (k, v), k1 in zip(pretrained_dict.items(), model_dict)}
# 2. перезаписать записи в существующем state dict
#print("обновить веса")
model_dict.update(pretrained_dict)
_model.load_state_dict(model_dict)
# голова
**else:
self.head = Yolov4Head(output_ch)**
Запустите снова и наблюдайте за ожидаемыми потерями (надеюсь). Удачи!
Ответ или решение
Причина, по которой потеря при повторном обучении модели YOLOv4 на PyTorch может казаться высокой, подобно первой итерации обучения, может быть связана с несколькими факторами. Давайте разберем это подробнее.
-
Инициализация весов головы сети (head): Ваша проблема, скорее всего, заключается в том, что слои, отвечающие за "голову" модели, не инициализируются с предобученными весами. Как упоминалось в вашем коде, веса для слоев down1-down5 и neck загружаются из предобученной модели, тогда как начальные веса для head будут инициализированы случайным образом. Это может приводить к высокой начальной потере.
Чтобы исправить это, вам нужно убедиться, что веса для всех слоев (включая head) корректно загружаются из предобученной модели. Как указано в вашем фрагменте кода, вам необходимо изменить определение класса модели в файле
models.py
.Пример исправленного кода:
if yolov4conv137weight: self.neck = Neck() self.head = Yolov4Head(output_ch) # Убедитесь, что веса загружаются здесь _model = nn.Sequential(self.down1, self.down2, self.down3, self.down4, self.down5, self.neck, self.head) pretrained_dict = torch.load(yolov4conv137weight) model_dict = _model.state_dict() # 1. фильтрация ненужных ключей pretrained_dict = {k1: v for (k, v), k1 in zip(pretrained_dict.items(), model_dict)} # 2. обновление существующего state dict model_dict.update(pretrained_dict) _model.load_state_dict(model_dict) else: self.head = Yolov4Head(output_ch)
-
Параметры обучения: Если вы используете слишком высокую скорость обучения (learning rate), это также может привести к высокой потере. Попробуйте уменьшить значение параметра
-l
(learning rate) и посмотрите, как это повлияет на начальную потерю. -
Качество и сложность данных: Убедитесь, что ваши данные для обучения достаточно разнообразные и не содержат ошибок. Если ваши данные сильно отличаются от тех, на которых вы изначально обучали модель, это может также привести к высокой потере.
-
Значение
pretrained
: Убедитесь, что путь к предобученному весу правильный и файл действительно существует. Ошибка в пути или неправильно загруженные веса могут привести к тому, что модель не встроит необходимые параметры.
После внесения изменений в код и настройки параметров обучения, запустите обучение заново и проверьте, как изменится начальная потеря. Если все сделано правильно, вы должны увидеть, что потеря будет ниже, чем при первом обучении. Удачи в тренировке вашей модели!