Eğiticiyi (Trainer) Özelleştirme#
Ultralytics eğitim hattı, BaseTrainer etrafında ve DetectionTrainer gibi görev odaklı eğiticiler üzerine kurulmuştur. Bu sınıflar, eğitim döngüsünü, doğrulamayı, kontrol noktası oluşturmayı ve günlük kaydını kutudan çıktığı gibi yönetir. Özel metrikleri izleme, kayıp ağırlığını ayarlama veya öğrenme oranı programları uygulama gibi daha fazla kontrole ihtiyaç duyduğunuzda, eğiticiyi alt sınıfa (subclass) ayırabilir ve belirli yöntemleri geçersiz kılabilirsiniz (override).
Bu kılavuz, yedi yaygın özelleştirmeyi ele almaktadır:
- Her epoch sonunda özel metrikleri (F1 skoru) kaydetme
- Sınıf dengesizliğini ele almak için sınıf ağırlıkları ekleme
- Farklı bir metriğe dayalı olarak en iyi modeli kaydetme
- İlk N epok için arka kemiği (backbone) dondurma ve ardından dondurmayı kaldırma
- Katman başına öğrenme oranları belirleme
- Çoklu GPU eğitimi için GPU'lar arasında BatchNorm'u senkronize etme
- Kararlılık ayarı için gradyan kırpma (gradient clipping) yapılandırma
Bu kılavuzu okumadan önce, YOLO modellerini eğitmenin temellerini ve BaseTrainer mimarisini kapsayan Gelişmiş Özelleştirme sayfasını bildiğinden emin ol.
Özel Eğiticiler Nasıl Çalışır?#
YOLO model sınıfı, train() yönteminde bir trainer parametresini kabul eder. Bu, varsayılan davranışı genişleten kendi eğitmen sınıfını iletmene olanak tanır:
from ultralytics import YOLO
from ultralytics.models.yolo.detect import DetectionTrainer
class CustomTrainer(DetectionTrainer):
"""A custom trainer that extends DetectionTrainer with additional functionality."""
# Add your customizations here
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=10, trainer=CustomTrainer)Özel eğiticiniz tüm işlevselliği DetectionTrainer sınıfından miras alır, bu nedenle yalnızca özelleştirmek istediğiniz belirli yöntemleri geçersiz kılmanız gerekir.
Özel Metrikleri Günlüğe Kaydetme#
Doğrulama adımı kesinliği (precision), duyarlılığı (recall) ve mAP değerini hesaplar. Sınıf başına F1 skoru gibi ek metriklere ihtiyacınız varsa, validate() öğesini geçersiz kılın:
import numpy as np
from ultralytics import YOLO
from ultralytics.models.yolo.detect import DetectionTrainer
from ultralytics.utils import LOGGER
class MetricsTrainer(DetectionTrainer):
"""Custom trainer that computes and logs F1 score at the end of each epoch."""
def validate(self):
"""Run validation and compute per-class F1 scores."""
metrics, fitness = super().validate()
if metrics is None:
return metrics, fitness
if hasattr(self.validator, "metrics") and hasattr(self.validator.metrics, "box"):
box = self.validator.metrics.box
f1_per_class = box.f1
class_indices = box.ap_class_index
names = self.validator.names
valid_f1 = f1_per_class[f1_per_class > 0]
mean_f1 = np.mean(valid_f1) if len(valid_f1) > 0 else 0.0
LOGGER.info(f"Mean F1 Score: {mean_f1:.4f}")
per_class_str = [
f"{names[i]}: {f1_per_class[j]:.3f}" for j, i in enumerate(class_indices) if f1_per_class[j] > 0
]
LOGGER.info(f"Per-class F1: {per_class_str}")
return metrics, fitness
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=5, trainer=MetricsTrainer)Bu, her doğrulama çalışmasından sonra tüm sınıflar genelinde ortalama F1 skorunu ve sınıf bazlı dökümü günlüğe kaydeder.
Doğrulayıcı, self.validator.metrics.box aracılığıyla birçok metriğe erişim sağlar:
| Öznitelik | Açıklama |
|---|---|
f1 | Sınıf başına F1 skoru |
image_metrics | Precision, recall, F1, TP, FP ve FN içeren resim başına metrik sözlüğü |
p | Sınıf başına Precision |
r | Sınıf başına Recall |
ap50 | Sınıf başına 0.5 IoU'da AP |
ap | Sınıf başına 0.5:0.95 IoU aralığında AP |
mp, mr | Ortalama precision ve recall |
map50, map | Ortalama AP metrikleri |
Sınıf Ağırlıkları Ekleme#
Veri setiniz dengesiz sınıflara sahipse (örneğin, üretim denetiminde nadir bir kusur), kayıp fonksiyonunda az temsil edilen sınıfların ağırlığını artırabilirsiniz. Bu, modelin nadir sınıflardaki yanlış sınıflandırmaları daha ağır bir şekilde cezalandırmasını sağlar.
Kaybı özelleştirmek için kayıp sınıflarını, modeli ve eğitiyi alt sınıfa al:
import torch
from torch import nn
from ultralytics import YOLO
from ultralytics.models.yolo.detect import DetectionTrainer
from ultralytics.nn.tasks import DetectionModel
from ultralytics.utils import RANK
from ultralytics.utils.loss import E2ELoss, v8DetectionLoss
class WeightedDetectionLoss(v8DetectionLoss):
"""Detection loss with class weights applied to BCE classification loss."""
def __init__(self, model, class_weights=None, tal_topk=10, tal_topk2=None):
"""Initialize loss with optional per-class weights for BCE."""
super().__init__(model, tal_topk=tal_topk, tal_topk2=tal_topk2)
if class_weights is not None:
self.bce = nn.BCEWithLogitsLoss(
pos_weight=class_weights.to(self.device),
reduction="none",
)
class WeightedE2ELoss(E2ELoss):
"""E2E Loss with class weights for YOLO26."""
def __init__(self, model, class_weights=None):
"""Initialize E2E loss with weighted detection loss."""
def weighted_loss_fn(model, tal_topk=10, tal_topk2=None):
return WeightedDetectionLoss(model, class_weights=class_weights, tal_topk=tal_topk, tal_topk2=tal_topk2)
super().__init__(model, loss_fn=weighted_loss_fn)
class WeightedDetectionModel(DetectionModel):
"""Detection model that uses class-weighted loss."""
def init_criterion(self):
"""Initialize weighted loss criterion with per-class weights."""
class_weights = torch.ones(self.nc)
class_weights[0] = 2.0 # upweight class 0
class_weights[1] = 3.0 # upweight rare class 1
return WeightedE2ELoss(self, class_weights=class_weights)
class WeightedTrainer(DetectionTrainer):
"""Trainer that returns a WeightedDetectionModel."""
def get_model(self, cfg=None, weights=None, verbose=True):
"""Return a WeightedDetectionModel."""
model = WeightedDetectionModel(cfg, nc=self.data["nc"], verbose=verbose and RANK == -1)
if weights:
model.load(weights)
return model
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=10, trainer=WeightedTrainer)Sınıf ağırlıklarını, veri setinin etiket dağılımından otomatik olarak hesaplayabilirsin. Yaygın bir yaklaşım, ters frekans ağırlıklandırmasıdır:
import numpy as np
# class_counts: number of instances per class
class_counts = np.array([5000, 200, 3000])
# Inverse frequency: rarer classes get higher weight
class_weights = max(class_counts) / class_counts
# Result: [1.0, 25.0, 1.67]WeightedDetectionModel gibi özel sınıflar, kontrol noktasında referans yoluyla saklanır. Bir eğitim betiğinde tanımlandıklarında __main__ modülüne ait olurlar, bu nedenle best.pt öğesini farklı bir betikten yüklemek AttributeError: Can't get attribute 'WeightedDetectionModel' on <module '__main__'> hatasına yol açar.
Özel sınıfları, içe aktarılabilir kalmaları için özel bir modülde tanımlayın ve yükleme sırasında bu modülün PYTHONPATH üzerinde olduğundan emin olun.
# weighted_model.py
from ultralytics.nn.tasks import DetectionModel
class WeightedDetectionModel(DetectionModel):
"""Detection model that uses class-weighted loss."""# inference script
from weighted_model import WeightedDetectionModel # noqa: F401 - must be importable at checkpoint load time
from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
metrics = model.val()Özel Metrik ile En İyi Modeli Kaydetme#
Eğitici, uyuma (fitness) değerine göre best.pt kaydeder; bu değer nesne tespiti için varsayılan olarak mAP@0.5:0.95 şeklindedir ([P, R, mAP@0.5, mAP@0.5:0.95] için ağırlıklar [0.0, 0.0, 0.0, 1.0]). mAP@0.5 veya duyarlılık (recall) gibi farklı bir metrik kullanmak için validate() öğesini geçersiz kıl ve seçtiğin metriği fitness değeri olarak döndür. Yerleşik save_model() daha sonra bunu otomatik olarak kullanacaktır:
from ultralytics import YOLO
from ultralytics.models.yolo.detect import DetectionTrainer
class CustomSaveTrainer(DetectionTrainer):
"""Trainer that saves the best model based on mAP@0.5 instead of default fitness."""
def validate(self):
"""Override fitness to use mAP@0.5 for best model selection."""
metrics, fitness = super().validate()
if metrics:
fitness = metrics.get("metrics/mAP50(B)", fitness)
if self.best_fitness is None or fitness > self.best_fitness:
self.best_fitness = fitness
return metrics, fitness
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=20, trainer=CustomSaveTrainer)Doğrulama sonrasında self.metrics içinde bulunan yaygın metrikler şunlardır:
| Anahtar | Açıklama |
|---|---|
metrics/precision(B) | Precision |
metrics/recall(B) | Recall |
metrics/mAP50(B) | 0.5 IoU'da mAP |
metrics/mAP50-95(B) | 0.5:0.95 IoU'da mAP |
Backbone'u Dondurma ve Dondurmayı Kaldırma#
Aktarımlı öğrenme (transfer learning) iş akışları genellikle ilk N epok için önceden eğitilmiş arka kemiği dondurmaktan fayda sağlar; bu, tüm ağın ince ayarı (fine-tuning) yapılmadan önce algılama kafasının (detection head) uyum sağlamasına olanak tanır. Ultralytics, eğitim başlangıcında katmanları dondurmak için bir freeze parametresi sağlar ve N epoktan sonra bunların dondurmasını kaldırmak için bir geri çağrı (callback) kullanabilirsiniz:
from ultralytics import YOLO
from ultralytics.models.yolo.detect import DetectionTrainer
from ultralytics.utils import LOGGER
FREEZE_EPOCHS = 5
def unfreeze_backbone(trainer):
"""Callback to unfreeze all layers after FREEZE_EPOCHS."""
if trainer.epoch == FREEZE_EPOCHS:
LOGGER.info(f"Epoch {trainer.epoch}: Unfreezing all layers for fine-tuning")
for name, param in trainer.model.named_parameters():
if not param.requires_grad:
param.requires_grad = True
LOGGER.info(f" Unfroze: {name}")
trainer.freeze_layer_names = [".dfl"]
class FreezingTrainer(DetectionTrainer):
"""Trainer with backbone freezing for first N epochs."""
def __init__(self, *args, **kwargs):
"""Initialize and register the unfreeze callback."""
super().__init__(*args, **kwargs)
self.add_callback("on_train_epoch_start", unfreeze_backbone)
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=20, freeze=10, trainer=FreezingTrainer)freeze=10 parametresi, eğitim başlangıcında ilk 10 katmanı (0-9 indeksleri) dondurur; bu, YOLO26 arka kemiğinin çoğunu kapsar. Arka kemik 0-10 katmanlarını kapsar, bu nedenle freeze=10 son C2PSA bloğunu (10. katman) eğitilebilir bırakır; tüm arka kemiği dondurmak için freeze=11 kullanın. on_train_epoch_start geri çağrısı, her epokun başında tetiklenir ve dondurma süresi tamamlandığında tüm parametrelerin dondurmasını kaldırır.
freeze=10, ilk 10 katmanı, 0-9 indekslerini dondurur (YOLO26 arka kemiğinin çoğunu; 10. katmandaki son C2PSA bloğunu dahil etmek içinfreeze=11kullanın)freeze=[0, 1, 2, 3], belirli katmanları indekse göre dondurur- Daha yüksek
FREEZE_EPOCHSdeğerleri, arka kemik değişmeden önce kafanın uyum sağlaması için daha fazla zaman tanır
Katman Bazında Öğrenme Oranları#
, ağın farklı bölümleri farklı öğrenme oranlarından faydalanabilir. Yaygın bir strateji, öğrenilen özellikleri korumak için önceden eğitilmiş arka kemik için daha düşük bir öğrenme oranı kullanırken, algılama kafasının daha yüksek bir oranla daha hızlı uyum sağlamasına izin vermektir:
import torch
from ultralytics import YOLO
from ultralytics.models.yolo.detect import DetectionTrainer
from ultralytics.utils import LOGGER
from ultralytics.utils.torch_utils import unwrap_model
class PerLayerLRTrainer(DetectionTrainer):
"""Trainer with different learning rates for backbone and head."""
def build_optimizer(self, model, name="auto", lr=0.001, momentum=0.9, decay=1e-5, iterations=1e5):
"""Build optimizer with separate learning rates for backbone and head."""
backbone_params = []
head_params = []
unwrapped = unwrap_model(model)
backbone_len = len(unwrapped.yaml["backbone"]) # YOLO26 backbone spans layers 0-10 (C2PSA at layer 10)
for k, v in unwrapped.named_parameters():
if not v.requires_grad:
continue
is_backbone = any(k.startswith(f"model.{i}.") for i in range(backbone_len))
if is_backbone:
backbone_params.append(v)
else:
head_params.append(v)
backbone_lr = lr * 0.1
optimizer = torch.optim.AdamW(
[
{"params": backbone_params, "lr": backbone_lr, "weight_decay": decay},
{"params": head_params, "lr": lr, "weight_decay": decay},
],
)
LOGGER.info(
f"PerLayerLR optimizer: backbone ({len(backbone_params)} params, lr={backbone_lr}) "
f"| head ({len(head_params)} params, lr={lr})"
)
return optimizer
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=20, trainer=PerLayerLRTrainer)RT-DETR Varyantı#
RT-DETR için model, iki iyileştirme ile aynıdır. Arka kemik uzunluğu model.yaml["backbone"] değerinden okunur, böylece aynı eğitici, katman sayısını sabit kodlamadan (hardcoding) RT-DETR varyantları (RT-DETR-L, RT-DETR-X, ResNet-50/101 arka kemikleri) genelinde çalışır. Parametreler ayrıca, ağırlık çürümesinin (weight decay) BatchNorm parametrelerinden ve yanlılıklardan (biases) hariç tutulması için her bölüm içinde ağırlık, BatchNorm ve yanlılık gruplarına bölünür; bu da varsayılan eğiticinin politikasıyla eşleşir. Bu, özellikle kod çözücü kafasının (decoder head) tipik olarak rastgele başlatıldığı, arka kemiğin ise daha düşük bir öğrenme oranından fayda sağlayan önceden eğitilmiş özellikler taşıdığı RT-DETR ince ayarı için yararlıdır:
import torch
from torch import nn
from ultralytics import RTDETR
from ultralytics.models.rtdetr.train import RTDETRTrainer
from ultralytics.utils import LOGGER, colorstr
from ultralytics.utils.torch_utils import unwrap_model
class RTDETRBackboneLRTrainer(RTDETRTrainer):
"""RT-DETR trainer with a lower learning rate for backbone parameters."""
backbone_lr_ratio = 0.1 # backbone learning rate as a fraction of head learning rate
def build_optimizer(self, model, name="auto", lr=0.001, momentum=0.9, decay=1e-5, iterations=1e5):
"""Build an AdamW optimizer with six param groups: head and backbone x {weight, bn, bias}."""
# Resolve optimizer name; "auto" maps to AdamW with RT-DETR-style defaults
canonical = {"Adam", "Adamax", "AdamW", "NAdam", "RAdam", "auto"}
name = {x.lower(): x for x in canonical}.get(name.lower(), name)
if name == "auto":
name, lr, momentum = "AdamW", 1e-4, 0.9
self.args.warmup_bias_lr = 0.0 # RT-DETR warms biases from 0, unlike YOLO's 0.1
if name not in {"Adam", "Adamax", "AdamW", "NAdam", "RAdam"}:
raise NotImplementedError(f"This trainer only supports AdamW-family optimizers; got {name}")
# Identify backbone parameters from model.yaml and route each param into a (section, kind) group
unwrapped = unwrap_model(model)
backbone_len = len(unwrapped.yaml["backbone"])
norm_types = tuple(v for k, v in nn.__dict__.items() if "Norm" in k)
groups = {f"{s}_{k}": [] for s in ("head", "backbone") for k in ("weight", "bn", "bias")}
for module_name, module in unwrapped.named_modules():
for param_name, param in module.named_parameters(recurse=False):
if not param.requires_grad:
continue
fullname = f"{module_name}.{param_name}" if module_name else param_name
parts = fullname.split(".")
section = (
"backbone"
if len(parts) > 1 and parts[0] == "model" and parts[1].isdigit() and int(parts[1]) < backbone_len
else "head"
)
if "bias" in param_name:
kind = "bias"
elif isinstance(module, norm_types) or "logit_scale" in fullname:
kind = "bn"
else:
kind = "weight"
groups[f"{section}_{kind}"].append(param)
# Build the optimizer with per-group lr and weight decay; backbone groups use lr * backbone_lr_ratio
backbone_lr = lr * self.backbone_lr_ratio
param_groups = [
{"params": groups["head_weight"], "lr": lr, "weight_decay": decay, "param_group": "weight"},
{"params": groups["head_bn"], "lr": lr, "weight_decay": 0.0, "param_group": "bn"},
{"params": groups["head_bias"], "lr": lr, "weight_decay": 0.0, "param_group": "bias"},
{"params": groups["backbone_weight"], "lr": backbone_lr, "weight_decay": decay, "param_group": "weight"},
{"params": groups["backbone_bn"], "lr": backbone_lr, "weight_decay": 0.0, "param_group": "bn"},
{"params": groups["backbone_bias"], "lr": backbone_lr, "weight_decay": 0.0, "param_group": "bias"},
]
param_groups = [pg for pg in param_groups if pg["params"]] # drop empty groups
optimizer = getattr(torch.optim, name)(param_groups, betas=(momentum, 0.999))
LOGGER.info(
f"{colorstr('optimizer:')} {name}(lr={lr}, backbone_lr={backbone_lr}) with parameter groups\n"
f" Head: {len(groups['head_bn'])} bn, {len(groups['head_weight'])} weight(decay={decay}), "
f"{len(groups['head_bias'])} bias (lr={lr})\n"
f" Backbone: {len(groups['backbone_bn'])} bn, {len(groups['backbone_weight'])} weight(decay={decay}), "
f"{len(groups['backbone_bias'])} bias (lr={backbone_lr})"
)
return optimizer
model = RTDETR("rtdetr-l.pt")
model.train(data="coco8.yaml", epochs=20, trainer=RTDETRBackboneLRTrainer)Yaygın bir başlangıç noktası, HGNetV2 arka kemiği ile orijinal RT-DETR kurulumuna eşleşen backbone_lr_ratio = 0.1 değeridir. Literatür, oranı arka kemik boyutu ve ön eğitim verisi ölçeğiyle ters orantılı olarak ölçeklendirmeyi önerir: çok büyük veri setlerinde önceden eğitilmiş büyük arka kemikler (örneğin yüz milyonlarca görüntü üzerinde DINO, CLIP veya MAE ile eğitilmiş ViT-L/H), iyi öğrenilmiş özellikleri korumak için genellikle 0.01 veya altı gibi daha küçük oranlar kullanırken, daha hafif ön eğitime sahip daha küçük arka kemikler 0.5 veya üstü gibi daha büyük oranları tolere eder.
Yerleşik öğrenme oranı zamanlayıcısı (cosine veya linear), grup başına temel öğrenme oranlarının üzerinde uygulanmaya devam eder. Hem arka kemik hem de kafa öğrenme oranları aynı azalma (decay) programını takip ederek eğitim boyunca aralarındaki oranı koruyacaktır.
Bu özelleştirmeler, birden fazla yöntemi geçersiz kılarak ve gerektiğinde geri çağırmalar ekleyerek tek bir eğitici sınıfında birleştirilebilir.
Çoklu GPU Eğitimi için Eşzamanlı BatchNorm#
DistributedDataParallel ile birden çok GPU üzerinde eğitilirken, varsayılan BatchNorm2d katmanları istatistikleri her GPU üzerinde bağımsız olarak hesaplar. GPU başına küçük toplu iş boyutları (batch sizes) kullanan RT-DETR ince ayarı ve diğer tarifler için, GPU başına toplu iş istatistikleri gürültülü olabilir. PyTorch'un SyncBatchNorm öğesi, tek bir küresel toplu iş istatistiği için ortalama ve varyansı tüm sıralar (ranks) arasında senkronize eder; bu da genellikle küçük bir GPU'lar arası iletişim yükü pahasına yakınsamayı iyileştirir.
Dönüşüm, model GPU üzerindeyken ancak DDP onu sarmalamadan önce gerçekleşmelidir. Bunun için en temiz kanca, BaseTrainer öğesinin tam olarak bu pencerede çağırdığı set_model_attributes() öğesidir:
from torch import nn
from ultralytics import RTDETR
from ultralytics.models.rtdetr.train import RTDETRTrainer
class SyncBNTrainer(RTDETRTrainer):
"""RT-DETR trainer that converts BatchNorm to SyncBatchNorm for multi-GPU training."""
def set_model_attributes(self):
"""Run the parent setup, then convert BN to SyncBatchNorm when training on multiple GPUs."""
super().set_model_attributes()
if self.world_size > 1:
self.model = nn.SyncBatchNorm.convert_sync_batchnorm(self.model)
model = RTDETR("rtdetr-l.pt")
model.train(data="coco8.yaml", epochs=20, device=[0, 1], trainer=SyncBNTrainer)world_size > 1 koruması, eğiticinin tek GPU'lu çalışmalarda da kullanılmasının güvenli olmasını sağlar; tek bir GPU'da dönüşüm atlanır ve eğitim normal BatchNorm2d ile devam eder. Aynı model, üst sınıfı DetectionTrainer olarak değiştirerek YOLO için de çalışır.
| Senaryo | Öneri |
|---|---|
| Çoklu GPU eğitimi, GPU başına küçük batch (≤ 16) | Etkinleştir |
| Çoklu GPU eğitimi, GPU başına büyük batch (≥ 32) | İsteğe bağlı; küçük bir fayda sağlar |
| Tek GPU eğitimi | Uygulanamaz (atlanır) |
Yapılandırılabilir Gradyan Kırpma (Gradient Clipping)#
Varsayılan eğitmen, gradyanların nadiren aştığı YOLO modelleri için ayarlanmış esnek bir değer olan optimizer_step() içinde gradyanları max_norm=10.0 değerine kırpar. RT-DETR, DEIM, DINO gibi DETR ailesi dedektörleri, gradyan büyüklüklerinin fırlayabileceği kod çözücünün çapraz dikkat katmanlarını kararlı hale getirmek için genellikle 0.1 gibi çok daha sıkı değerler kullanır. Kırpma değerini geçersiz kılmak için eğitmeni alt sınıfa ayır ve optimizer_step() öğesini geçersiz kıl:
import torch
from ultralytics import RTDETR
from ultralytics.models.rtdetr.train import RTDETRTrainer
class CustomClipTrainer(RTDETRTrainer):
"""RT-DETR trainer with configurable gradient clipping."""
clip_grad_norm = 0.1 # max gradient norm; set to 0 to disable clipping
def optimizer_step(self):
"""Run an optimizer step with a configurable gradient-norm clip."""
self.scaler.unscale_(self.optimizer)
if self.clip_grad_norm > 0:
torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=self.clip_grad_norm)
self.scaler.step(self.optimizer)
self.scaler.update()
self.optimizer.zero_grad()
if self.ema:
self.ema.update(self.model)
model = RTDETR("rtdetr-l.pt")
model.train(data="coco8.yaml", epochs=20, trainer=CustomClipTrainer)Üst sınıfı DetectionTrainer (from ultralytics.models.yolo.detect import DetectionTrainer) olarak değiştirerek ve YOLO("yolo26n.pt") ile bir YOLO kontrol noktası yükleyerek aynı eğitici YOLO için de çalışır. optimizer_step gövdesi değişmez.
| Mimari ailesi | Tipik max_norm |
|---|---|
| RT-DETR / DEIM / DETR ailesi | 0.1 |
| YOLO (Ultralytics varsayılanı) | 10.0 |
| Kırpmayı devre dışı bırak | 0 |
SSS#
Özel eğitmen sınıfını (bir örnek değil)
model.train()içindekitrainerparametresine ilet:from ultralytics import YOLO model = YOLO("yolo26n.pt") model.train(data="coco8.yaml", trainer=MyCustomTrainer)YOLOsınıfı, eğitici örneklemesini dahili olarak yönetir. Eğitici mimarisi hakkında daha fazla ayrıntı için Gelişmiş Özelleştirme sayfasına bakın.Özelleştirme için kullanılabilecek temel yöntemler:
Yöntem Amaç validate()Doğrulamayı çalıştır ve metrikleri döndür build_optimizer()Optimize ediciyi oluştur save_model()Eğitim kontrol noktalarını kaydet get_model()Model örneğini döndür get_validator()Doğrulayıcı örneğini döndür get_dataloader()Veri yükleyiciyi oluştur preprocess_batch()Girdi grubunu ön işle label_loss_items()Kayıt tutma için kayıp öğelerini biçimlendir Tam API referansı için
BaseTrainerbelgelerine bakın.Evet, daha basit özelleştirmeler için geri çağrılar (callbacks) genellikle yeterlidir. Kullanılabilir geri çağrı etkinlikleri arasında
on_train_start,on_train_epoch_start,on_train_epoch_end,on_fit_epoch_endveon_model_saveyer alır. Bunlar, alt sınıfa ayırma gerekmeden eğitim döngüsüne bağlanmanıza olanak tanır. Yukarıdaki arka kemik dondurma örneği bu yaklaşımı göstermektedir.Değişikliğiniz daha basitse (kayıp kazançlarını ayarlamak gibi), hiperparametreleri doğrudan değiştirebilirsiniz:
model.train(data="coco8.yaml", box=10.0, cls=1.5, dfl=2.0)Kayıpta yapısal değişiklikler için (sınıf ağırlıkları eklemek gibi), sınıf ağırlıkları bölümünde gösterildiği gibi kayıp ve modeli alt sınıfa ayırmanız gerekir.