Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Bölüm 4 · Gören ve yazan modeller · Ders 23

Görüntü üreteci: sıkıştır ve boya

Otokodlayıcı: 64 piksel → 2 sayı → 64 piksel

Veri. Ayıklama hattının kamerası 400 kutu etiketi kaydetti: 0, 2, 3 ve 7 numaralı raflar, her biri 8×8 piksel, karıncalı. Yeni kamera yazılımını denemek için daha fazla etiket görüntüsü gerekiyor. Ağa hangi etiketin hangi numara olduğunu hiç söylemeden, görüntüleri iki sayıya sıkıştırıp geri boyamayı öğretiyoruz; sonra boyayan yarısı tek başına yeni etiketler çiziyor.

kameradan 400 etiket (0, 2, 3, 7), türleri ağa söylenmez400 etiket · 64 piksel → 2 sayı
1 / 39
goruntu_ureteci.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(13)
  3. T = [0x3a318c62e, 0x3a211111f, 0x78217043e, 0x7c2222108] # 7×5 bit: 0, 2, 3, 7
  4. bits = [(t >> np.arange(34, -1, -1)) & 1 for t in T]
  5. k = rng.integers(0, 4, 400) # 400 etiket, tür gizli
  6. X = np.zeros((400, 8, 8))
  7. X[:, :7, 1:6] = np.array(bits)[k].reshape(400, 7, 5)
  8. X = X.reshape(400, 64) + rng.normal(0, .3, (400, 64)) # karıncalı kamera
  9. X = X.clip(0, 1)
  10. sh = [(64, 12), (12, 2), (2, 12), (12, 64)] # 64 → 12 → 2 → 12 → 64
  11. P = [rng.normal(0, a ** -.5, (a, b)) for a, b in sh] # rastgele ağırlıklar
  12. M = [0 * p for p in P]; V = [0 * p for p in P] # Adam hafızası
  13. tr = np.flatnonzero(np.arange(400) % 4 != 3) # 300 eğitim etiketi
  14. va = np.flatnonzero(np.arange(400) % 4 == 3) # 100 doğrulama etiketi
  15. def err(A): # yeniden üretim hatası
  16. z = np.tanh(A @ P[0]) @ P[1]
  17. y = 1 / (1 + np.exp(-np.tanh(z @ P[2]) @ P[3]))
  18. return float(((y - A) ** 2).mean())
  19. history = {'step': [], 'loss': [], 'val_loss': []} # eğitim geçmişi
  20. for t in range(301): # adım 0: eğitimsiz ağ
  21. if t % 10 == 0: # her 10 adımda kaydet
  22. r = [t, err(X[tr]), err(X[va])]
  23. for k, v in zip(history, r): history[k].append(v)
  24. x = X[tr[rng.integers(0, len(tr), 16)]] # 16 etiketlik grup
  25. h = np.tanh(x @ P[0]); z = h @ P[1] # sıkıştır: 2 sayı
  26. g = np.tanh(z @ P[2]); y = 1 / (1 + np.exp(-g @ P[3])) # boya: 64 piksel
  27. d = (y - x) / 16 # gerçeğiyle karşılaştır
  28. dg = d @ P[3].T * (1 - g ** 2); dz = dg @ P[2].T # hata geriye akar
  29. dh = dz @ P[1].T * (1 - h ** 2)
  30. G = [x.T @ dh, h.T @ dz, z.T @ dg, g.T @ d]
  31. for p, m, v, q in zip(P, M, V, G):
  32. m += .1 * (q - m); v += .001 * (q * q - v)
  33. p -= .01 * m / (np.sqrt(v) + 1e-8) # Adam tarzı adım
  34. if t % 100 < 1: print(t, f'{((y - x) ** 2).mean():.3f}') # piksel başına hata
  35. for k in history: print(f'{k:<10}{history[k][-1]:>10.4f}') # son ölçümler
  36. import csv
  37. with open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına 10 adım
  38. csv.writer(f).writerows([list(history),
  39. *zip(*history.values())])
  40. try:
  41. import matplotlib.pyplot as plt # varsa grafik çiz
  42. for k in ('loss', 'val_loss'):
  43. plt.plot(history['step'], history[k], label=k)
  44. plt.xlabel('step'); plt.legend(); plt.show()
  45. except ImportError:
  46. 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.

goruntu_ureteci.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Kodlayıcı 64 pikseli 12 gizli nörondan geçirip yalnız 2 sayıya indirir: haritada bir nokta.
  2. Kod çözücü 2 sayıdan yeniden 64 piksel boyar. Başta yalnız gri bir sis boyar.
  3. Her adımda 16 etiket sıkıştırılır, boyanır, gerçeğiyle karşılaştırılır; hata geri yayılımla iki ağa da dağıtılır ve Adam tarzı bir adım atılır.
  4. Kimse türleri söylemediği hâlde benzer etiketler haritada yan yana toplanır. Boş bir noktayı kod çözücüye verince hiçbir eğitim görüntüsünde olmayan yeni bir etiket çıkar; iki küme arasında yürüyünce bir rakam ötekine erir.
  5. Şunu dene: adım sayısını 10 yap. Hata ancak yarıya iner, kümeler birbirine yakın kalır ve boyanan etiketler bulanıktır. Tohumu değiştirince harita başka türlü yerleşir ama türler yine ayrılır.

Neden önemli

Robotikte görüntüyü küçük bir koda sıkıştırmak; anomali tespitinde (iyi parçayı iyi boyayan ağ, kusurlu parçayı kötü boyar), kamera verisinin hızlı aktarılmasında ve eğitim için sentetik veri üretmekte kullanılır. Stable Diffusion gibi üreteçler çok daha büyük bir sayı uzayında çalışır, gürültüden başlar ve istemle yönlendirilir; temel fikir aynı: sayılar girer, pikseller çıkar.

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ç