Okullar için Robotik ve Mühendislik · anaokulundan liseye

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.

kameradan bir etiket: 83000 eğitim · 500 test · gürültü 0,35
1 / 60
rakam_tanima.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(10)
  3. S = ['111101101101111', '010110010010111', # 5×3 rakam şablonları: 0, 1
  4. '111001111100111', '111001111001111', '101101111001001', # 2, 3, 4
  5. '111100111001111', '111100111101111', '111001001001001', # 5, 6, 7
  6. '111101111101111', '111101111001001'] # 8, 9
  7. def label(d, noise=0.35): # kameradaki etiket
  8. img = np.zeros((12, 12))
  9. r, c = rng.integers(0, 2), rng.integers(3, 5) # biraz kaymış
  10. g = np.array(list(S[d]), float).reshape(5, 3)
  11. img[r:r + 10, c:c + 6] = np.kron(g, np.ones((2, 2))) # 2× büyüt
  12. noisy = img + rng.normal(0, noise, img.shape) # karıncalı görüntü
  13. return np.clip(noisy, 0, 1).ravel() # 144 sayı
  14. y = rng.integers(0, 10, 3500) # etiket numaraları
  15. X = np.array([label(d) for d in y]) # 3.000 eğitim + 500 test
  16. W, b = np.zeros((144, 10)), np.zeros(10) # 1.440 ağırlık, hepsi 0
  17. keys = 'step loss acc val_loss val_acc grad_norm'.split() # geçmiş: her 10 grupta bir satır
  18. history, lsum, osum = {k: [] for k in keys}, 0, 0
  19. for tour in range(3):
  20. for i in range(0, 3000, 30): # 30'luk gruplar
  21. x, t = X[i:i + 30], y[i:i + 30]
  22. p = np.exp(x @ W + b); p /= p.sum(1, keepdims=True) # puanlar → softmax
  23. lsum -= np.log(p[np.arange(30), t]).sum() # grubun kaybı
  24. osum += (p.argmax(1) == t).sum() # grubun doğrusu
  25. p[np.arange(30), t] -= 1 # hata: olasılık − cevap
  26. W -= 0.1 * x.T @ p / 30; b -= 0.1 * p.mean(0) # küçük adım
  27. if i // 30 % 10 == 9: # doğrulama: görmediği 500 etiket
  28. v = np.exp(X[3000:] @ W + b)
  29. v /= v.sum(1, keepdims=True)
  30. g = np.linalg.norm(x.T @ p / 30) # gradyan normu
  31. vl = -np.log(v[np.arange(500), y[3000:]]).mean()
  32. va = (v.argmax(1) == y[3000:]).mean()
  33. row = (tour * 100 + i // 30 + 1, lsum / 300,
  34. osum / 300, vl, va, g)
  35. for k, q in zip(keys, row):
  36. history[k].append(float(q))
  37. lsum = osum = 0
  38. pred = (X[3000:] @ W + b).argmax(1) # görmediği 500 etiket
  39. print(f'tur {tour + 1}:', (pred == y[3000:]).sum()) # 500 içinde doğru
  40. C = np.zeros((10, 10), int) # karışıklık matrisi
  41. np.add.at(C, (y[3000:], pred), 1) # satır gerçek, sütun tahmin
  42. f1 = 2 * C.diagonal() / (C.sum(0) + C.sum(1)) # rakam başına F1
  43. for k in keys[1:5]: # son ölçümler tablosu
  44. print(f'{k:<10}{history[k][-1]:>10.4f}')
  45. print('F1:', f1.round(2))
  46. print(C)
  47. import csv
  48. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  49. w = csv.writer(f)
  50. w.writerows([keys, *zip(*history.values())]) # satır başına 10 grup
  51. try:
  52. import matplotlib.pyplot as plt # varsa grafik çiz
  53. fig, ax = plt.subplots(1, 2, figsize=(9, 3.2))
  54. s = history['step']
  55. for j, k in enumerate(('loss', 'acc')):
  56. ax[j].plot(s, history[k], label=k)
  57. ax[j].plot(s, history['val_' + k], label='val_' + k)
  58. ax[j].legend()
  59. plt.show()
  60. except ImportError:
  61. 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.

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.

rakam_tanima.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Ş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 →
Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç