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()vetorch.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=Trueunutmak. - Seed sabitlemeden deney karşılaştırmak.
Not: BF16 autocast GradScaler gerektirmez. FP16 kullanıyorsanız torch.amp.GradScaler eklemelisiniz.
İlgili Derin Öğrenme soruları
- NumPy ile sayısal olarak kararlı (numerically stable) softmax ve cross-entropy loss yazın. Logit'lere göre gradyanı nedir?
- Transfer learning nedir? Önceden eğitilmiş bir modeli küçük bir veri setine nasıl fine-tune edersiniz?
- Embedding nedir? One-hot encoding'e göre avantajı nedir ve nerelerde kullanılır?
- Transformer mimarisini anlatın. Encoder-only, decoder-only ve encoder-decoder modeller arasındaki fark nedir?
- 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.
- RNN ve LSTM nasıl çalışır? Transformer'lar neden büyük ölçüde onların yerini aldı?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.