PyTorch ile bir sınıflandırma modeli için eksiksiz bir training loop yazın. Hangi adımlar sık unutulur?

Cevap

Standart bir PyTorch training loop'u şu adımlardan oluşur: forward, loss, zero_grad, backward, step, ardından gradyansız validation.

import torch, torch.nn as nn
from torch.utils.data import DataLoader

device = "cuda" if torch.cuda.is_available() else "cpu"
model = MyModel().to(device)
criterion = nn.CrossEntropyLoss()                 # logits bekler, softmax ekleme
optimizer = torch.optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)
scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=3e-4,
                                                total_steps=EPOCHS * len(train_loader))
best_val = float("inf")

for epoch in range(EPOCHS):
    model.train()                                 # dropout/BN eğitim modunda
    for x, y in train_loader:
        x, y = x.to(device, non_blocking=True), y.to(device, non_blocking=True)
        optimizer.zero_grad(set_to_none=True)     # gradyanlar birikir, sıfırla
        with torch.autocast(device_type=device, dtype=torch.bfloat16):
            logits = model(x)
            loss = criterion(logits, y)
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
        optimizer.step()
        scheduler.step()

    model.eval()                                  # dropout kapalı, BN running stats
    val_loss, correct, n = 0.0, 0, 0
    with torch.no_grad():                         # bellek ve hız
        for x, y in val_loader:
            x, y = x.to(device), y.to(device)
            logits = model(x)
            val_loss += criterion(logits, y).item() * len(y)
            correct += (logits.argmax(1) == y).sum().item()
            n += len(y)
    val_loss /= n
    print(f"epoch {epoch} val_loss {val_loss:.4f} acc {correct / n:.3f}")
    if val_loss < best_val:
        best_val = val_loss
        torch.save(model.state_dict(), "best.pt")

Sık unutulan / yanlış yapılan adımlar

  • optimizer.zero_grad() unutmak: gradyanlar adımlar arasında toplanır.
  • model.eval() ve torch.no_grad() unutmak: dropout açık kalır, gereksiz grafik tutulur, bellek patlar.
  • Model ile verinin farklı cihazlarda olması.
  • CrossEntropyLoss öncesi softmax uygulamak.
  • Loss'u .item() olmadan biriktirmek: hesaplama grafiği bellekte kalır.
  • Train DataLoader'da shuffle=True unutmak.
  • Seed sabitlemeden deney karşılaştırmak.

Not: BF16 autocast GradScaler gerektirmez. FP16 kullanıyorsanız torch.amp.GradScaler eklemelisiniz.

  1. NumPy ile sayısal olarak kararlı (numerically stable) softmax ve cross-entropy loss yazın. Logit'lere göre gradyanı nedir?ZorDerin ÖğrenmeYapay Zeka
  2. Transfer learning nedir? Önceden eğitilmiş bir modeli küçük bir veri setine nasıl fine-tune edersiniz?OrtaDerin ÖğrenmeYapay Zeka
  3. Embedding nedir? One-hot encoding'e göre avantajı nedir ve nerelerde kullanılır?KolayDerin ÖğrenmeYapay Zeka
  4. Transformer mimarisini anlatın. Encoder-only, decoder-only ve encoder-decoder modeller arasındaki fark nedir?ZorDerin ÖğrenmeYapay Zeka
  5. Self-attention nasıl çalışır? Scaled dot-product attention'ı NumPy ile yazın ve neden sqrt(d_k) ile bölündüğünü açıklayın.ZorDerin ÖğrenmeYapay Zeka
  6. RNN ve LSTM nasıl çalışır? Transformer'lar neden büyük ölçüde onların yerini aldı?OrtaDerin ÖğrenmeYapay Zeka

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle