Tek Ağ: JAX ve Sanal Gözler
Loading...
The app: one network in Python and JAX

Tek bir ağ

Tablo ve tüm iş parçacığı için tek bir ağ

Burada oluşturulmuş ve burada eğitilmiş gerçek bir ağ: tablonun yamaları, boyanın sunduğu derinlik ve bu konuşmanın her harfi tek bir ortak alanda. Hiçbir şey önceden eğitilmemiştir.

Tablo, yama yama

Ağ, tabloya her biri kendi ışığına, rengine ve konumuna sahip küçük yamalar halinde bakar ve bu kelimeleri öğrenir. Aynı ağırlıklar ipliğin harflerini okur.

Uygulamanın tamamı, Python ve JAX ile

Bu sayfa ve aşağıdaki program tek bir ağdır. Program uygulamanın tamamıdır: bir GTK4 penceresi, JAX gradyanları, tablo, iş parçacığı, tahmin ettiği derinlik ve paylaşılan alan. Kopyalayın veya kaydedin, ardından kendi makinenizde çalıştırın.

Boya yamaları
—
Öğrendiği kelimeler
—
Okuduğu harfler
—
Birlikte tutulacak dosyalar
net_gtk.py
net_gtk.py

Pencerenin ne yaptığı

  • 300 veya 2.000 adım eğitin veya yarıda durdurun; öğrenme işlemi bir iş parçacığında çalıştığından pencere aktif kalır.
  • Tablonun herhangi bir yamasına tıklayın, size o yama için sahip olduğu kelimeleri söyler.
  • Ona kelimelerle sorun — sıcak altın, koyu mavi — ve sorunun denk geldiği yamaları aydınlatır.
  • Ona birkaç harf verin, ardından beklediği sonraki harfleri yüzdeleriyle birlikte listeler.
  • Kendi yazınızı yapıştırın ve bunun yerine 'Bunu öğren'e basın: yeni harfler aynı tabloda yeni satırlar alır, bildiği hiçbir şey silinmez.
  • Tablonun altında iki çizim: tahmin ettiği derinlik ve noktaların boya, karelerin ise kelime olduğu tek bir alan.
  • Ağırlıklarını net_weights.json olarak kaydedin ve bir sonraki seferde tekrar yükleyin.

Nasıl çalıştırılır

Bir klasör, bir dosya ve eğer varsa painting.jpg adlı bir tablo. Linux'ta, o klasörde:

  1. Python paketlerini yükleyin python3 -m pip install jax numpy pillow
  2. GTK4'ü ve Python bağlamalarını yükleyin sudo apt install python3-gi gir1.2-gtk-4.0
  3. Pencereyi açın python3 net_gtk.py

Windows'ta kısa yol MSYS2'dir: pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4, ardından python -m pip install jax numpy pillow, ardından aynı MSYS2 terminalinde python net_gtk.py.

macOS'ta: brew install pygobject3 gtk4, ardından python3 -m pip install jax numpy pillow, ardından python3 net_gtk.py.

Ekran yok mu? python3 net_gtk.py --selftest terminalde eğitilir ve aynı sayıları yazdırır.

Bu dosyanın JAX ile bir terminalde, bu tablo ve bu iş parçacığı üzerinde çalıştırılmasıyla ölçülmüştür: 400 adım → yamaların %67'si kendi kelimelerini bulur (resim hatası 0.68), 2.000 adım → %95 (0.53), 5.000 adım → %97 (0.45). Derinlik hatası 0.0003'te sona erer ve harf hatası 3.05'ten 2.90'a düşer.

Bir tarayıcı Python çalıştıramaz, bu nedenle bu sekme pencere yerine dosyayı gösterir — aynı ağ yukarıda canlı olarak çalışmaktadır. Öğrendiği kelimeler, boyanın öğretebileceği kelimelerdir: bu tabloda mavi renk yoktur, bu nedenle maviyle ilgili bir soru altın renkli bölgelere denk gelir. Harf başlığı harflerin sırasını bilir, anlamını değil.

