Трансферное обучение с замороженными слоями в YOLOv5
📚 Это руководство объясняет, как заморозить слои YOLOv5 🚀 при реализации трансферного обучения. Трансферное обучение - это мощная техника, которая позволяет быстро переобучить модель на новых данных без необходимости переобучать всю сеть. Заморозив часть начальных весов и обновив только остальные, вы можете значительно сократить вычислительные ресурсы и время обучения, хотя такой подход может несколько повлиять на конечную точность модели.
Прежде чем начать
Клонируйте репозиторий и установите файл requirements.txt в Python.8.0 в среду, включая PyTorch.8. Модели и наборы данных загружаются автоматически из последнейверсии YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Как работает заморозка слоев
Когда вы замораживаете слои в нейронной сети, вы, по сути, устанавливаете их параметры как необучаемые. Градиенты этих слоев устанавливаются в ноль, предотвращая обновление весов в процессе обратного распространения. В процессе обучения YOLOv5 это реализовано следующим образом:
# Freeze
freeze = [f"model.{x}." for x in range(freeze)] # layers to freeze
for k, v in model.named_parameters():
v.requires_grad = True # train all layers
if any(x in k for x in freeze):
print(f"freezing {k}")
v.requires_grad = False
Изучение архитектуры модели
Чтобы эффективно замораживать определенные части модели, полезно понимать структуру слоев. Вы можете просмотреть имена всех модулей с помощью:
for k, v in model.named_parameters():
print(k)
"""Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""
Архитектура YOLOv5 состоит из магистрали (слои 0-9) и головы (остальные слои):
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
- [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
- [-1, 3, C3, [128]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 6, C3, [256]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 9, C3, [512]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 3, C3, [1024]]
- [-1, 1, SPPF, [1024, 5]] # 9
# YOLOv5 v6.0 head
head:
- [-1, 1, Conv, [512, 1, 1]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 3, C3, [512, False]] # 13
# ... remaining head layers
Варианты замораживания
Заморозить только заднюю линию
Заморозить только основу (слои 0-9), что полезно для адаптации модели к новым классам при сохранении изученных возможностей извлечения признаков:
Этот подход особенно эффективен, когда ваш новый набор данных имеет схожие низкоуровневые характеристики с исходными обучающими данными, но при этом содержит разные классы или объекты.
Заморозьте все слои, кроме слоев обнаружения
Заморозить всю модель, за исключением слоев свертки с конечным выходом в модуле Detect:
Этот подход идеален, когда вы хотите сохранить большинство изученных характеристик модели, но при этом адаптировать ее для определения другого количества классов.
Сравнение производительности
Мы обучили YOLOv5m на наборе данных VOC, используя различные стратегии замораживания, начиная с официальных предварительно обученных весов COCO:
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml
Результаты точности
Результаты показывают, что замораживание слоев ускоряет обучение, но несколько снижает итоговую точность:
Использование ресурсов
Замораживание большего количества слоев снижает требования к памяти GPU и ее загрузку, что делает эту технику ценной для обучения больших моделей или использования изображений высокого разрешения:
Когда использовать замораживание слоев
Замораживание слоев в трансферном обучении особенно полезно в таких сценариях, как:
- Ограниченные вычислительные ресурсы: При нехватке памяти или вычислительной мощности GPU
- Небольшие наборы данных: Когда ваш новый набор данных слишком мал для обучения полной модели без перегрузки
- Быстрая адаптация: Когда необходимо быстро адаптировать модель к новой области
- Тонкая настройка под конкретные задачи: При адаптации общей модели к специализированному приложению
Более подробную информацию о методах трансферного обучения и их применении см. в глоссарии трансферного обучения.
Поддерживаемые среды
Ultralytics предоставляет ряд готовых к использованию окружений, в каждом из которых предустановлены такие необходимые зависимости, как CUDA, CUDNN, Python, и PyTorchдля запуска ваших проектов.
- Бесплатные блокноты GPU:
- Google Облако: Руководство по быстрому запуску GCP
- Amazon: Руководство по быстрому запуску AWS
- Azure: Руководство по быстрому запуску AzureML
- Docker: Руководство по быстрому запуску Docker
Статус проекта
Этот значок означает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и контрольные показатели. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu, причем тесты проводятся каждые 24 часа и при каждом новом коммите.