Siêu tham số
Mọi đối số huấn luyện là một trường trên dataclass TrainConfig. Class cơ sở định nghĩa trường và giá trị mặc định; mỗi model family tạo subclass và ghi đè những giá trị mặc định mà recipe đã công bố của nó thay đổi.
Thiết lập đối số
train() nhận đối số keyword, còn CLI nhận cùng tên ở dạng key=value.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")results = model.train( data="my-dataset.yaml", epochs=100, batch=16, imgsz=640, lr0=0.01,) print(results["best_mAP50_95"])libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \ epochs=100 batch=16 imgsz=640 lr0=0.01Cả hai đường dẫn đi tới cùng một nơi. Các kwarg được truyền cho
TrainConfig.from_kwargs(), phương thức dựng dataclass cấu hình của family.
Lỗi chính tả không phát sinh lỗi
from_kwargs() loại mọi key không phải trường trong cấu hình và phát
UserWarning nêu tên key đó. Quá trình huấn luyện sau đó bắt đầu với giá trị
mặc định:
# UserWarning: Key cấu hình huấn luyện không xác định (bị bỏ qua): ['learning_rate']model.train(data="my-dataset.yaml", learning_rate=0.001)Không có gì thất bại, lượt chạy hoàn tất, còn learning rate chưa bao giờ mang giá trị bên gọi yêu cầu. Hãy đọc cảnh báo ở epoch đầu tiên của recipe mới. CLI nghiêm ngặt hơn vì xác thực tên flag trước khi dựng cấu hình, nên flag CLI sai chính tả bị từ chối ngay.
Giá trị mặc định theo từng family
TrainConfig định nghĩa trường và giá trị mặc định cơ sở. Mỗi family tạo
subclass và ghi đè những gì recipe đã công bố của nó thay đổi, vì vậy không có
một câu trả lời đúng duy nhất cho câu hỏi "learning rate mặc định là bao nhiêu".
Các giá trị mặc định cơ sở là optimizer="sgd", lr0=0.01, momentum=0.937,
weight_decay=5e-4, scheduler="yoloxwarmcos", epochs=300, batch=16,
imgsz=640 và amp=True. Ba ví dụ cho thấy family khác giá trị đó đến đâu:
| Trường | Cơ sở | YOLOv9 | D-FINE | YOLO-NAS |
|---|---|---|---|---|
optimizer | sgd | sgd | adamw | adamw |
lr0 | 0.01 | 0.01 | 2e-4 | 5e-4 |
weight_decay | 5e-4 | 5e-4 | 1e-4 | 1e-5 |
scheduler | yoloxwarmcos | linear | flat_cosine | cos |
epochs | 300 | 300 | 132 | 300 |
amp | True | True | True | True |
Phát hiện D-FINE, DEIM, RT-DETRv4 và YOLO-NAS mặc định dùng amp=True với amp_dtype="float16". Dome-DETR, PP-YOLOE và YOLO-NAS OBB giữ mặc định FP32. Truyền amp=False khi cần FP32.
Để đọc giá trị mặc định thực của family thay vì đoán:
from dataclasses import fields from libreyolo import LibreYOLO9from libreyolo.training.config import TrainConfig family_cfg = LibreYOLO9.TRAIN_CONFIG()base_cfg = TrainConfig() for f in fields(family_cfg): family_value = getattr(family_cfg, f.name) base_value = getattr(base_cfg, f.name, None) if not hasattr(base_cfg, f.name) or family_value != base_value: print(f"{f.name}: {family_value}")# In giá trị mặc định của train, val và predict, gồm cả ghi đè theo family.libreyolo cfgKích thước batch
batch là batch toàn cục. Trong huấn luyện multi-GPU, mỗi rank nạp
batch // world_size, vì vậy số được truyền là số ảnh trên mỗi bước optimizer,
bất kể có bao nhiêu GPU. Xem Huấn luyện multi-GPU.
batch=-1 bật autobatch. Trainer thăm dò mô hình ở training mode bằng backward
pass thực theo các lũy thừa của hai, khớp một đường thẳng với đường cong bộ nhớ
và chọn lũy thừa lớn nhất của hai nằm hẳn dưới giá trị ngoại suy có thể vừa trong
60 phần trăm tổng VRAM.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # batch=-1 thăm dò bộ nhớ GPU và phân giải thành một lũy thừa cụ thể của hai.model.train(data="my-dataset.yaml", batch=-1, imgsz=640)libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml batch=-1Điểm cốt lõi là thăm dò ở training mode bằng backward pass: thăm dò ở inference mode bỏ qua activation được giữ lại và tensor gradient, vốn chiếm gấp nhiều lần inference trên CNN sâu. RF-DETR giảm tỷ lệ mục tiêu xuống 45 phần trăm vì backward tổng hợp của phép thăm dò vẫn đánh giá thấp chi phí criterion và các lớp decoder phụ trợ.
Autobatch là tính năng CUDA. Trên CPU hoặc MPS, nó ghi một dòng log và giữ batch mặc định.
min_samples=0 giữ nguyên độ dài epoch. Ngưỡng dương lấy mẫu có hoàn lại từ các dataset phát hiện ngắn hơn. class_balanced=False bật lấy mẫu theo hệ số lặp từng ảnh khi đặt thành true; nó kết hợp với min_samples và DDP. Các loader chuyên biệt bỏ qua bộ lấy mẫu chung sẽ từ chối khi bật cân bằng.
Tích lũy gradient
nbs đặt kích thước batch danh nghĩa, hay hiệu dụng. Trainer tích lũy
round(nbs / batch) micro-batch trên mỗi bước optimizer.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # 4 micro-batch gồm 16 ảnh trên mỗi bước optimizer, batch hiệu dụng là 64.model.train(data="my-dataset.yaml", batch=16, nbs=64)Khi để None, giá trị mặc định, cơ chế tích lũy bị tắt và quá trình huấn luyện
không thay đổi.
Learning rate và lịch
lr0 là learning rate ban đầu, còn optimizer chấp nhận sgd, adam và
adamw. momentum là momentum SGD hoặc beta1 của Adam, weight_decay là thành
phần L2, còn nesterov áp dụng cho SGD.
Lịch được định hình bởi scheduler, warmup_epochs, warmup_lr_start và
min_lr_ratio. no_aug_epochs đặt số epoch cuối chạy không có augmentation
mạnh, và một số lịch cũng dùng nó để định hình phần đuôi, vì vậy đây không chỉ
là nút augmentation. Cách từng family dùng nửa augmentation của nó được trình
bày tại Tăng cường dữ liệu.
Một số family thêm nút learning rate riêng. backbone_lr_mult điều chỉnh tỷ lệ
nhóm backbone so với head, clip_max_norm đặt gradient clipping, còn SegFormer
dùng head_lr_mult để chạy decode head ở tốc độ gấp mười backbone. Các nút này
nằm trên subclass cấu hình của family, không phải class cơ sở.
clip_max_norm cắt chuẩn L2 của gradient về giá trị đó trước mỗi bước optimizer,
và 0 tắt việc cắt. YOLOv9, YOLOv9-E2E và YOLOv9-P2 mặc định là 10. D-FINE,
Dome-DETR, DEIM, DEIMv2, TinyFormer, RT-DETR, RT-DETRv2, RT-DETRv4, RF-DETR,
DINOv2, GTR và EC mặc định là 0.1. Trên CLI nó là clip_max_norm= hoặc
--clip-max-norm; xem libreyolo train để biết những family
chấp nhận nó ở đó.
EMA
ema=True duy trì exponential moving average của trọng số bên cạnh trọng số
được huấn luyện. Tùy chọn này mặc định bật ở mọi nơi trừ FOMO.
ema_decay là decay mục tiêu. Decay tăng dần thay vì bắt đầu ở mục tiêu: giá
trị hiệu dụng tại lần cập nhật n là ema_decay * (1 - exp(-n / tau)), với
tau mặc định là 2000, nhờ vậy các cập nhật ban đầu bám sát mô hình hơn còn cập
nhật muộn được làm mượt. Giá trị mặc định theo family trải từ 0.997 trên
YOLO-NAS pose, qua 0.9998 trên YOLOX, đến 0.9999 trên YOLOv9 và dòng DETR.
Trọng số EMA được dùng để xác thực và được lưu trong best.pt cùng last.pt.
Trọng số thô đã huấn luyện cũng được lưu dưới key train_model, để lượt tiếp
tục đi theo quỹ đạo đã huấn luyện thay vì giá trị trung bình.
Precision
amp=True chạy forward pass trong CUDA autocast. amp_dtype chọn float16
(mặc định) hoặc bfloat16; fp16 và bf16 là cách viết được chấp nhận.
Float16 cần dynamic loss scaling và nhận GradScaler hoạt động. Phạm vi số mũ
rộng hơn của bfloat16 không cần, vì vậy scaler của nó được dựng nhưng tắt, giúp
đường dẫn optimizer giữ nguyên. Yêu cầu bfloat16 trên thiết bị CUDA không hỗ trợ
bfloat16 sẽ phát sinh lỗi khi thiết lập thay vì âm thầm giảm cấp.
Đầu ra, checkpoint và dừng
Các lượt chạy được ghi vào project/name. project mặc định là runs/train ở
mọi nơi, nhưng name là một trong các giá trị ghi đè theo family: mặc định cơ
sở là exp, YOLOv9 dùng yolo9_exp, còn D-FINE dùng dfine_exp. Với
exist_ok=False, giá trị mặc định, thư mục đã tồn tại sẽ nhận hậu tố tăng dần
thay vì bị ghi đè.
save_period ghi thêm weights/epoch_<N>.pt sau mỗi N epoch, bên cạnh
weights/last.pt sau từng epoch và weights/best.pt mỗi khi metric được theo
dõi cải thiện. eval_interval đặt tần suất xác thực, và epoch cuối cùng luôn
được xác thực; val=False tắt xác thực, và lượt chạy như vậy không ghi ra
best.pt. patience dừng lượt chạy sau số epoch đó mà không cải thiện; 0 tắt
early stopping.
cache tăng tốc các epoch lặp lại bằng cách giữ ảnh đã decode trong RAM (True
hoặc "ram") hoặc dưới dạng tệp .npy bên cạnh nguồn ("disk"). Lượt đọc từ
cache giống từng byte với lượt đọc mới. Khi có worker dataloader, "disk" là
lựa chọn an toàn hơn.
average_best=0 tắt lấy trung bình checkpoint; N dương ghi weights/average.pt từ tối đa N snapshot tốt nhất. Các tensor số thực được lấy trung bình đều và buffer số nguyên lấy từ snapshot tốt nhất. Có thể bật export_check=False để dừng trước epoch đầu nếu xuất ONNX thất bại. Các đầu ra thô tương ứng được so sánh với rtol=1e-3, atol=1e-4; bố cục không tương thích ghi log bỏ qua so sánh.
precise_bn=0 tắt hiệu chuẩn lại BatchNorm cuối cùng. Giá trị dương giới hạn số ảnh từ loader huấn luyện trước lần đánh giá cuối; với DDP, giới hạn áp dụng cho từng rank tham gia. BatchNorm đã đóng băng vẫn đóng băng. Callback fitness tùy chỉnh có thể chọn checkpoint tốt nhất và patience.
Tiếp tục huấn luyện
resume=True tiếp tục một lượt chạy bị gián đoạn từ checkpoint đã nạp;
resume="path/to/last.pt" thì tiếp tục từ tệp đó.
from libreyolo import LibreYOLO # Nạp checkpoint của lượt chạy bị gián đoạn rồi yêu cầu tiếp tục.model = LibreYOLO("runs/train/yolo9_exp/weights/last.pt")model.train(data="my-dataset.yaml", resume=True)libreyolo train model=runs/train/yolo9_exp/weights/last.pt \ data=my-dataset.yaml resume=trueThao tác tiếp tục khôi phục các đối số huấn luyện đã lưu của lượt chạy, và đối số
được truyền tường minh sẽ ghi đè đối số đã lưu. Nó tiếp tục ghi vào thư mục chạy
của checkpoint. Nó khôi phục trọng số đã huấn luyện, trạng thái optimizer, trọng
số EMA và số lần cập nhật, thông tin theo dõi metric tốt nhất, scale của
GradScaler, cùng trạng thái ngẫu nhiên PyTorch, CUDA và NumPy. Nó bắt đầu ở
epoch sau epoch trong checkpoint và tua nhanh lịch tới vị trí đó.
Có ba điều nó không thực hiện. Không thể kết hợp resume=True với pretrained,
và yêu cầu như vậy sẽ phát sinh lỗi. Trọng số đã phát hành và một lượt chạy đã
đạt đủ epochs không có gì để tiếp tục, và sẽ phát sinh ValueError nêu rõ điều
đó. Khi key metric tốt nhất của checkpoint khác
lượt chạy hiện tại, thông tin theo dõi metric tốt nhất được đặt lại về 0 kèm
cảnh báo thay vì so sánh các giá trị không cùng ý nghĩa.
Recipe trong tệp
cfg= nạp mapping YAML gồm tên trường TrainConfig và merge bên dưới các đối
số keyword tường minh, vì vậy kwarg luôn được ưu tiên hơn tệp.
from libreyolo import LibreYOLO # Các key trong yaml là tên trường TrainConfig. Kwarg tường minh được ưu tiên.model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", cfg="my-recipe.yaml", epochs=50)size và num_classes bị loại khỏi tệp vì instance mô hình đã sở hữu chúng.
CLI không có flag --cfg; đường dẫn tệp là đối số Python.
Nội dung liên quan
- Xem Dataset để biết
data=chấp nhận gì. - Xem Tăng cường dữ liệu để biết các nút augmentation và family nào áp dụng chúng.
- Xem Đóng băng lớp và LoRA để huấn luyện một tập con của trọng số.
- Xem Xác thực và metric để biết lượt chạy báo cáo gì.
Chọn lớp đối tượng và trọng số loss
Với phát hiện YOLO9, RF-DETR, EdgeCrafter, RT-DETR, D-FINE, DEIM, TinyFormer và YOLO-NAS, classes=None giữ mọi lớp đối tượng của dataset; danh sách lọc dữ liệu giám sát nhưng giữ ID gốc, nc và names. Có thể bật single_cls=False để ánh xạ nhãn được giữ thành lớp đối tượng 0 có tên object. Tiếp tục huấn luyện và đánh giá kế thừa thiết lập đã lưu. Huấn luyện OBB của mô hình từ chối single_cls.
ResNet, ConvNeXt, ConvNeXt V2, MobileNetV4, EfficientNetV2 và DINOv2 hỗ trợ cls_pw=0.0: giá trị trong [0, 1] đặt trọng số mỗi lớp đối tượng bằng nghịch đảo tần suất lũy thừa giá trị đó, chuẩn hóa về trung bình 1. Khi bật, class_weights=False chọn cách đặt trọng số thay thế N / (C * n_c). Không thể kết hợp nó với cls_pw dương; tiếp tục huấn luyện yêu cầu thiết lập trọng số khớp nhau.
plot_samples=8 đặt giới hạn số ảnh mẫu đánh giá. Dùng 0 để không có ảnh hoặc -1 để lấy tất cả; nó không giảm số ảnh được đánh giá.