One Network: JAX i Virtual Eyes
Loading...
The app: one network in Python and JAX

Jedna sieć

Jedna sieć dla obrazu i całego wątku

Prawdziwa sieć, zbudowana i wytrenowana tutaj: fragmenty obrazu, głębia sugerowana przez farbę i każda litera tej rozmowy w jednej wspólnej przestrzeni. Nic nie jest wstępnie wytrenowane.

Obraz, fragment po fragmencie

Sieć analizuje obraz w małych fragmentach, z których każdy ma własne światło, kolor i położenie, i uczy się tych słów. Te same wagi odczytują litery wątku.

Cała aplikacja w Pythonie i JAX

Ta strona i poniższy program stanowią jedną sieć. Program jest pełną aplikacją: oknem GTK4, gradientami JAX, obrazem, wątkiem, przewidywaną głębią i wspólną przestrzenią. Skopiuj go lub zapisz, a następnie uruchom na własnej maszynie.

Plamy farby
—
Słowa, których się uczy
—
Litery, które odczytuje
—
Pliki, które należy trzymać razem
net_gtk.py
net_gtk.py

Co robi to okno

  • Trenuj przez 300 lub 2 000 kroków lub zatrzymaj w połowie; uczenie odbywa się w osobnym wątku, więc okno pozostaje aktywne.
  • Kliknij dowolny fragment obrazu, a aplikacja wyświetli słowa przypisane do tego fragmentu.
  • Zadaj pytanie słownie — ciepłe złoto, ciemny niebieski — a aplikacja podświetli fragmenty pasujące do zapytania.
  • Wpisz kilka liter, a aplikacja wyświetli listę liter, których spodziewa się w następnej kolejności, wraz z procentami.
  • Wklej własny tekst i naciśnij „Learn this instead”: nowe litery otrzymają nowe wiersze w tej samej tabeli, a nic z dotychczasowej wiedzy nie zostanie usunięte.
  • Dwa rysunki pod obrazem: przewidywana głębia oraz jedna przestrzeń, w której kropki są farbą, a kwadraty słowami.
  • Zapisz wagi do pliku net_weights.json i wczytaj je ponownie następnym razem.

Jak to uruchomić

Jeden folder, jeden plik i obraz o nazwie painting.jpg, jeśli go posiadasz. Na Linuxie, w tym folderze:

  1. Zainstaluj pakiety Pythona python3 -m pip install jax numpy pillow
  2. Zainstaluj GTK4 i powiązania dla Pythona sudo apt install python3-gi gir1.2-gtk-4.0
  3. Otwórz okno python3 net_gtk.py

Na Windowsie najszybszą drogą jest MSYS2: pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4, następnie python -m pip install jax numpy pillow, a potem python net_gtk.py w tym samym terminalu MSYS2.

Na macOS: brew install pygobject3 gtk4, następnie python3 -m pip install jax numpy pillow, a potem python3 net_gtk.py.

Brak wyświetlacza? python3 net_gtk.py --selftest trenuje w terminalu i wypisuje te same liczby.

Zmierzono poprzez uruchomienie tego pliku w terminalu z JAX, na tym obrazie i w tym wątku: 400 kroków → 67% fragmentów odnajduje własne słowa (błąd obrazu 0,68), 2 000 kroków → 95% (0,53), 5 000 kroków → 97% (0,45). Błąd głębi kończy się na 0,0003, a błąd liter spada z 3,05 do 2,90.

Przeglądarka nie może uruchomić Pythona, więc ta karta wyświetla plik zamiast okna — ta sama sieć działa na żywo powyżej. Słowa, których się uczy, to te, których może nauczyć obraz: ten obraz nie zawiera błękitu, więc pytanie o błękit trafia na złote plamy. Nagłówek liter zna kolejność liter, a nie znaczenie.

Kompilator dla powyższego kodu Python i JAX

Pole zawiera przejście w przód (forward pass) jednej sieci. Kompilator odczytuje je, sprawdza i zapisuje dwukrotnie: jako Pythona dla JAX oraz JavaScriptu, który uruchamia się w tej karcie. Jedno drzewo, dwa back-endy.

Tokeny
—
Węzły w drzewie
—
Funkcje
—
Python dla JAX
JavaScript, uruchamiany tutaj

Co oblicza

    Weryfikacja porównuje te liczby z tym samym programem uruchomionym w numpy i JAX na tych samych wagach z tym samym ziarnem — zmierzono to przed utworzeniem tej karty, nie zgadywano.

    Co jest dozwolone w języku

    • def name(a, b): z wciętym korpusem, name = ..., oraz return ...
    • Liczby, nazwy, nawiasy, minus jednoargumentowy oraz + - * / @ dla mnożenia macierzy.
    • .T dla transpozycji oraz wywołania tanh, sqrt, exp, log, sum, mean, maximum.
    • Wszelkie inne elementy zatrzymują kompilator, wskazując linię i kolumnę, zamiast zgadywać.

    Jest to prawdziwy kompilator dla małego języka, a nie środowisko uruchomieniowe Pythona: brak pętli, klas i importów. Przejście w przód jednej sieci mieści się w jego ramach, dlatego ten sam tekst może stać się kodem JAX na Twojej maszynie i JavaScriptem w tej karcie.

    Wirtualne oczy: widzą tylko piksele

    Oko skierowane na monitor: otrzymuje obraz i nic więcej — żadnej strony, żadnych danych, żadnej sieci. Na podstawie samych pikseli znajduje krawędzie, narożniki i to, jak każdy punkt przesuwa się, gdy oko przesuwa się w bok, a z tego odtwarza, gdzie wszystko znajduje się w przestrzeni.

    To, co widzi oko narożniki na niebiesko, ruch na pomarańczowo
    Krawędzie Gradienty Sobela
    Ruch Przepływ Lucasa–Kanade
    Odtworzony pokój przeciągnij, aby obrócić
    Zobaczone klatki
    0
    Narożniki
    0
    Śledzone
    0
    Mediana ruchu
    —
    Znaleziono głębię
    —
    Punkty w przestrzeni
    0
    Jedna klatka
    —

    Głębia to prawdziwa geometria, ale tylko do rozmiaru kroku oka i tylko tam, gdzie obraz ma teksturę — płaska farba nie daje punktu zaczepienia. Widzenie, gdzie stoi ściana, to nie wiedza, że to ściana, i nic tutaj nie wymyśla świata: pokój powyżej to zmierzone piksele.

    Twój pomysł i czego wciąż by brakowało

    • Oczy skierowane na monitor to prawdziwy interfejs: model, który odczytuje ekran tak jak człowiek, nie potrzebuje wtyczki do każdego programu — wszystko, co jest widoczne, jest już danymi wejściowymi.
    • Z dwóch klatek poruszającego się oka otrzymujesz geometrię, z którą musi zgadzać się model świata; tę część ta karta realizuje naprawdę.
    • Świat generowany w czasie rzeczywistym potrzebuje również modelu, który wymyśla to, czego nikt nie widział, utrzymuje spójność podczas obracania się i działa w milisekundach — tego nie ma w tej zakładce i strona nie może go wytrenować.
    • Uczciwa granica: to oko odzyskuje informację o tym, gdzie rzeczy są, a nie co oznaczają. Szybkość widzenia to nie zrozumienie, a jedno jest znacznie łatwiejsze od drugiego.

    Obraz: skan domeny publicznej Ostatniej Wieczerzy Leonarda da Vinci, Wikimedia Commons.