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.
- Kroki trenowania
- 0
- Błąd obrazu
- —
- Błąd litery
- —
- Błąd głębokości
- —
- Fragmenty, które odnalazły swoje słowa
- —
- Fragmenty farby
- 0
- Słowa w jej przestrzeni
- 0
- Wyuczone litery
- 0
- Znane znaki
- 0
Słowa, których się uczy, to te, których może nauczyć farba: jak jasny jest fragment, jaki ma kolor, gdzie się znajduje. Zadanie tekstowe uczy się kolejności liter, a nie znaczenia. Nic tutaj nie jest wstępnie wytrenowane; gradienty działają w tej zakładce.
Trenowanie na żywo
Uruchamia się automatycznie po otwarciu strony i uczy się tutaj, w tej karcie. Co sto kroków zapisuje wyniki pomiarów.
Oczekiwanie na zbudowanie sieci…
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
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:
-
Zainstaluj pakiety Pythona
python3 -m pip install jax numpy pillow -
Zainstaluj GTK4 i powiązania dla Pythona
sudo apt install python3-gi gir1.2-gtk-4.0 -
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
- —
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.
- 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.
