Loss ve optimizer
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 61/78
- 7 dk
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.69Eğ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 beklenirBu 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
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
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.
opt = torch.optim.____(model.parameters(), lr=0.01)
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 |