Eğitim döngüsü
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 35/78
- 5 dk
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üncellemeDö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
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=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.
yukleyici = DataLoader(ds, batch_size=32, ____=True)
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 |