Makine Öğrenmesi
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.
Örnek çözümü göster
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)
Kendini test et
-
10 sınıflı bir problemde eğitim öncesi kayıp yaklaşık kaç olmalıdır?
Cevabı göster
2.3 (log 10) — Rastgele tahmin her sınıfa 1/10 olasılık verir: -log(0.1) ≈ 2.30.
-
Adam optimize ediciyi kur.
opt = torch.optim.____(model.parameters(), lr=0.01)
Cevabı göster
opt = torch.optim.Adam(model.parameters(), lr=0.01)
-
Testleri eşleştir.
- 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
Sıradaki ders: Eğitim