Meydan okuma 1
- Makine Öğrenmesi kursu
- İleri seviye
- Ders 75/78
- 8 dk
PyTorch ile tensor işlemleri yaparsın.
Meydan okuma 1: doğrusal olmayan sınır
İç içe geçmiş iki yarım ay biçimli sınıfı ayıracak bir sinir ağı yazacaksın. Doğrusal bir model bu veride ancak ~%85 doğruluğa ulaşır; gizli katmanlı bir ağ sınırı kıvırabilir:
dogrusal = nn.Linear(2, 2)
mlp = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 32), nn.ReLU(), nn.Linear(32, 2))Tam veriyle (toplu veri olmadan) birkaç yüz adım Adam yeterlidir; veri küçük olduğu için her adım tüm örnekleri kullanabilir.
Uygulama Doğrusal ve MLP
Bir train fonksiyonu yaz: modeli Adam(lr=0.01) ve CrossEntropyLoss ile tüm veride 500 adım eğitip eğitim doğruluğunu döndürsün. Doğrusal modelin doğruluğunun 0.9'dan küçük, MLP'ninkinin 0.97'den büyük olduğunu aynı satırda yazdır.
Başlangıç kodu
import math
import torch
from torch import nn
torch.manual_seed(0)
def ay(n):
t = torch.rand(n) * math.pi
ust = torch.stack([torch.cos(t), torch.sin(t)], 1)
alt = torch.stack([1 - torch.cos(t), 0.5 - torch.sin(t)], 1)
X = torch.cat([ust, alt]) + 0.1 * torch.randn(2 * n, 2)
y = torch.cat([torch.zeros(n), torch.ones(n)]).long()
return X, y
X, y = ay(200)
# buraya yazÖrnek çözüm
import math
import torch
from torch import nn
torch.manual_seed(0)
def ay(n):
t = torch.rand(n) * math.pi
ust = torch.stack([torch.cos(t), torch.sin(t)], 1)
alt = torch.stack([1 - torch.cos(t), 0.5 - torch.sin(t)], 1)
X = torch.cat([ust, alt]) + 0.1 * torch.randn(2 * n, 2)
y = torch.cat([torch.zeros(n), torch.ones(n)]).long()
return X, y
X, y = ay(200)
def train(model):
opt = torch.optim.Adam(model.parameters(), lr=0.01)
kayip_fn = nn.CrossEntropyLoss()
for _ in range(500):
opt.zero_grad()
kayip_fn(model(X), y).backward()
opt.step()
with torch.no_grad():
return (model(X).argmax(1) == y).float().mean().item()
dogrusal = train(nn.Linear(2, 2))
mlp = train(nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 32), nn.ReLU(), nn.Linear(32, 2)))
print(dogrusal < 0.9, mlp > 0.97)Beklenen çıktı
True True
Uygulama Doğrulama ile erken durdurma
Veriyi karıştırıp 300 eğitim, 100 doğrulama olarak böl. MLP'yi 1000 adım eğit; her 50 adımda doğrulama kaybını ölç ve en iyi kayıptaki state_dict'i copy.deepcopy ile sakla. En iyi ağırlıkları geri yükleyip doğrulama doğruluğunun 0.95'ten büyük olduğunu yazdır.
Başlangıç kodu
import math
import torch
from torch import nn
torch.manual_seed(0)
def ay(n):
t = torch.rand(n) * math.pi
ust = torch.stack([torch.cos(t), torch.sin(t)], 1)
alt = torch.stack([1 - torch.cos(t), 0.5 - torch.sin(t)], 1)
X = torch.cat([ust, alt]) + 0.1 * torch.randn(2 * n, 2)
y = torch.cat([torch.zeros(n), torch.ones(n)]).long()
return X, y
X, y = ay(200)
import copy
# buraya yazÖrnek çözüm
import math
import torch
from torch import nn
torch.manual_seed(0)
def ay(n):
t = torch.rand(n) * math.pi
ust = torch.stack([torch.cos(t), torch.sin(t)], 1)
alt = torch.stack([1 - torch.cos(t), 0.5 - torch.sin(t)], 1)
X = torch.cat([ust, alt]) + 0.1 * torch.randn(2 * n, 2)
y = torch.cat([torch.zeros(n), torch.ones(n)]).long()
return X, y
X, y = ay(200)
import copy
sira = torch.randperm(len(X))
egit, dog = sira[:300], sira[300:]
model = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 32), nn.ReLU(), nn.Linear(32, 2))
opt = torch.optim.Adam(model.parameters(), lr=0.01)
kayip_fn = nn.CrossEntropyLoss()
en_iyi, en_iyi_durum = float("inf"), None
for adim in range(1000):
opt.zero_grad()
kayip_fn(model(X[egit]), y[egit]).backward()
opt.step()
if adim % 50 == 0:
with torch.no_grad():
k = kayip_fn(model(X[dog]), y[dog]).item()
if k < en_iyi:
en_iyi, en_iyi_durum = k, copy.deepcopy(model.state_dict())
model.load_state_dict(en_iyi_durum)
with torch.no_grad():
print((model(X[dog]).argmax(1) == y[dog]).float().mean().item() > 0.95)Beklenen çıktı
True
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Doğrusal model neden bu veride yetersiz kalır?
- Veri çok azdır
- Özellik sayısı fazladır
- Kalmaz
- Sınıflar düz bir çizgiyle ayrılamaz Doğru cevap
Açıklama: Ay biçimleri birbirinin içine girer; sınır eğri olmalıdır.
2 Aradaki doğrusal olmamayı ekle.
mlp = nn.Sequential(nn.Linear(2, 32), nn.____(), nn.Linear(32, 2))
mlp = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 2))
Açıklama: Aktivasyonsuz katmanlar tek doğrusal dönüşüme çöker.
3 Modelleri eşleştir.
| Kavram | Anlamı |
|---|---|
nn.Linear(2, 2) |
Düz sınır |
MLP |
Eğri sınır |
ReLU |
Kıvrım kazandırır |
Adam |
Optimize edici |