Fungerade MNIST sifferigenkänning i Javascript
Två olika sätt att läsa ritade siffror med maskininlärning. Tränad på MNIST datasettet.
Neural network med Tensorflow

Prediktionssannolikheter
Denna version använder ett simpel neural network skapat och tränat med tensorflow. Den fungerar mycket bättre än den nedan och kräver bara runt ett halvt MB för alla vikter, jämfört med 200MB för KNN-algoritmen nedan. Utöver det kan den utföras så snabbt att den kan köras varje gång användaren ritar. Tack vare detta kan man se vilka drag modellen kollar efter mest på siffrorna i realtid.
Modellen definieras såhär i tensorflow:
Den har relativt många lager för ett 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 KNN-modellen nedan. Utöver det är det mycket enklare att exportera tränade modeller. Detta gjordes i detta exempel med tensorflowJS. Tack vare detta kan den ganska lätt användas i javascript.
De tio sliders till höger möjliggörs genom 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.
Handskriftsigenkänning med KNN

Predicted siffra
Detta program använder en väldigt simpel KNN-algoritm för att känna igen handskrivna siffror. Den har tränats på MNIST-datasetet, ett fritt tillgängligt dataset som innehåller 70 000 handskrivna siffror på bilder som är 28px * 28px stor.
När en siffra ritas på det stora canvas-elementet till vänster måste den först skalas till rätt storlek så att datasettet kan användas för att känna igen bilden. Därför skalas bilden ner till 28px*28px när man trycker på "Downscale" knappen. Eftersom den stora canvasen är 10 gånger större än upplösningen som ska uppnås kan detta enkelt göras genom att ta genomsnittet på 10x10 pixlar på originalbilden. Detta genomsnitt blir en pixel på den mindre bilden.
Detta projekt är väldigt likt detta och själva datasettet har exporterats därifrån i from av .json och används för detta projekt. Den stora skillnaden med detta projekt är att det är mer användbart och tillgängligt. Utöver det var det en bra möjlighet att lära mig mer om javascript och asynchronous funktioner som för i detta fall laddandet av modellen.
När bilden har rätt upplösning kan den skickas in till predict funktionen. Varje bild av en siffra, ritad eller från datasettet, kan ses som ett område i 784 dimensioner eftersom den utgörs av 28x28 pixlar. Detta kallas vektor. Hela predict funktionen går ut på att hitta siffrorna från datasettet där det euklidiska avståndet mellan dess vektorer och vektorn från den ritade bilden är minst. Varje siffra har ett "facit". När vi hittat ett visst antal siffror som liknar våran kan vi kolla facitet för att se vilka siffror dessa är. Dessa siffror liknar enligt modellen våran mest. I vårat exempel tar vi ut 5 sådana siffror. Dessa får då rösta på vilket facit som stämmer för våran och den siffra som förekommer oftast är resultatet.
Efter att modellen har bestämd vilken siffra det handlar sig om visas den till höger. Utöver det visas även hur hög konfidensnivån är. Konfidensnivån utgörs av hur många grannar som var samma siffra som outputvärdet. Exempelvis om 3 av 4 grannar hade samma värde blir konfidensnivån 75%.
Förbättringsmöjligheter i framtiden
Eftersom modellen i dagsläget är väldigt enkelt var det relativt simpel att implementera. Utöver det kräver den även lite prestanda att köra när den har laddats. Nackdelen är dock korrektheten. Modellen är inte väldigt bra på att känna igen siffror som är för små eller inte i mitten av bilden. Ett enkelt Neural Network hade möjligtvis hanterat detta bättre och utöver det använt mindre minne att köra, men troligen varit mer tidskrävande att implementera. Detta verkar som ett intressant projekt att bygga i framtiden. Detta har nu gjorts ovan.