Pembekuan lapisan

Pembekuan mempertahankan bobot terpilih tetap sama saat bagian model lainnya berlatih. Selector mengacu pada freeze group terurut atau nama modul milik family, bukan nomor lapisan mentah dari graph YAML.

Bekukan sesuatu

freeze bersifat opsional dan default-nya tanpa pembekuan.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Sepuluh group pertama adalah seluruh backbone 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
Berdasarkan nama
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt")model.train(data="my-dataset.yaml", epochs=50, freeze="backbone")
Beberapa selector
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", freeze=["backbone", "neck"])

Pembekuan berjalan setelah model dibangun dan setelah head dibangun ulang untuk jumlah kelas baru, serta sebelum optimizer dibuat, sehingga optimizer hanya menerima parameter yang dapat dilatih.

Bentuk selector

NilaiArti
None, False, "", "none"Latih setiap parameter
10 atau "10"Bekukan sepuluh freeze group family pertama
[0, 3, 7]Bekukan group berbasis nol tersebut
"backbone"Bekukan group, modul, atau awalan parameter yang cocok
["backbone", "neck"]Bekukan setiap selector dalam daftar
["backbone", 3]Daftar campuran dapat digunakan

String diurai sebelum ditafsirkan, sehingga CLI dan konfigurasi YAML menerima bentuk yang sama dengan Python. freeze="[0, 3, 'head']" diurai sebagai daftar literal, freeze="backbone,neck" dipecah pada koma, dan string desimal tunggal menjadi jumlah.

freeze=True ditolak karena ambigu.

Selector nama mencocokkan nama freeze group, nama modul, atau awalan nama parameter, dan karakter glob *, ?, serta [ dapat digunakan. Awalan model. diperlakukan secara fleksibel, sehingga backbone dan model.backbone sama-sama mengenai ejaan mana pun yang digunakan family secara internal.

Group didefinisikan family

Integer mengacu pada daftar freeze group terurut milik family, bukan posisi pada graph bersama. Tidak semua family LibreYOLO merupakan satu model sequential berindeks YAML, sehingga nomor lapisan mentah akan bermakna berbeda pada tiap family.

YOLOv9 mengurutkan group dari sisi input: sepuluh tahap backbone, lalu enam tahap neck, kemudian head. Karena itu, freeze=10 tepat berarti backbone. backbone, neck, dan head adalah selector nama stabil di atasnya.

Group RF-DETR adalah backbone.encoder, backbone.projector, decoder, queries, transformer.encoder_output, dan head. Nama merupakan pilihan yang lebih baik di sini karena komponen transformer tidak dipetakan ke jumlah lapisan. backbone mencocokkan kedua group backbone berdasarkan awalan.

Family yang tidak mendefinisikan group semantik kembali ke default konservatif: setiap child langsung model yang memiliki setidaknya satu parameter, dalam urutan deklarasi. Daftar ini biasanya pendek, sehingga integer besar tidak akan menemukan cukup group:

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

Untuk melihat daftar sebenarnya tanpa menebak:

Cantumkan freeze group family secara berurutan
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)

Kegagalan ditampilkan dengan jelas

Setiap penggunaan yang salah memunculkan error, bukan melatih sesuatu yang tidak diminta.

Selector yang tidak cocok dengan apa pun memunculkan error dan menyebutkan selector yang gagal:

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

Pembekuan yang tidak menyisakan apa pun untuk dilatih memunculkan error saat pembekuan dan kembali saat optimizer dibangun:

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

Itulah yang dilakukan freeze="all", karena all mencocokkan setiap parameter.

Jika pembekuan berhasil, satu baris mencatat hasilnya:

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

BatchNorm beku berhenti diperbarui

Parameter beku masih berada dalam modul yang running statistics-nya dapat terus berubah. Setiap modul bergaya BatchNorm yang parameternya termasuk set beku diubah ke mode eval, dan trainer menerapkannya kembali setelah pemanggilan model.train() setiap epoch, sehingga statistik tetap sama selama seluruh proses.

Perilaku ini aktif secara default dan memastikan pembekuan backbone benar-benar membekukannya.

Digabungkan dengan LoRA

freeze dan lora=True dapat digunakan bersama. Pada RF-DETR, DEIM, dan ConvNeXt, parameter adapter dipertahankan agar dapat dilatih meskipun parent group-nya dibekukan. Inilah kombinasi yang diinginkan: backbone beku dengan adapter yang belajar di atasnya. Lihat fine-tuning LoRA.

Cakupan

Ini adalah pembekuan statis yang ditentukan saat startup. Unfreezing terjadwal dan pembekuan progresif bukan bagian interface.

Terkait

  • Hyperparameter untuk bagian lain train().
  • Distilasi untuk cara lain memindahkan pengetahuan model besar ke proses pelatihan.

Diverifikasi dengan LibreYOLO v1.5.0.