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.
import numpy as nprng = np.random.default_rng(13)T = [0x3a318c62e, 0x3a211111f, 0x78217043e, 0x7c2222108] # 7×5 bit: 0, 2, 3, 7bits = [(t >> np.arange(34, -1, -1)) & 1 for t in T]k = rng.integers(0, 4, 400) # 400 etiket, tür gizliX = np.zeros((400, 8, 8))X[:, :7, 1:6] = np.array(bits)[k].reshape(400, 7, 5)X = X.reshape(400, 64) + rng.normal(0, .3, (400, 64)) # karıncalı kameraX = X.clip(0, 1)sh = [(64, 12), (12, 2), (2, 12), (12, 64)] # 64 → 12 → 2 → 12 → 64P = [rng.normal(0, a ** -.5, (a, b)) for a, b in sh] # rastgele ağırlıklarM = [0 * p for p in P]; V = [0 * p for p in P] # Adam hafızasıtr = np.flatnonzero(np.arange(400) % 4 != 3) # 300 eğitim etiketiva = np.flatnonzero(np.arange(400) % 4 == 3) # 100 doğrulama etiketidef err(A): # yeniden üretim hatasız = np.tanh(A @ P[0]) @ P[1]y = 1 / (1 + np.exp(-np.tanh(z @ P[2]) @ P[3]))return float(((y - A) ** 2).mean())history = {'step': [], 'loss': [], 'val_loss': []} # eğitim geçmişifor t in range(301): # adım 0: eğitimsiz ağif t % 10 == 0: # her 10 adımda kaydetr = [t, err(X[tr]), err(X[va])]for k, v in zip(history, r): history[k].append(v)x = X[tr[rng.integers(0, len(tr), 16)]] # 16 etiketlik gruph = np.tanh(x @ P[0]); z = h @ P[1] # sıkıştır: 2 sayıg = np.tanh(z @ P[2]); y = 1 / (1 + np.exp(-g @ P[3])) # boya: 64 pikseld = (y - x) / 16 # gerçeğiyle karşılaştırdg = d @ P[3].T * (1 - g ** 2); dz = dg @ P[2].T # hata geriye akardh = dz @ P[1].T * (1 - h ** 2)G = [x.T @ dh, h.T @ dz, z.T @ dg, g.T @ d]for p, m, v, q in zip(P, M, V, G):m += .1 * (q - m); v += .001 * (q * q - v)p -= .01 * m / (np.sqrt(v) + 1e-8) # Adam tarzı adımif t % 100 < 1: print(t, f'{((y - x) ** 2).mean():.3f}') # piksel başına hatafor k in history: print(f'{k:<10}{history[k][-1]:>10.4f}') # son ölçümlerimport csvwith open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına 10 adımcsv.writer(f).writerows([list(history),*zip(*history.values())])try:import matplotlib.pyplot as plt # varsa grafik çizfor k in ('loss', 'val_loss'):plt.plot(history['step'], history[k], label=k)plt.xlabel('step'); plt.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
- Kodlayıcı 64 pikseli 12 gizli nörondan geçirip yalnız 2 sayıya indirir: haritada bir nokta.
- Kod çözücü 2 sayıdan yeniden 64 piksel boyar. Başta yalnız gri bir sis boyar.
- 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.
- 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.
- Ş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 →