Makine Öğrenmesi
Meydan okuma 1
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.
Örnek çözümü göster
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)
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.
Örnek çözümü göster
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)
Kendini test et
-
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
Cevabı göster
Sınıflar düz bir çizgiyle ayrılamaz — Ay biçimleri birbirinin içine girer; sınır eğri olmalıdır.
-
Aradaki doğrusal olmamayı ekle.
mlp = nn.Sequential(nn.Linear(2, 32), nn.____(), nn.Linear(32, 2))
Cevabı göster
mlp = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 2))
-
Modelleri eşleştir.
- 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
Sıradaki ders: Meydan okuma 2