Yukarıdaki Python ve JAX için bir derleyici

Kutu, tek bir ağın ileri geçişini tutar. Derleyici bunu okur, kontrol eder ve iki kez yazar: JAX için Python ve bu sekmede çalışan JavaScript. Tek bir ağaç, iki arka uç.

Tokenlar
—
Ağaçtaki düğümler
—
Fonksiyonlar
—
JAX için Python
JavaScript, burada çalıştırılır

Ne hesapladığı

    Kontrol, bu sayıları aynı tohumlanmış ağırlıklarda numpy ve JAX'ta çalıştırılan aynı programla karşılaştırır — bu kart mevcut olmadan önce ölçülmüştür, tahmin edilmemiştir.

    Dilin izin verdikleri

    • girintili bir gövde ile def name(a, b):, name = ..., ve return ...
    • Sayılar, isimler, parantezler, tekli eksi ve matris çarpımı için + - * / @.
    • transpoz için .T ve tanh, sqrt, exp, log, sum, mean, maximum çağrıları.
    • Bunların dışındaki her şey, tahmin yürütmek yerine derleyiciyi satır ve sütun bilgisiyle durdurur.

    Bu, küçük bir dil için gerçek bir derleyicidir, bir Python çalışma zamanı değildir: döngüler yok, sınıflar yok, içe aktarmalar yok. Tek bir ağın ileri geçişi bunun içine sığar, bu nedenle aynı metin makinenizde JAX'a, bu sekmede ise JavaScript'e dönüşebilir.

    Sanal gözler: sadece pikselleri görür

    Monitöre yöneltilmiş bir göz: sadece görüntüyü alır, başka hiçbir şeyi değil — sayfa yok, veri yok, ağ yok. Sadece bu piksellerden kenarları, köşeleri ve göz yanlara doğru hareket ettikçe her noktanın nasıl kaydığını bulur ve buradan her şeyin uzayda nerede durduğunu yeniden inşa eder.

    Gözün gördüğü köşeler mavi, hareket turuncu
    Kenarlar Sobel gradyanları
    Hareket Lucas–Kanade akışı
    Yeniden oluşturulan oda döndürmek için sürükleyin
    Görülen kareler
    0
    Köşeler
    0
    Takip Edilen
    0
    Medyan hareket
    —
    Derinlik bulundu
    —
    Uzaydaki noktalar
    0
    Bir kare
    —

    Derinlik gerçek geometridir, ancak yalnızca gözün adım boyutu kadar ve yalnızca görüntünün dokusu olduğu yerlerde — düz boya tutunacak hiçbir şey vermez. Bir duvarın nerede durduğunu görmek, onun bir duvar olduğunu bilmek değildir ve burada hiçbir şey bir dünya icat etmez: yukarıdaki oda, ölçülmüş piksellerdir.

    Fikriniz ve hala neye ihtiyaç duyacağı

    • Monitördeki gözler gerçek bir arayüzdür: ekranı bir insanın okuduğu şekilde okuyan bir modelin her program için eklentiye ihtiyacı yoktur — görünür olan her şey zaten girdidir.
    • Hareket eden bir gözün iki karesinden geometri elde edersiniz, ki bu tam olarak bir dünya modelinin uyması gereken şeydir; bu kart bu kısmı gerçekten yapar.
    • Gerçek zamanlı olarak oluşturulan bir dünya, kimsenin görmediği şeyi icat eden, siz döndükçe bunu tutarlı tutan ve milisaniyeler içinde çalışan bir modele de ihtiyaç duyar — bu bu sekmede yoktur ve bir sayfa bunu eğitemez.
    • Dürüst sınır: bu göz şeylerin nerede olduğunu kurtarır, ne anlama geldiklerini değil. Görme hızı anlamak değildir ve biri diğerinden çok daha kolaydır.

    Görsel: Leonardo da Vinci'nin Son Akşam Yemeği tablosunun kamu malı taraması, Wikimedia Commons.