CodeBlanks Logo Icon CodeBlanks

Loss ve optimizer

CrossEntropy loss ve SGD optimizer kullanırsın.

Kayıp ve optimize edici

İki sınıflı sınıflandırma için CrossEntropyLoss (2 logit) kullanıyoruz. Optimize edici olarak Adam küçük CNN'lerde hızlı ve ayara az duyarlıdır:

kayip_fn = nn.CrossEntropyLoss()
opt = torch.optim.Adam(model.parameters(), lr=0.01)
with torch.no_grad():
    print(kayip_fn(model(X_train), y_train).item())   # eğitim öncesi ≈ log(2) = 0.69

Eğitim öncesi kaybın log(sınıf sayısı) civarında olması, modelin henüz rastgele tahmin yaptığını ve kurulumun doğru olduğunu gösteren bir akıl sağlığı testidir.

Tek toplu veride ezberleme testi

Bir modelin öğrenebildiğini doğrulamanın en hızlı yolu, tek bir küçük toplu veriyi ezberletmektir. Kayıp sıfıra yaklaşmıyorsa kodda bir hata vardır (yanlış etiket, eksik zero_grad, yanlış kayıp):

xb, yb = X_train[:16], y_train[:16]
for _ in range(100):
    opt.zero_grad()
    kayip = kayip_fn(model(xb), yb)
    kayip.backward()
    opt.step()
print(kayip.item() < 0.05)   # True beklenir

Bu test birkaç saniye sürer ve saatler süren boşa eğitimleri önler.

Uygulama Akıl sağlığı testleri

Eğitim öncesi kaybın log(2)'ye yakın olduğunu (abs(kayip - 0.693) < 0.1) yazdır. Ardından ilk 16 örnekle 100 adım eğitip kaybın 0.05'ten küçük olduğunu yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
def veri(n):
    X = torch.rand(n, 1, 16, 16) * 0.3
    y = torch.randint(0, 2, (n,))
    for k in range(n):
        if y[k] == 0:
            X[k, 0, 7:9, :] += 1.0
        else:
            X[k, 0, :, 7:9] += 1.0
    return X, y

X_train, y_train = veri(256)
X_test, y_test = veri(64)

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Flatten(), nn.Linear(16 * 4 * 4, 2))
kayip_fn = nn.CrossEntropyLoss()
opt = torch.optim.Adam(model.parameters(), lr=0.01)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
def veri(n):
    X = torch.rand(n, 1, 16, 16) * 0.3
    y = torch.randint(0, 2, (n,))
    for k in range(n):
        if y[k] == 0:
            X[k, 0, 7:9, :] += 1.0
        else:
            X[k, 0, :, 7:9] += 1.0
    return X, y

X_train, y_train = veri(256)
X_test, y_test = veri(64)

model = nn.Sequential(
    nn.Conv2d(1, 8, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(8, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Flatten(), nn.Linear(16 * 4 * 4, 2))
kayip_fn = nn.CrossEntropyLoss()
opt = torch.optim.Adam(model.parameters(), lr=0.01)

with torch.no_grad():
    ilk = kayip_fn(model(X_train), y_train).item()
print(abs(ilk - 0.693) < 0.1)
xb, yb = X_train[:16], y_train[:16]
for _ in range(100):
    opt.zero_grad()
    kayip = kayip_fn(model(xb), yb)
    kayip.backward()
    opt.step()
print(kayip.item() < 0.05)

Beklenen çıktı

True
True

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 10 sınıflı bir problemde eğitim öncesi kayıp yaklaşık kaç olmalıdır?

  • 10
  • 2.3 (log 10) Doğru cevap
  • 0
  • 0.69

Açıklama: Rastgele tahmin her sınıfa 1/10 olasılık verir: -log(0.1) ≈ 2.30.

2 Adam optimize ediciyi kur.

Soru
opt = torch.optim.____(model.parameters(), lr=0.01)
Cevap
opt = torch.optim.Adam(model.parameters(), lr=0.01)

Açıklama: Adam uyarlamalı öğrenme oranı kullanır.

3 Testleri eşleştir.

Kavram Anlamı
başlangıç kaybı ≈ log(K) Kurulum doğru
tek toplu veri ezberi Model öğrenebiliyor
kayıp düşmüyor Kodda hata
Adam Uyarlamalı optimize edici

İleri seviye bölümündeki tüm dersler