Büyükler için · görselleştirici + gerçek PyTorch kodu + Colab defteriBitirme
Bitirme projesi: el yazısı rakam tanıyan CNN
MNIST'te küçük bir evrişimli ağ eğit, ölç, hatalarını incele, dışa aktar ve tarayıcıda kendi çizdiğin rakamlarla dene. Colab defteri ve tarayıcıdaki tanıyıcı aynı mimariyi kullanır.
El yazısı rakam tanıyıcı (CNN, tarayıcıda)
Kutucuğa bir rakam çiz. Çizim MNIST gibi hazırlanır (kırp, 20×20'ye sığdır, kütle merkezine göre 28×28'e ortala), CNN tarayıcıda çalışır ve on olasılığı verir. Kendi Colab defterinden indirdiğin ağırlık dosyasını yükleyip onu da deneyebilirsin.
Senaryo
Bir okul, öğrencilerin tablete yazdığı tek haneli cevapları otomatik okumak istiyor. Model telefonda ve tarayıcıda, internete görüntü göndermeden çalışmalı. Sen modeli eğitir, sınırlarını ölçer, dağıtıma hazırlar ve bir demo sayfasında gösterirsin.
Gereksinimler (test edilebilir)
- G1: MNIST test kümesinde doğruluk en az %98.
- G2: Model 50 000 parametreden küçük; fp32 ağırlık dosyası 200 KB'den küçük.
- G3: Karışıklık matrisi ve en çok karıştırılan üç sınıf çifti raporlanır; her biri için 5 yanlış örnek gösterilir.
- G4: Eğitim tekrarlanabilir: aynı tohumla iki çalıştırmada test doğruluğu ±%0,1 içinde.
- G5: Ağırlıklar JSON (tarayıcı) ve ONNX olarak dışa aktarılır; tarayıcıdaki tanıyıcıya yüklenince aynı 200 test örneğinde PyTorch ile aynı tahminleri verir.
- G6: Kendi çizdiğin 30 rakamlık bir küme (her rakamdan 3) toplanır ve doğruluğu ayrıca raporlanır (dağılım kayması).
Mimari
- Veri: torchvision.datasets.MNIST, eğitimden %10 doğrulama ayrımı (sabit tohum), Normalize(0,1307, 0,3081) (5. ve 6. üniteler).
- Model: Conv2d(1,8,3,p=1) → ReLU → MaxPool → Conv2d(8,16,3,p=1) → ReLU → MaxPool → Linear(784,10); isteğe bağlı Dropout (3., 7. ve 8. üniteler).
- Eğitim: Adam lr = 1e-3, 4–8 tur, erken durdurma ve en iyi checkpoint (4. ve 5. üniteler).
- Değerlendirme: doğruluk, karışıklık matrisi, yanlış örnek galerisi, öznitelik haritaları (7. ünite).
- Dağıtım: state_dict, JSON ve ONNX; int8 nicemleme denemesi ve ölçümü (10. ünite).
- Demo: bu sayfadaki tarayıcı tanıyıcı (kendi ağırlık JSON'unla) ya da onnxruntime-web ile kendi sayfan.
Test planı
- Birim: model rastgele (4, 1, 28, 28) girdide (4, 10) çıkış verir; parametre sayısı beklenen değerde.
- Birim: tek bir küçük yığını (32 örnek) 200 adımda ezberleyebilir (kayıp < 0,01): döngüde hata yok.
- Birim: Dataset ve DataLoader şekil ve tip testleri; doğrulama ayrımı tohumla aynı.
- Tutarlılık: PyTorch ve tarayıcı (JSON) tahminleri 200 test örneğinde aynı (G5).
- Kabul: G1–G6 ölçütlerini hesaplayan son defter hücresi ve sonuç tablosu.
- Gürbüzlük: ±2 piksel kaydırılmış ve hafif döndürülmüş test görüntülerinde doğruluk.
Demo ve sunum
- Canlı demo: tarayıcıda rakam çiz; olasılıklar ve öznitelik haritaları.
- Karışıklık matrisinden bir hata türünü seç ve neden olduğunu örneklerle açıkla.
- Nicemleme öncesi/sonrası: boyut, doğruluk, süre.
- Kendi çizimlerindeki doğruluk ile MNIST doğruluğu arasındaki farkı ve nedenini (veri dağılımı) tartış.
Başlangıç kodu
import json
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
tf = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
tr = datasets.MNIST('veri', train=True, download=True, transform=tf)
te = datasets.MNIST('veri', train=False, download=True, transform=tf)
tr_dl = DataLoader(tr, batch_size=64, shuffle=True)
te_dl = DataLoader(te, batch_size=1000)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = KucukCNN().to(device) # 7. ünitedeki sınıf
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(4):
model.train()
for xb, yb in tr_dl:
xb, yb = xb.to(device), yb.to(device)
opt.zero_grad()
nn.functional.cross_entropy(model(xb), yb).backward()
opt.step()
model.eval(); dogru = 0
with torch.no_grad():
for xb, yb in te_dl:
dogru += (model(xb.to(device)).argmax(1).cpu() == yb).sum().item()
print(f'epoch {epoch + 1}: test doğruluğu {dogru / len(te):.4f}') # ≈ 0,985
# tarayıcıdaki tanıyıcıya yüklenecek JSON
r = lambda t: [round(v, 6) for v in t.detach().cpu().flatten().tolist()]
sd = model.state_dict()
json.dump({'mean': 0.1307, 'std': 0.3081,
'conv1': {'w': r(sd['conv1.weight']), 'b': r(sd['conv1.bias'])},
'conv2': {'w': r(sd['conv2.weight']), 'b': r(sd['conv2.bias'])},
'fc': {'w': r(sd['fc.weight']), 'b': r(sd['fc.bias'])}}, open('agirliklar.json', 'w'))Colab defteri
PyTorch tarayıcıda çalışmaz; gerçek kodu Google Colab'da (ücretsiz GPU ile) çalıştır. Defteri indir, colab.research.google.com adresinde "Dosya → Not defteri yükle" ile aç, "Çalışma zamanı → Çalışma zamanı türünü değiştir → T4 GPU" seç ve hücreleri sırayla çalıştır.
Defteri indir (.ipynb)Teslimler
- 3. üniteden sonraÖneri ve model taslağı
Kapsam, gereksinimler (G1–G6), model sınıfı ve şekil testi.
nn.Module: katmanlar, parametreler ve model yazmak - 6. üniteden sonraVeri hattı ve ilk eğitim
Dataset/DataLoader, doğrulama ayrımı, ilk eğitim eğrileri ve tek yığın ezberleme testi.
Dataset ve DataLoader: veriyi yığınlar hâlinde beslemek - 8. üniteden sonraDeğerlendirme ve iyileştirme
G1 ve G4; karışıklık matrisi, yanlış örnekler, düzenlileştirme ablasyonu.
Aşırı öğrenme ve düzenlileştirme - 10. üniteden sonraDağıtım ve demo
JSON ve ONNX dışa aktarma, tarayıcıda tutarlılık testi (G5), nicemleme ölçümü, kendi çizim kümen (G6), 5 dakikalık demo ve kısa rapor.
Aktarım öğrenmesi ve dağıtım