Заморожування шарів
Заморожування утримує вибрані ваги незмінними, поки решта моделі навчається. Селектори звертаються до власних упорядкованих груп заморожування сімейства або назв його модулів, а не до необроблених номерів шарів із графа YAML.
Заморожування
freeze є необов'язковим, і стандартно нічого не заморожується.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Перші 10 груп, це весь бекбон YOLOv9.model.train(data="my-dataset.yaml", epochs=50, freeze=10)libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \ epochs=50 freeze=10from 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.
Обсяг
Це статичне заморожування, визначене під час запуску. Заплановане розморожування та поступове заморожування не входять до інтерфейсу.
Пов'язані матеріали
- Гіперпараметри для решти аргументів
train(). - Дистиляція для іншого способу перенести знання великої моделі до запуску навчання.