BSc KICursus Natuur & Berekening 2025-26

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

  1. Java 6 (JDK)
  2. Een IDE zoals NotePad++ of Eclipse.
  3. De tools voor de MNIST database. Bevat parser/image writer etc.
  4. MNIST database training set en training labels.
  5. MNIST database test set en test labels.
  6. 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.

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:

  1. Zet een goede Java programmeeromgeving op. Installeer Eclipse, Java SDK 6, zet de MNIST tools in je classpath, pak de databases uit, etc.

  2. 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.

  3. Opzetten structuur van het neurale netwerk:

  4. Topologie neurale netwerk:

  5. Algoritme neurale netwerk:
  6. Train het neurale netwerk:
  7. Test het neurale netwerk:

Randvoorwaarden

Hier staat wat moet. Bij afwijking van randvoorwaarden worden punten in mindering gebracht.

  1. Jouw programmacode moet in goed, idiomatisch Java geschreven worden. Dit betekent correct gebruik van classes, interfaces, overerving, etc.
  2. Je netwerk mag enkel getraind worden door de MNIST training data (en dus niet de test data).
  3. 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.
  4. Testresultaten in de vorm van tabellen en/of plots. Twee belangrijke waarden zijn de error rates en leersnelheid.
  5. Testresultaten moeten (grotendeels indien een willekeurig factor gebruikt wordt) reproduceerbaar zijn door middel van instructies. Geef hiervoor geschikte documentatie.

Tips

  1. Bekijk de slides van het neurale netwerken college.
  2. De handout van Tom Mitchell, "Machine Learning", Ch. 4 “Artificial neural networks” is een goede referentie voor de basisprincipes van neurale netwerken.
  3. 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.

  1. 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.
  2. Overzichtelijkheid. Zorg dat je programma overzichtelijk is. Probeer je programma niet te complex te maken.
  3. Optimaliteit. Een programma wat goede oplossingen vindt in weinig tijd wordt beter gewaardeerd.
  4. 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.
    1. Preprocessing van image bestanden. Suggesties kan je ook terugvinden op de MNIST pagina. (Bijvoorbeeld eskewing.)
    2. Andere leeralgoritmes, updatefuncties, activatiefuncties, etc.
    3. Een goede (grafische) user interface.
    4. Eigen beargumenteerde uitbreidingen.

Aaavulling, dd. 23 juni 2010:

Wat we niet niet verwachten:


Laatst gewijzigd op woensdag 13 november 2024, om 15:02 uur Auteur(s): Alexander Pankov, Bas van Gijzel, Gerard Vreeswijk Translate to en, ru, or tr