One Network: JAX และ Virtual Eyes
Loading...
The app: one network in Python and JAX

เครือข่ายเดียว

เครือข่ายเดียวสำหรับภาพวาดและบทสนทนาทั้งหมด

เครือข่ายจริงที่สร้างขึ้นที่นี่และฝึกฝนที่นี่: ทั้งชิ้นส่วนของภาพวาด ความลึกที่สีสื่อออกมา และทุกตัวอักษรของการสนทนานี้ ในพื้นที่แบ่งปันหนึ่งเดียว ไม่มีการฝึกฝนมาก่อน (pre-trained)

ภาพวาด ทีละส่วน

เครือข่ายจะมองภาพวาดเป็นส่วนเล็กๆ ซึ่งแต่ละส่วนจะมีแสง สี และตำแหน่งของตัวเอง และเรียนรู้คำเหล่านั้น น้ำหนักชุดเดียวกันนี้จะใช้อ่านตัวอักษรของเส้นด้าย

แอปพลิเคชันทั้งหมด เขียนด้วย Python และ JAX

หน้านี้และโปรแกรมด้านล่างคือเครือข่ายเดียวกัน โปรแกรมนี้คือแอปพลิเคชันฉบับเต็ม: ประกอบด้วยหน้าต่าง GTK4, JAX gradients, ภาพวาด, เธรด, ความลึกที่ทำนาย และพื้นที่ส่วนกลาง คุณสามารถคัดลอกหรือบันทึก แล้วนำไปรันบนเครื่องของคุณเองได้

แต้มสี
—
คำที่เรียนรู้
—
ตัวอักษรที่อ่าน
—
ไฟล์ที่ต้องเก็บไว้ด้วยกัน
net_gtk.py
net_gtk.py

หน้าต่างนี้ทำอะไรได้บ้าง

  • ฝึกฝน 300 หรือ 2,000 ขั้นตอน หรือหยุดกลางคัน การเรียนรู้ทำงานในเธรดเพื่อให้หน้าต่างยังคงทำงานอยู่
  • คลิกที่แพตช์ใดก็ได้ของภาพวาด แล้วแอปจะบอกคำที่มันมีสำหรับแพตช์นั้น
  • ถามด้วยคำพูด — เช่น ทองอบอุ่น, น้ำเงินเข้ม — แล้วมันจะส่องสว่างแพตช์ที่คำถามนั้นระบุถึง
  • ใส่ตัวอักษรสองสามตัว แล้วมันจะแสดงรายการตัวอักษรที่คาดว่าจะตามมา พร้อมเปอร์เซ็นต์
  • วางข้อความที่คุณเขียนเองแล้วกด 'Learn this instead': ตัวอักษรใหม่จะได้รับแถวใหม่ในตารางเดิม โดยไม่มีข้อมูลเดิมที่เคยรู้ถูกลบออก
  • ภาพวาดสองภาพใต้ภาพหลัก: ความลึกที่มันทำนาย และพื้นที่หนึ่งที่จุดคือสีและสี่เหลี่ยมคือคำ
  • บันทึกค่าน้ำหนัก (weights) ไปยัง net_weights.json และโหลดกลับมาใช้ในครั้งต่อไป

วิธีรันโปรแกรม

ใช้โฟลเดอร์เดียว ไฟล์เดียว และภาพวาดชื่อ painting.jpg (ถ้ามี) สำหรับ Linux ในโฟลเดอร์นั้นให้ทำดังนี้:

  1. ติดตั้งแพ็กเกจ Python python3 -m pip install jax numpy pillow
  2. ติดตั้ง GTK4 และ Python bindings sudo apt install python3-gi gir1.2-gtk-4.0
  3. เปิดหน้าต่างโปรแกรม python3 net_gtk.py

สำหรับ Windows วิธีที่เร็วที่สุดคือ MSYS2: pacman -S mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4 จากนั้น python -m pip install jax numpy pillow แล้วจึงรัน python net_gtk.py ในเทอร์มินัล MSYS2 เดียวกันนั้น

สำหรับ macOS: brew install pygobject3 gtk4 จากนั้น python3 -m pip install jax numpy pillow แล้วจึงรัน python3 net_gtk.py

ไม่มีจอแสดงผล? ใช้ python3 net_gtk.py --selftest เพื่อฝึกฝนในเทอร์มินัลและพิมพ์ตัวเลขชุดเดียวกัน

ตรวจสอบแล้วโดยการรันไฟล์นี้ในเทอร์มินัลด้วย JAX บนภาพวาดนี้และเธรดนี้: 400 ขั้นตอน → 67% ของแพตช์พบคำของตัวเอง (ค่าความผิดพลาดของภาพ 0.68), 2,000 ขั้นตอน → 95% (0.53), 5,000 ขั้นตอน → 97% (0.45) ค่าความผิดพลาดของความลึกสิ้นสุดที่ 0.0003 และค่าความผิดพลาดของตัวอักษรลดลงจาก 3.05 เป็น 2.90

เบราว์เซอร์ไม่สามารถรัน Python ได้ ดังนั้นแท็บนี้จึงแสดงไฟล์แทนที่จะเป็นหน้าต่าง แต่เครือข่ายเดียวกันนี้กำลังทำงานอยู่ด้านบน คำที่มันเรียนรู้คือคำที่ภาพวาดสามารถสอนได้: ภาพวาดนี้ไม่มีสีน้ำเงิน ดังนั้นคำถามเกี่ยวกับสีน้ำเงินจึงไปตกอยู่ที่ส่วนที่เป็นสีทองแทน ส่วนหัวของตัวอักษรจะรู้ลำดับของตัวอักษร แต่ไม่รู้ความหมาย

