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.

Python
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"])
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 batch=16 imgsz=640 lr0=0.01

Cả 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:

python
# 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ườngCơ sởYOLOv9D-FINEYOLO-NAS
optimizersgdsgdadamwadamw
lr00.010.012e-45e-4
weight_decay5e-45e-41e-41e-5
scheduleryoloxwarmcoslinearflat_cosinecos
epochs300300132300
ampTrueTrueTrueTrue

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:

Đọc các giá trị mặc định đã phân giải của family
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}")
CLI
# In giá trị mặc định của train, val và predict, gồm cả ghi đè theo family.libreyolo cfg

Kí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.

Python
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)
CLI
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.

Python
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 đó.

Python
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)
CLI
libreyolo train model=runs/train/yolo9_exp/weights/last.pt \  data=my-dataset.yaml resume=true

Thao 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.

Python
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.

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á.

Đã kiểm chứng với LibreYOLO v1.6.0.