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

Uma única rede

Uma única rede para a pintura e todo o tópico

Uma rede real, construída aqui e treinada aqui: as manchas da pintura, a profundidade que a tinta sugere e cada letra desta conversa, em um único espaço compartilhado. Nada foi pré-treinado.

A pintura, fragmento por fragmento

A rede analisa a pintura em pequenos fragmentos, cada um com sua própria luz, cor e posição, e aprende essas palavras. Os mesmos pesos leem as letras do fio.

O aplicativo completo, em Python e JAX

Esta página e o programa abaixo são uma única rede. O programa é a aplicação completa: uma janela GTK4, gradientes JAX, a pintura, a thread, a profundidade que ele prevê e o espaço compartilhado. Copie ou salve, então execute-o em sua própria máquina.

Manchas de tinta
—
Palavras que ele aprende
—
Letras que ele lê
—
Arquivos para manter juntos
net_gtk.py
net_gtk.py

O que a janela faz

  • Treine por 300 ou 2.000 passos, ou pare na metade; o aprendizado roda em uma thread para que a janela permaneça ativa.
  • Clique em qualquer patch da pintura e ele informará as palavras que possui para aquele patch.
  • Pergunte com palavras — ouro quente, azul escuro — e ele iluminará os patches onde a pergunta cair.
  • Digite algumas letras e ele listará as letras que espera a seguir, com porcentagens.
  • Cole seu próprio texto e pressione 'Aprender isso em vez disso': novas letras ganham novas linhas na mesma tabela, nada do que ele já sabia é descartado.
  • Dois desenhos abaixo da pintura: a profundidade que ele prevê e o espaço onde pontos são tinta e quadrados são palavras.
  • Salve os pesos em net_weights.json e carregue-os novamente na próxima vez.

Como executá-lo

Uma pasta, um arquivo e uma pintura chamada painting.jpg, se você tiver uma. No Linux, nessa pasta:

  1. Instale os pacotes Python python3 -m pip install jax numpy pillow
  2. Instale o GTK4 e suas vinculações Python sudo apt install python3-gi gir1.2-gtk-4.0
  3. Abra a janela python3 net_gtk.py

No Windows, o caminho mais curto é o MSYS2: pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4, depois python -m pip install jax numpy pillow, depois python net_gtk.py no mesmo terminal MSYS2.

No macOS: brew install pygobject3 gtk4, depois python3 -m pip install jax numpy pillow, depois python3 net_gtk.py.

Sem display? python3 net_gtk.py --selftest treina no terminal e imprime os mesmos números.

Medido ao executar este arquivo em um terminal com JAX, nesta pintura e nesta thread: 400 passos → 67% dos patches encontram suas próprias palavras (erro de imagem 0,68), 2.000 passos → 95% (0,53), 5.000 passos → 97% (0,45). O erro de profundidade termina em 0,0003 e o erro de letra cai de 3,05 para 2,90.

Um navegador não pode executar Python, então esta aba mostra o arquivo em vez da janela — a mesma rede está rodando ao vivo acima. As palavras que ele aprende são aquelas que a pintura pode ensinar: esta pintura não contém azul, então uma pergunta sobre azul cai em manchas douradas. O cabeçalho de letras conhece a ordem das letras, não o significado.

Um compilador para o Python e JAX acima

A caixa contém a passagem direta (forward pass) da rede única. O compilador a lê, verifica e a grava duas vezes: Python para JAX e JavaScript que roda nesta aba. Uma árvore, dois back-ends.

Tokens
—
Nós na árvore
—
Funções
—
Python para JAX
JavaScript, executado aqui

O que ele computa

    A verificação compara esses números com o mesmo programa executado em numpy e JAX com os mesmos pesos iniciais — medidos antes deste cartão existir, não estimados.

    O que a linguagem permite

    • def nome(a, b): com um corpo indentado, nome = ..., e return ...
    • Números, nomes, colchetes, menos unário e + - * / @ para produto de matrizes.
    • .T para transposição, e as chamadas tanh, sqrt, exp, log, sum, mean, maximum.
    • Qualquer outra coisa interrompe o compilador com a linha e a coluna em vez de tentar adivinhar.

    Este é um compilador real para uma linguagem pequena, não um runtime de Python: sem loops, sem classes, sem imports. A passagem direta da rede única cabe dentro dele, e é por isso que o mesmo texto pode se tornar JAX na sua máquina e JavaScript nesta aba.

    Olhos virtuais: ele vê apenas pixels

    Um olho apontado para um monitor: ele recebe a imagem e nada mais — nem página, nem dados, nem rede. Apenas a partir desses pixels, ele encontra bordas, cantos e como cada ponto desliza conforme o olho se move lateralmente, e a partir disso reconstrói onde tudo está no espaço.

    O que o olho vê cantos em azul, movimento em laranja
    Bordas Gradientes de Sobel
    Movimento Fluxo de Lucas–Kanade
    A sala que ele reconstruiu arraste para girar
    Quadros vistos
    0
    Cantos
    0
    Rastreado
    0
    Movimento mediano
    —
    Profundidade encontrada
    —
    Pontos no espaço
    0
    Um quadro
    —

    A profundidade é geometria real, mas apenas até o tamanho do passo do olho, e apenas onde a imagem tem textura — tinta plana não oferece onde se apoiar. Ver onde uma parede está não é saber que é uma parede, e nada aqui inventa um mundo: a sala acima são os pixels, medidos.

    Sua ideia, e o que ela ainda precisaria

    • Olhos no monitor são uma interface real: um modelo que lê a tela da mesma forma que uma pessoa não precisa de plugin para cada programa — tudo o que é visível já é entrada.
    • A partir de dois quadros de um olho em movimento, obtém-se a geometria, que é exatamente com o que um modelo de mundo deve concordar; esta parte este cartão faz de verdade.
    • Um mundo gerado em tempo real também precisa de um modelo que invente o que ninguém viu, mantenha a consistência enquanto você gira e execute em milissegundos — isso não está nesta aba, e uma página não pode treiná-lo.
    • O limite honesto: este olho recupera onde as coisas estão, não o que elas significam. A velocidade de ver não é compreensão, e uma é muito mais fácil que a outra.

    Imagem: digitalização de domínio público de A Última Ceia de Leonardo da Vinci, Wikimedia Commons.