CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

model.py
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

model.py
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

model.py
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

model.py
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.

Soru
mlp = nn.Sequential(nn.Linear(2, 32), nn.____(), nn.Linear(32, 2))
Cevap
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

İleri seviye bölümündeki tüm dersler