CodeBlanks Logo Icon CodeBlanks

Eğitim döngüsü

Eğitim döngüsü, veriyi modele verip loss'u azaltır.

Eğitim döngüsü

PyTorch'ta eğitim döngüsünü sen yazarsın. Her toplu veri (batch) için aynı beş adım tekrarlanır:

for xb, yb in yukleyici:
    opt.zero_grad()              # 1. eski gradyanları sil
    cikti = model(xb)            # 2. ileri yayılım
    kayip = kayip_fn(cikti, yb)  # 3. kayıp
    kayip.backward()             # 4. geri yayılım
    opt.step()                   # 5. güncelleme

Döngünün açık olması esneklik sağlar: gradyan kırpma, karışık hassasiyet, birden çok kayıp gibi değişiklikler bu beş adımın arasına eklenir.

DataLoader

TensorDataset tensörleri örnek örnek erişilebilir bir veri setine, DataLoader ise onu karıştırılmış toplu verilere çevirir:

from torch.utils.data import TensorDataset, DataLoader
ds = TensorDataset(X, y)
yukleyici = DataLoader(ds, batch_size=32, shuffle=True)
xb, yb = next(iter(yukleyici))
print(xb.shape, yb.shape)   # torch.Size([32, 2]) torch.Size([32])

Toplu veriyle eğitim hem belleğe sığmayı sağlar hem de gradyana yararlı bir gürültü ekleyerek genellemeye yardım eder.

Uygulama Toplu veri

200 örnekli X, y'den TensorDataset ve DataLoader(..., batch_size=64, shuffle=False) kur. Toplu veri sayısını (len(yukleyici)) ve her toplu verinin boyutunu bir liste olarak yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn
from torch.utils.data import TensorDataset, DataLoader

torch.manual_seed(0)
X = torch.randn(200, 2)
y = (X[:, 0] + X[:, 1] > 0).long()
model = nn.Sequential(nn.Linear(2, 16), nn.ReLU(), nn.Linear(16, 2))
kayip_fn = nn.CrossEntropyLoss()
opt = torch.optim.SGD(model.parameters(), lr=0.1)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn
from torch.utils.data import TensorDataset, DataLoader

torch.manual_seed(0)
X = torch.randn(200, 2)
y = (X[:, 0] + X[:, 1] > 0).long()
model = nn.Sequential(nn.Linear(2, 16), nn.ReLU(), nn.Linear(16, 2))
kayip_fn = nn.CrossEntropyLoss()
opt = torch.optim.SGD(model.parameters(), lr=0.1)

yukleyici = DataLoader(TensorDataset(X, y), batch_size=64, shuffle=False)
print(len(yukleyici))
print([len(xb) for xb, _ in yukleyici])

Beklenen çıktı

4
[64, 64, 64, 8]

Soru ve cevaplar

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

1 <code>opt.zero_grad()</code> unutulursa ne olur?

  • Hiçbir şey
  • Gradyanlar adımlar boyunca birikir, güncellemeler bozulur Doğru cevap
  • Hata verir
  • Daha hızlı öğrenir

Açıklama: backward her çağrıda gradyanı ekler; sıfırlanmazsa toplam büyür.

2 Toplu verileri karıştırarak üret.

Soru
yukleyici = DataLoader(ds, batch_size=32, ____=True)
Cevap
yukleyici = DataLoader(ds, batch_size=32, shuffle=True)

Açıklama: shuffle=True her epoch başında sırayı karıştırır.

3 Adımları eşleştir.

Kavram Anlamı
zero_grad Gradyanları sil
model(xb) İleri yayılım
backward Gradyan hesabı
step Parametre güncelleme

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