Переглянути як Markdown

Заморожування шарів

Заморожування утримує вибрані ваги незмінними, поки решта моделі навчається. Селектори звертаються до власних упорядкованих груп заморожування сімейства або назв його модулів, а не до необроблених номерів шарів із графа YAML.

Заморожування

freeze є необов'язковим, і стандартно нічого не заморожується.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Перші 10 груп, це весь бекбон YOLOv9.model.train(data="my-dataset.yaml", epochs=50, freeze=10)
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=50 freeze=10
За назвою
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt")model.train(data="my-dataset.yaml", epochs=50, freeze="backbone")
Кілька селекторів
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", freeze=["backbone", "neck"])

Заморожування відбувається після побудови моделі та можливого перебудування голови для нової кількості класів, але до створення оптимізатора. Тому оптимізатор завжди отримує лише параметри, які можна навчати.

Можливі значення селектора

ЗначенняЗначення дії
None, False, "", "none"Навчати кожен параметр
10 або "10"Заморозити перші десять груп заморожування сімейства
[0, 3, 7]Заморозити ці групи з нульовою нумерацією
"backbone"Заморозити відповідну групу, модуль або префікс параметра
["backbone", "neck"]Заморозити кожен із перелічених селекторів
["backbone", 3]Змішані списки також працюють

Рядок розбирається до інтерпретації, тому CLI та конфігурація YAML приймають ті самі форми, що й Python. freeze="[0, 3, 'head']" розбирається як буквальний список, freeze="backbone,neck" розділяється за комою, а окремий десятковий рядок стає кількістю.

freeze=True відхиляється як неоднозначне значення.

Селектори назв зіставляються з назвою групи заморожування, назвою модуля або префіксом назви параметра; працюють символи шаблонів *, ? і [. Початковий model. трактується гнучко, тому backbone і model.backbone обидва знаходять той варіант написання, який сімейство використовує внутрішньо.

Групи визначає сімейство

Ціле число звертається до власного впорядкованого списку груп заморожування сімейства, а не до позиції у спільному графі. Не всі сімейства LibreYOLO є однією послідовною моделлю з індексами YAML, тому номер необробленого шару мав би різне значення для кожного з них.

YOLOv9 упорядковує групи від боку входу: десять етапів бекбона, потім шість етапів шиї, потім голова. Саме тому freeze=10 точно відповідає бекбону. backbone, neck і head, це стабільні селектори назв поверх нього.

Групи RF-DETR, це backbone.encoder, backbone.projector, decoder, queries, transformer.encoder_output і head. Тут краще вибирати назви, оскільки компоненти трансформера не зіставляються з кількістю шарів. backbone знаходить обидві групи бекбона за префіксом.

Сімейства без семантичних груп використовують консервативний резервний варіант: кожен безпосередній дочірній елемент моделі, що володіє принаймні одним параметром, у порядку оголошення. Зазвичай це короткий список, тому для великого цілого числа не знайдеться достатньо груп:

freeze index 10 is out of range for 3 available freeze groups.

Щоб переглянути справжній список, а не вгадувати:

Перелік груп заморожування сімейства за порядком
from libreyolo import LibreYOLO9from libreyolo.models.yolo9.trainer import YOLO9Trainer model = LibreYOLO9("LibreYOLO9s.pt", size="s")trainer = YOLO9Trainer(model=model.model, wrapper_model=model, size="s") for index, (name, _module) in enumerate(trainer.get_freeze_groups()):    print(index, name)

Помилки не приховуються

Будь-який неправильний варіант спричиняє помилку, а не запускає навчання, якого ви не просили.

Селектор без збігів спричиняє помилку з назвами пропущених селекторів:

freeze selector(s) matched no parameters: 'backbon'

Заморожування, яке не залишило б параметрів для навчання, спричиняє помилку під час заморожування та знову під час побудови оптимізатора:

freeze would leave no trainable parameters. Use a smaller freeze value or
target a narrower module.

Саме це робить freeze="all", оскільки all відповідає кожному параметру.

Після успішного заморожування один рядок фіксує результат:

Layer freezing: selectors=[10], tensors=124, params=2103776, trainable=1863456/3967232

Заморожений BatchNorm не оновлюється

Заморожений параметр і далі перебуває в модулі, поточна статистика якого могла б змінюватися. Кожен модуль у стилі BatchNorm, параметри якого входять до замороженого набору, перемикається в режим оцінювання, а тренер повторно застосовує його після виклику model.train() у кожній епосі, тому статистика лишається незмінною весь запуск.

Це стандартна поведінка, завдяки якій заморожування бекбона справді заморожує його.

Поєднання з LoRA

freeze і lora=True працюють разом. У RF-DETR, DEIM і ConvNeXt параметри адаптера залишаються доступними для навчання, навіть якщо їхню батьківську групу заморожено. Це потрібне поєднання: заморожений бекбон з адаптерами, які навчаються поверх нього. Дивіться донавчання LoRA.

Обсяг

Це статичне заморожування, визначене під час запуску. Заплановане розморожування та поступове заморожування не входять до інтерфейсу.

Пов'язані матеріали

Перевірено з LibreYOLO v1.5.0.