Opdracht 4: Getalherkenning met neurale netwerken
Inleiding
Deze opdracht heeft als doel een neuraal netwerk te bouwen geschikt om enkele cijfers mee te herkennen. Dit netwerk moet vervolgens getraind worden door middel van een gegeven dataset en een leeralgoritme. Na deze training kan het neurale netwerk getest worden op een testset en hier dienen zinnige gegevens uit gehaald te worden. De resultaten (foutenpercentage en de tijd om te leren) moeten worden beschreven door middel van een plot of een tabel.
Benodigdheden
- Java 6 (JDK)
- Een IDE zoals NotePad++ of Eclipse.
- De tools voor de MNIST database. Bevat parser/image writer etc.
- MNIST database training set en training labels.
- MNIST database test set en test labels.
- PPM viewer zoals IrfanView.
Voor de zekerheid zijn de 4-juni-2013 versies van deze bestanden gemirrorred in een zip. Gebruik de zip alleen als een bronserver onbereikbaar is. Mirror van MNIST tools.
Gebruiksinformatie van de tools/databases
MNIST database
Als eerst: meer informatie over de database vind je hier. Wij gebruiken alle vier bestanden van de website. Niet alle images in de bestanden hoeven gebruikt te worden, maar meer is wel beter.
- train-images-idx3-ubyte.gz
Dit bestand bevat de images waarmee het netwerk getraind moet worden. Om de bestanden te kunnen bekijken dienen de MNIST tools gebruikt te worden.
- train-labels-idx1-ubyte.gz
Dit bestand bevat de labels van images waarmee het netwerk getraind wordt. In de labels staat als welk nummer de training images herkend dienen te worden. Dit gebruik je dus voor feedback op jouw netwerk.
- t10k-images-idx3-ubyte.gz
Dit bestand bevat de images waarmee het netwerk getest moet worden. Hiermee mag je dus NIET je netwerk trainen.
Om de bestanden te kunnen bekijken dienen de MNIST tools gebruikt te worden.
- t10k-labels-idx1-ubyte.gz
Dit bestand bevat de labels van images waarmee het netwerk getest wordt. In de labels staat als welk nummer de test images herkend dienen te worden. Dit gebruik je dus om de kwaliteit van jouw netwerk te evalueren.
MNIST tools
Om de MNIST tools te kunnen gebruiken plaats de mnist-tools.jar in dezelfde directory als jouw programma, of voeg deze toe in de CLASSPATH variable, of voeg deze toe als external library in Eclipse.
Indien de tool in dezelfde directory staat kan je jouw programma compilen door middel van:
javac -cp mnist-tools.jar *.java
java -cp .:mnist-tools.jar your-main-class
De documentatie/javadoc vind je in de /doc directory van mnist-tools.zip. De belangrijkste klasse van de MNIST tools is MnistManager. Met hehulp van deze klasse kunnen de labels van een image worden opgevraagd. Images kunnen worden opgevraagd, uitgelezen en uitgeschreven naar PPM format.
PPM Viewer
Om wat meer een gevoel te krijgen wat de images inhouden kan je de MNIST tools gebruiken om een .ppm file te genereren en deze vervolgens te bekijken met een PPM viewer.
Aanpak
Een mogelijke globale aanpak voor het probleem is als volgt:
- Zet een goede Java programmeeromgeving op. Installeer Eclipse, Java SDK 6, zet de MNIST tools in je classpath, pak de databases uit, etc.
- Raak bekend met de MNIST database en de MNIST tools. Maak een klasse aan waar je wat experimenteert met het inlezen en uitschrijven van images uit de MNIST database en definieer indien nodig zelf wat handige functies.
- Opzetten structuur van het neurale netwerk:
- Zet de belangrijke concepten van een neuraal netwerk op een rij: neuronen/nodes, verbindingen, gewichten, etc.
- Definieer voor de belangrijke concepten (abstracte) klassen of interfaces. Een grotere mate van (zinnige) abstractie levert extra punten op.
- Topologie neurale netwerk:
- Definieer een zinnige topologie voor jouw netwerk.
- Houd voor de hoeveelheid nodes rekening met de vorm van de input en output.
- Indien je een hidden layer hebt, denk aan het gevolg van veel of weinig nodes in de hidden layer.
- Een voor de hand liggende topologie is een 3-layer feed forward netwerk, met voor elke pixel een input-neuron, de sigmoid function als activatie-functie en 10 ouput-neuronen (een voor elk cijfer).
- Vergeet hier niet, zeker bij de activatie en update functie, op een goede manier te abstraheren/generaliseren om meerdere implementaties toe te laten.
- Algoritme neurale netwerk:
- Wij verwachten dat je een specifieke variant van het standaard backpropagation algoritme implementeert in je netwerk om te gebruiken als leeralgoritme. Deze variant heet backpropagation met momentum.
In tegenstelling tot standaard backpropagation wordt niet alleen de richting van de negatieve gradiënt gevolgd, wordt in deze aanpak de gradiënt van de error function berekend voor alle gewichten, en wordt er steeds een gewogen gemiddelde genomen van de huidige gradiënt en de vorige stap.
- Idealiter zou je backpropagation invoeren zowel met als zonder momentum, en de verkregen resultaten kunnen vergelijken.
Dit is een voorbeeld van een werkelijk backpropagation algoritme voor een drie-laags feedforward-netwerk:
Initialize the weights in the network with random values
Do
For each image in the training set
O = output(net, e)
R = correct value for e //comes from the labels file
Calculate the error E(R,O) at the output units
Compute delta_wh for all weights from hidden layer to output layer
Compute delta_wi for all weights from input to output hidden layer
Update the weights in the network
Until error is sufficiently small
- Train het neurale netwerk:
- Stel een maximale foutwaarde vast (error treshold) of een vast aantal test cases.
- Train het netwerk totdat het netwerk onder deze foutwaarde opereert of het aantal test cases is verwerkt.
- Motivateer je keuzes.
- Test het neurale netwerk:
- Gebruik de test data van MNIST om je getrainde netwerk te evalueren.
- Sla de verkregen testresultaten op en verwerk deze in plots en/of tabellen. (Verwerkte resultaten bevatten informatie over error rates en leersnelheid.)
Randvoorwaarden
Hier staat wat moet. Bij afwijking van randvoorwaarden worden punten in mindering gebracht.
- Jouw programmacode moet in goed, idiomatisch Java geschreven worden. Dit betekent correct gebruik van classes, interfaces, overerving, etc.
- Het moet mogelijk zijn, bijvoorbeeld door gebruik van een interface, verschillende update functies te gebruiken.
- Hetzelfde geldt voor activatie functies.
- Je netwerk mag enkel getraind worden door de MNIST training data (en dus niet de test data).
- Jouw netwerk gebruikt backpropagation met momentum en is relatief makkelijk uit te breiden naar een ander leeralgoritme zonder de structuur van het netwerk fundamenteel aan te moeten passen.
- Testresultaten in de vorm van tabellen en/of plots. Twee belangrijke waarden zijn de error rates en leersnelheid.
- Testresultaten moeten (grotendeels indien een willekeurig factor gebruikt wordt) reproduceerbaar zijn door middel van instructies. Geef hiervoor geschikte documentatie.
Tips
- Bekijk de slides van het neurale netwerken college.
- De handout van Tom Mitchell, "Machine Learning", Ch. 4 “Artificial neural networks” is een goede referentie voor de basisprincipes van neurale netwerken.
- Informatie over backpropagation met momentum kun je vinden in
het verplichte hoofdstuk van Mitchell Ch. 4: Artificial neural networks uit “Machine Learning” (Mitchell, 1998). Of anders in een hoofdstuk van Rojas, Neural Networks, Ch. 8 “Fast Learning Algorithms”.
Waardering
(Extra) punten kunnen worden verdiend door het aanbrengen van de volgende features.
- Werking.
Je netwerk moet in de allereerste plaats goed werken. Hoe laat je dat zien? Documenteer je code en motiveer je keuzes in de topologie, klassen, interfaces etc.
- Overzichtelijkheid. Zorg dat je programma overzichtelijk is. Probeer je programma niet te complex te maken.
- Optimaliteit. Een programma wat goede oplossingen vindt in weinig tijd wordt beter gewaardeerd.
- Extra features. Hieronder volgen een aantal suggesties voor extra features die extra punten opleveren. Verdwaal hier niet teveel in en probeer eerst de basisfunctionaliteit te implementeren.
- Preprocessing van image bestanden. Suggesties kan je ook terugvinden op de MNIST pagina. (Bijvoorbeeld eskewing.)
- Andere leeralgoritmes, updatefuncties, activatiefuncties, etc.
- Een goede (grafische) user interface.
- Eigen beargumenteerde uitbreidingen.
Aaavulling, dd. 23 juni 2010:
- Implementeer in ieder geval backpropagation met momentum.
- Generaliteit: het programma moet interfaces/abstracte klassen gebruiken
zodat er meerdere activatiefuncties, updatefuncties etc. gebruikt kunnen
worden. Mogelijkheid tot bijvoorbeeld normaal backpropagation. (De meerdere
functies hoeven niet per se geïmplementeerd te worden, al levert dit meer
punten op. Dus ik verwacht vooral een abstract framework met voor alle
functies minimaal 1 implementatie zodat het netwerk wel werkt.)
- Modulariteit: het netwerk moet makkelijk aanpasbaar zijn. Bijvoorbeeld
meer of minder hidden nodes.
- Motivatie: waarom deze activatiefunctie, topologie, enz. Motiveer dit
bijvoorbeeld door resultaten, bronnen en anders eigen ideeën.
- (Partiële) reproduceerbaarheid van testresultaten d.m.v. instructies.
Wat we niet niet verwachten:
-
Uitgebreid getweak aan het network voor een lage error rate.