Трансферное обучение с замороженными слоями
📚 Это руководство объясняет, как заморозить слои YOLOv5 🚀, когда трансферное обучение. Трансферное обучение - это полезный способ быстро переобучить модель на новых данных без необходимости переобучать всю сеть. Вместо этого часть начальных весов замораживается на месте, а остальные веса используются для вычисления потерь и обновляются оптимизатором. Это требует меньше ресурсов, чем обычное обучение, и позволяет ускорить процесс обучения, хотя и может привести к снижению конечной точности обучения.
Прежде чем начать
Клонируйте репо и установите файл requirements.txt в Python>=3.8.0 в окружении, включая PyTorch>=1.8. Модели и наборы данных загружаются автоматически из последнегорелиза YOLOv5 .
git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install
Заморозить заднюю линию
Все слои, соответствующие train.py freeze
в train.py будут заморожены путем установки их градиентов в ноль перед началом обучения.
# 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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""
Рассматривая архитектуру модели, мы видим, что основу модели составляют уровни 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
- [-1, 1, Conv, [256, 1, 1]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 3, C3, [256, False]] # 17 (P3/8-small)
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 14], 1, Concat, [1]] # cat head P4
- [-1, 3, C3, [512, False]] # 20 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 3, C3, [1024, False]] # 23 (P5/32-large)
- [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)
поэтому мы можем определить, что список заморозки содержит все модули с 'model.0.' - 'model.9.' в их именах:
Заморозить все слои
Чтобы заморозить всю модель, за исключением финальных выходных сверточных слоев в Detect(), мы задаем в списке freeze все модули с 'model.0.' - 'model.23.' в своих именах:
Результаты
Мы обучаем YOLOv5m на VOC по обоим вышеуказанным сценариям, а также по модели по умолчанию (без замораживания), начиная с официальной предварительной подготовки COCO --weights yolov5m.pt
:
train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml
Сравнение точности
Результаты показывают, что замораживание ускоряет обучение, но немного снижает итоговую точность.
GPU Сравнение использования
Интересно, что чем больше модулей заморожено, тем меньше GPU памяти требуется для обучения, и тем ниже использование GPU . Это указывает на то, что большие модели или модели, обученные на больших -image-size, могут выиграть от замораживания для более быстрого обучения.
Поддерживаемые среды
Ultralytics предоставляет ряд готовых к использованию окружений, в каждом из которых предустановлены такие необходимые зависимости, как CUDA, CUDNN, Python, и PyTorchдля запуска ваших проектов.
- Бесплатные блокноты GPU:
- Google Облако: Руководство по быстрому запуску GCP
- Amazon: Руководство по быстрому запуску AWS
- Azure: Руководство по быстрому запуску AzureML
- Docker: Руководство по быстрому запуску Docker
Статус проекта
Этот значок означает, что все тесты непрерывной интеграции (CI) YOLOv5 GitHub Actions успешно пройдены. Эти CI-тесты тщательно проверяют функциональность и производительность YOLOv5 по различным ключевым аспектам: обучение, валидация, вывод, экспорт и контрольные показатели. Они обеспечивают стабильную и надежную работу на macOS, Windows и Ubuntu, причем тесты проводятся каждые 24 часа и при каждом новом коммите.