Eğitim
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 62/78
- 7 dk
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: dikeyEğ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
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
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.
p = torch.softmax(model(yeni.____(0)), dim=1)
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 |