Epoch
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 36/78
- 5 dk
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 önceeval() 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
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
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.
model.____()
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 |