Ludwig Temmel

MNIST sifferigenkänning i Javascript i realtid

Läser ritade siffror med maskininlärning, tränad på MNIST datasettet.

Neural network med Tensorflow

Click to draw
▶️
▶️

Prediktionssannolikheter

0
0%
1
0%
2
0%
3
0%
4
0%
5
0%
6
0%
7
0%
8
0%
9
0%

Denna sida kan känna igen ritade siffror på ett Canvas objekt. För detta används ett simpel neural network skapat och tränad med Tensorflow. Modellen kräver bara runt ett halvt MB för att kunna fungera jämfört med en tidigare KNN implementation som krävde 200MB. Modellen kan köras så snabbt att den fungerar i realtid. Varje gång användaren gör en ändring i Canvasen genom att rita körs modellen. Genom detta kan man se vilka drag som påverkar igenkänningsprocessen mest, exempelvis kan man se hur modellen går från att känna igen siffran 3 till 8 genom att förändra ritningen.

Modellen tränades i Python eftersom Tensorflow är väldigt användarvänligt och gjorde det enkelt att skapa neurala netvärket. Träningen gjordes i en Jupyter Notebook.
Modellen definieras såhär i tensorflow: Modellens struktur i tensorflow Den har relativt många lager för en enkel MNIST sifferigenkänning, men jag märkte att prestandan blev bättre genom detta. Modellen tränades på en laptop utan grafikkort. För framtida och större neural networks kommer jag troligen använda ett grafikkort för att accelerera träningen.

Tensorflow gör det mycket enklare att träna neural nätverk. Man behöver inte definiera alla funktioner själv som jag behövde göra för den tidigare KNN-modellen. Utöver det är det mycket enklare att exportera tränade modeller. I detta fall tränades modellen i Python med Tensorflow och exporterades. Den kunde sedan enkelt importeras och användas med TensorflowJS på webbsidan.

De tio sliders till höger möjliggörs av neurala nätverket. Som man ser ovan har den 10 utmatningsneuroner. Dessa är kopplade till varsin slider. Om nätverket exempelvis känner igen en femma kommer neuronen som representerar 5 få en stor aktivering, och detta gör då att slidern på webbsidan blir bredare.

Förbättringsmöjligheter i framtiden

Nätverket fungerar men är väldigt känsligt till skillnader i storlek mellan träningsdata och inmatningsdata. Detta leder till en hög accuracy för testdata, men i praktisk användning kan modellen vara opålitlig. I framtiden kommer jag försöka modifiera inmatningen så att den har samma storlek som träningsdata. Detta kommer förhoppningsvis förbättra prestandan eftersom inmatningen kommer likna träningsdata mer då.