YOLO Vision 2026:

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:

  1. Her epoch sonunda özel metrikleri (F1 skoru) kaydetme
  2. Sınıf dengesizliğini ele almak için sınıf ağırlıkları ekleme
  3. Farklı bir metriğe dayalı olarak en iyi modeli kaydetme
  4. İlk N epok için arka kemiği (backbone) dondurma ve ardından dondurmayı kaldırma
  5. Katman başına öğrenme oranları belirleme
  6. Çoklu GPU eğitimi için GPU'lar arasında BatchNorm'u senkronize etme
  7. Kararlılık ayarı için gradyan kırpma (gradient clipping) yapılandırma
Ön koşullar

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.

Kullanılabilir Metrikler

Doğrulayıcı, self.validator.metrics.box aracılığıyla birçok metriğe erişim sağlar:

ÖznitelikAçıklama
f1Sınıf başına F1 skoru
image_metricsPrecision, recall, F1, TP, FP ve FN içeren resim başına metrik sözlüğü
pSınıf başına Precision
rSınıf başına Recall
ap50Sınıf başına 0.5 IoU'da AP
apSınıf başına 0.5:0.95 IoU aralığında AP
mp, mrOrtalama precision ve recall
map50, mapOrtalama 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)
Veri Setinden Ağırlıkları Hesaplama

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]
Özel sınıflara sahip bir model yükleme

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)
Kullanılabilir Metrikler

Doğrulama sonrasında self.metrics içinde bulunan yaygın metrikler şunlardır:

AnahtarAçı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.

Nelerin Dondurulacağını Seçme
  • freeze=10, ilk 10 katmanı, 0-9 indekslerini dondurur (YOLO26 arka kemiğinin çoğunu; 10. katmandaki son C2PSA bloğunu dahil etmek için freeze=11 kullanın)
  • freeze=[0, 1, 2, 3], belirli katmanları indekse göre dondurur
  • Daha yüksek FREEZE_EPOCHS değ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)
`backbone_lr_ratio` Seçimi

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.

Öğrenme Oranı Zamanlayıcısı

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.

Teknikleri Birleştirme

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.

Ne zaman SyncBatchNorm kullanılmalı
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ğitimiUygulanamaz (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.

Tipik `clip_grad_norm` değerleri
Mimari ailesiTipik max_norm
RT-DETR / DEIM / DETR ailesi0.1
YOLO (Ultralytics varsayılanı)10.0
Kırpmayı devre dışı bırak0

SSS#

  • Özel eğitmen sınıfını (bir örnek değil) model.train() içindeki trainer parametresine ilet:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.train(data="coco8.yaml", trainer=MyCustomTrainer)

    YOLO sı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öntemAmaç
    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 BaseTrainer belgelerine 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_end ve on_model_save yer 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.

Yorumlar