CodeBlanks Logo Icon CodeBlanks

Eğitim

Eğitim döngüsü yazarsın.

Eğitim ve değerlendirme

Tam eğitim, toplu verilerle birkaç epoch sürer; her epoch sonunda test doğruluğu ölçülür:

from torch.utils.data import TensorDataset, DataLoader
yukleyici = DataLoader(TensorDataset(X_train, y_train), batch_size=32, shuffle=True)
for epoch in range(5):
    model.train()
    for xb, yb in yukleyici:
        opt.zero_grad()
        kayip_fn(model(xb), yb).backward()
        opt.step()
    model.eval()
    with torch.no_grad():
        dogruluk = (model(X_test).argmax(1) == y_test).float().mean().item()
    print(epoch, dogruluk)

Bu kadar belirgin bir desen için birkaç epoch'ta neredeyse kusursuz doğruluk beklenir.

Yeni bir örnek üzerinde

Eğitilmiş modeli tek bir görüntüde denemek için toplu veri boyutu eklenir ve olasılıklar softmax ile alınır:

yeni = torch.zeros(1, 16, 16)
yeni[0, :, 7:9] = 1.0                    # dikey çizgi
model.eval()
with torch.no_grad():
    p = torch.softmax(model(yeni.unsqueeze(0)), dim=1)
print(p.argmax(1).item())                # 1: dikey

Eğitimde hiç görülmemiş biçimler (çapraz çizgi gibi) modelin sınırlarını gösterir: hangi sınıfa ne güvenle atandığına bakılır.

Uygulama Eğit ve ölç

batch_size=32, shuffle=True ile 5 epoch eğit. Test doğruluğunun 0.95'ten büyük olduğunu yazdır. Ardından elle çizilmiş dikey ve yatay çizgi görüntülerinin tahminlerini bir liste olarak yazdır (önce dikey).

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)
from torch.utils.data import TensorDataset, DataLoader

# 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)
from torch.utils.data import TensorDataset, DataLoader

yukleyici = DataLoader(TensorDataset(X_train, y_train), batch_size=32, shuffle=True)
for epoch in range(5):
    model.train()
    for xb, yb in yukleyici:
        opt.zero_grad()
        kayip_fn(model(xb), yb).backward()
        opt.step()
model.eval()
with torch.no_grad():
    print((model(X_test).argmax(1) == y_test).float().mean().item() > 0.95)
    dikey = torch.zeros(1, 1, 16, 16)
    dikey[0, 0, :, 7:9] = 1.0
    yatay = torch.zeros(1, 1, 16, 16)
    yatay[0, 0, 7:9, :] = 1.0
    print(model(torch.cat([dikey, yatay])).argmax(1).tolist())

Beklenen çıktı

True
[1, 0]

Soru ve cevaplar

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

1 Test doğruluğu eğitimden sonra hâlâ 0.5 civarındaysa ilk ne kontrol edilmelidir?

  • Etiketlerin ve verinin eşleştiği, kaybın düştüğü Doğru cevap
  • GPU sürücüsü
  • Görüntü renkleri
  • Hiçbir şey

Açıklama: 0.5, iki sınıfta rastgele tahmin demektir; model hiçbir şey öğrenmemiştir.

2 Tek görüntüye toplu veri boyutu ekle.

Soru
p = torch.softmax(model(yeni.____(0)), dim=1)
Cevap
p = torch.softmax(model(yeni.unsqueeze(0)), dim=1)

Açıklama: Model (N, C, H, W) bekler; tek görüntü (C, H, W)'dir.

3 Adımları eşleştir.

Kavram Anlamı
model.train() Eğitim modu
model.eval() Değerlendirme modu
argmax(1) Sınıf tahmini
softmax Olasılıklar

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