Bölüm 4 · Gören ve yazan modeller · Ders 21
Rakam tanıma: makine nasıl görür?
144 piksel, 10 nöron ve softmax: kutu etiketini okumak
Veri. Ayıklama hattında robot kol, kutuları üzerlerindeki tek haneli etiket numarasına göre on ayrı rafa koyuyor. Kamera her etiketi 12×12 piksellik gri bir görüntü olarak görür: etiket biraz kaymış, görüntü karıncalı. Elimizde numarası bilinen 3.000 etiket görüntüsü var; model hiç görmediği 500 etikette sınanır.
import numpy as nprng = np.random.default_rng(10)S = ['111101101101111', '010110010010111', # 5×3 rakam şablonları: 0, 1'111001111100111', '111001111001111', '101101111001001', # 2, 3, 4'111100111001111', '111100111101111', '111001001001001', # 5, 6, 7'111101111101111', '111101111001001'] # 8, 9def label(d, noise=0.35): # kameradaki etiketimg = np.zeros((12, 12))r, c = rng.integers(0, 2), rng.integers(3, 5) # biraz kaymışg = np.array(list(S[d]), float).reshape(5, 3)img[r:r + 10, c:c + 6] = np.kron(g, np.ones((2, 2))) # 2× büyütnoisy = img + rng.normal(0, noise, img.shape) # karıncalı görüntüreturn np.clip(noisy, 0, 1).ravel() # 144 sayıy = rng.integers(0, 10, 3500) # etiket numaralarıX = np.array([label(d) for d in y]) # 3.000 eğitim + 500 testW, b = np.zeros((144, 10)), np.zeros(10) # 1.440 ağırlık, hepsi 0keys = 'step loss acc val_loss val_acc grad_norm'.split() # geçmiş: her 10 grupta bir satırhistory, lsum, osum = {k: [] for k in keys}, 0, 0for tour in range(3):for i in range(0, 3000, 30): # 30'luk gruplarx, t = X[i:i + 30], y[i:i + 30]p = np.exp(x @ W + b); p /= p.sum(1, keepdims=True) # puanlar → softmaxlsum -= np.log(p[np.arange(30), t]).sum() # grubun kaybıosum += (p.argmax(1) == t).sum() # grubun doğrusup[np.arange(30), t] -= 1 # hata: olasılık − cevapW -= 0.1 * x.T @ p / 30; b -= 0.1 * p.mean(0) # küçük adımif i // 30 % 10 == 9: # doğrulama: görmediği 500 etiketv = np.exp(X[3000:] @ W + b)v /= v.sum(1, keepdims=True)g = np.linalg.norm(x.T @ p / 30) # gradyan normuvl = -np.log(v[np.arange(500), y[3000:]]).mean()va = (v.argmax(1) == y[3000:]).mean()row = (tour * 100 + i // 30 + 1, lsum / 300,osum / 300, vl, va, g)for k, q in zip(keys, row):history[k].append(float(q))lsum = osum = 0pred = (X[3000:] @ W + b).argmax(1) # görmediği 500 etiketprint(f'tur {tour + 1}:', (pred == y[3000:]).sum()) # 500 içinde doğruC = np.zeros((10, 10), int) # karışıklık matrisinp.add.at(C, (y[3000:], pred), 1) # satır gerçek, sütun tahminf1 = 2 * C.diagonal() / (C.sum(0) + C.sum(1)) # rakam başına F1for k in keys[1:5]: # son ölçümler tablosuprint(f'{k:<10}{history[k][-1]:>10.4f}')print('F1:', f1.round(2))print(C)import csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yazw = csv.writer(f)w.writerows([keys, *zip(*history.values())]) # satır başına 10 gruptry:import matplotlib.pyplot as plt # varsa grafik çizfig, ax = plt.subplots(1, 2, figsize=(9, 3.2))s = history['step']for j, k in enumerate(('loss', 'acc')):ax[j].plot(s, history[k], label=k)ax[j].plot(s, history['val_' + k], label='val_' + k)ax[j].legend()plt.show()except ImportError:print('matplotlib yok: grafik atlandı')
Eğitim paneli
Eğitim çalıştırılıyor…
Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.
Veri seti
Tüm veri setleri →Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.
Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide
Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.
Çıktı
Çıktı burada görünecek.Nasıl çalışır
- Her piksel bir sayıdır: 0 karanlık, 1 parlak. Satırlar art arda dizilince görüntü 144 sayılık bir liste olur; modelin gördüğü yalnız budur.
- Her rakam için bir nöron var. Nöron her pikseli kendi ağırlığıyla çarpıp toplar ve bir puan verir. Softmax on puanı toplamı %100 olan olasılıklara çevirir.
- 1.440 ağırlığın hepsi sıfırdan başlar, yani her rakam önce %10 alır. 30 örneklik her grupta hata (olasılık eksi doğru cevap) her ağırlığı biraz iter.
- Bir nöronun 144 ağırlığını yeniden 12×12 dizince ne aradığı görünür: yeşil "burası parlaksa benim rakamım", kırmızı "burası parlaksa değil". Sıfır nöronu yeşil bir halka ve kırmızı bir orta öğrenir.
- Şunu dene: gürültüyü 0,7 yap. Kamera kötüleşir, haritalar lekelenir ve test doğruluğu belirgin düşer.
Neden önemli
Depo ve kargo ayıklama hatlarında kamera; etiket, seri numarası ve sayaç okur. Bugünkü görüntü modelleri bu katmanlardan çok sayıda üst üste dizer: ilk katmanlar kenar ve küçük çizgileri, derindekiler halka, yüz ya da araba gibi şekilleri bulur.
ESOF 323, 11. hafta: robotlarda derin öğrenme →