คอมไพเลอร์สำหรับ Python และ JAX ด้านบน

กล่องนี้บรรจุ forward pass ของเครือข่ายเดียว คอมไพเลอร์จะอ่าน ตรวจสอบ และเขียนออกมาสองครั้ง: Python สำหรับ JAX และ JavaScript ที่รันในแท็บนี้ ทรีเดียว แบ็กเอนด์สองตัว

โทเคน
—
โหนดในต้นไม้
—
ฟังก์ชัน
—
Python สำหรับ JAX
JavaScript, รันที่นี่

สิ่งที่คำนวณได้

    การตรวจสอบจะเปรียบเทียบตัวเลขเหล่านี้กับโปรแกรมเดียวกันที่รันใน numpy และ JAX ด้วยน้ำหนักที่กำหนด seed เดียวกัน — ซึ่งวัดผลไว้ก่อนที่จะมีการสร้างการ์ดนี้ ไม่ใช่การคาดเดา

    สิ่งที่ภาษานี้อนุญาต

    • def name(a, b): พร้อมเนื้อหาที่ย่อหน้า, name = ..., และ return ...
    • ตัวเลข, ชื่อ, วงเล็บ, เครื่องหมายลบเดี่ยว และ + - * / @ สำหรับการคูณเมทริกซ์
    • .T สำหรับการทรานสโพส และการเรียกใช้ tanh, sqrt, exp, log, sum, mean, maximum
    • สิ่งอื่นใดนอกเหนือจากนี้จะทำให้คอมไพเลอร์หยุดทำงานพร้อมระบุบรรทัดและคอลัมน์ แทนที่จะเป็นการคาดเดา

    นี่คือคอมไพเลอร์จริงสำหรับภาษาขนาดเล็ก ไม่ใช่ Python runtime: ไม่มีลูป, ไม่มีคลาส, ไม่มีการนำเข้า forward pass ของเครือข่ายเดียวสามารถบรรจุลงในนี้ได้ ซึ่งเป็นเหตุผลว่าทำไมข้อความเดียวกันจึงกลายเป็น JAX บนเครื่องของคุณ และเป็น JavaScript ในแท็บนี้

    ดวงตาเสมือน: มองเห็นเพียงพิกเซลเท่านั้น

    ดวงตาที่จ้องมองไปยังจอภาพ: จะได้รับเพียงภาพและไม่มีสิ่งอื่นเลย — ไม่มีหน้าเว็บ ไม่มีข้อมูล ไม่มีเครือข่าย จากพิกเซลเหล่านั้นเพียงอย่างเดียว มันจะค้นหาขอบ มุม และการเลื่อนของแต่ละจุดเมื่อดวงตาขยับไปด้านข้าง และจากจุดนั้นมันจะสร้างตำแหน่งของทุกสิ่งในพื้นที่ขึ้นมาใหม่

    สิ่งที่ดวงตามองเห็น มุมสีน้ำเงิน การเคลื่อนไหวสีส้ม
    ขอบ Sobel gradients
    การเคลื่อนไหว Lucas–Kanade flow
    ห้องที่สร้างขึ้นใหม่ ลากเพื่อหมุน
    จำนวนเฟรมที่เห็น
    0
    มุม
    0
    ติดตามแล้ว
    0
    การเคลื่อนไหวค่ามัธยฐาน
    —
    ตรวจพบความลึก
    —
    จุดในพื้นที่
    0
    หนึ่งเฟรม
    —

    ความลึกคือเรขาคณิตจริง แต่จะทำได้เพียงเท่ากับขนาดก้าวของดวงตา และเฉพาะในจุดที่ภาพมีพื้นผิวเท่านั้น — สีเรียบๆ จะไม่มีจุดยึดเกาะ การมองเห็นว่าผนังตั้งอยู่ตรงไหนไม่ใช่การรู้ว่ามันคือผนัง และไม่มีอะไรในนี้ที่สร้างโลกขึ้นมา: ห้องด้านบนคือพิกเซลที่ถูกวัดค่า

    ไอเดียของคุณ และสิ่งที่ยังคงจำเป็นต้องมี

    • ดวงตาที่มองจอภาพคืออินเทอร์เฟซที่แท้จริง: โมเดลที่อ่านหน้าจอเหมือนที่มนุษย์ทำไม่จำเป็นต้องมีปลั๊กอินสำหรับทุกโปรแกรม — อะไรก็ตามที่มองเห็นได้คือข้อมูลนำเข้าอยู่แล้ว
    • จากสองเฟรมของดวงตาที่เคลื่อนที่ คุณจะได้เรขาคณิต ซึ่งเป็นสิ่งที่โมเดลโลกต้องสอดคล้องกัน ซึ่งส่วนนี้การ์ดใบนี้ทำได้จริง
    • โลกที่ถูกสร้างขึ้นแบบเรียลไทม์ยังต้องการโมเดลที่สร้างสิ่งที่ไม่มีใครเห็น รักษาความสอดคล้องเมื่อคุณหันมอง และทำงานในระดับมิลลิวินาที — สิ่งนี้ไม่ได้อยู่ในแท็บนี้ และหน้าเว็บไม่สามารถฝึกฝนมันได้
    • ข้อจำกัดที่แท้จริง: ดวงตานี้กู้คืนตำแหน่งของสิ่งต่างๆ ไม่ใช่ความหมายของสิ่งเหล่านั้น ความเร็วในการมองเห็นไม่ใช่ความเข้าใจ และอย่างหนึ่งนั้นง่ายกว่าอีกอย่างมาก

    ภาพ: สแกนสาธารณะของ The Last Supper โดย Leonardo da Vinci จาก Wikimedia Commons