CodeBlanks Logo Icon CodeBlanks

Epoch

Epoch, tüm verinin bir kez eğitim için kullanılmasıdır.

Epoch

Bir epoch, tüm eğitim verisinin modelden bir kez geçmesidir. N örnek ve B toplu veri boyutuyla bir epoch ⌈N/B⌉ adım sürer. Modeller genellikle onlarca ya da yüzlerce epoch eğitilir:

for epoch in range(20):
    toplam = 0.0
    for xb, yb in yukleyici:
        opt.zero_grad()
        kayip = kayip_fn(model(xb), yb)
        kayip.backward()
        opt.step()
        toplam += kayip.item() * len(xb)
    print(epoch, toplam / len(ds))   # epoch ortalama kaybı

Epoch kaybını toplu veri boyutuyla ağırlıklandırmak, son küçük toplu verinin ortalamayı çarpıtmasını önler.

Eğitim ve değerlendirme modu

Dropout ve BatchNorm gibi katmanlar eğitimde ve değerlendirmede farklı davranır. model.train() ve model.eval() bu modu değiştirir; değerlendirmede ayrıca torch.no_grad() kullanılır:

model.eval()
with torch.no_grad():
    tahmin = model(X_val).argmax(dim=1)
    dogruluk = (tahmin == y_val).float().mean().item()
model.train()   # eğitime dönmeden önce

eval() gradyan hesabını kapatmaz; yalnızca katman davranışını değiştirir. İkisi ayrı işlerdir.

Uygulama Epoch döngüsü

Verilen model, kayıp ve optimize ediciyle batch_size=32, shuffle=True yükleyicisini kur ve 30 epoch eğit. Her epoch'un örnek ağırlıklı ortalama kaybını listede topla. İlk ve son epoch kayıpları için son < ilk sonucunu, ardından eğitim doğruluğunun 0.9'dan büyük olduğunu 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=32, shuffle=True)
kayiplar = []
for epoch in range(30):
    toplam = 0.0
    for xb, yb in yukleyici:
        opt.zero_grad()
        kayip = kayip_fn(model(xb), yb)
        kayip.backward()
        opt.step()
        toplam += kayip.item() * len(xb)
    kayiplar.append(toplam / len(X))
print(kayiplar[-1] < kayiplar[0])
with torch.no_grad():
    print((model(X).argmax(dim=1) == y).float().mean().item() > 0.9)

Beklenen çıktı

True
True

Soru ve cevaplar

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

1 1000 örnek ve batch_size=32 ile bir epoch kaç adımdır?

  • 32 Doğru cevap
  • 31
  • 1000
  • 33

Açıklama: ⌈1000/32⌉ = 32: 31 tam toplu veri ve 8 örnekli son toplu veri.

2 Modeli değerlendirme moduna al.

Soru
model.____()
Cevap
model.eval()

Açıklama: eval() dropout'u kapatır, BatchNorm'un kayıtlı istatistiklerini kullanır.

3 Kavramları eşleştir.

Kavram Anlamı
epoch Verinin tam bir turu
adım Bir toplu veri güncellemesi
model.eval() Değerlendirme davranışı
torch.no_grad() Gradyansız hesap

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