Als Anwendung eines neuronalen Netzes ist im Folgenden die Erkennung von handgeschriebenen Ziffern beschrieben. Das Programm ist in der Programmiersprache Python als jupyter-Notebook implementiert.
Eine Standardanwendung für ein neuronales Netz ist die Erkennung von handgeschriebenen Ziffern. Die Datei mnist_train.csv enthält die Daten von 60.000 gescannten handgeschriebenen Ziffern. Mit diesen Daten trainieren Sie zunächst das neuronale Netz. Anschließend testen Sie das neuronale Netz mit weiteren 10.000 handgeschriebenen Ziffern, die sich in der Datei mnist_test.csv befinden. Die Daten entstammen der öffentlich zugänglichen MNIST-Datensammlung.
Jede der beiden CSV-Dateien enhält eine Tabelle. Jede Zeile der Tabelle besteht aus 785 Zahlenwerten, dabei gibt der erste Wert die Ziffer an, die dargestellt ist, und die restlichen 784 Zahlenwerte stellen Graustufen eines 28×28-Pixel-Bildes dar, das die handgeschriebene Ziffer zeigt. Als Beispiel sehen Sie in Bild 1 eine handgeschriebene Ziffer 6.
Bild 1: Handgeschriebene Ziffer 6 als 28×28-Pixel-Bild
Zunächst lesen Sie die Trainingsdaten, die sich in der CSV-Datei mnist_train.csv befinden, mit folgender Funktion ein:
Das Array datalist besteht aus 60.000 Strings, die jeweils Zeilen von durch Kommas getrennten Werten darstellen. Mit einer Funktion prepareInput bereiten Sie die Daten für die weitere Verwendung auf.
Im ersten Schritt wandeln Sie jede der durch Kommas unterteilten Zeilen in eine Liste um. Die Listeneinträge sind aber noch Strings, daher wandeln Sie diese als nächstes in Zahlen um. Dann trennen Sie die erste Zahl ab, diese entspricht dem Wert der dargestellten Ziffer, und speichern diee in der Variablen d. Die restlichen Zahlen vermindern Sie um 128, sodass sie in den Bereich {-128., ..., +127} fallen. Das Ergebnis ist der spätere Eingabevektor x, auf den in der Eingabeschicht ja die Funktion σ angewandt wird. So erreichen Sie, dass der Wertebereich von σ ausgeschöpft wird.
Den Zielvektor y bilden Sie folgendermaßen. Zunächst erzeugen Sie einen Vektor mit zehn gleichen Werten von 0.1. In diesem Vektor ändern Sie an Indexposition d den Wert in 0.9. Das neuronale Netz soll später so trainiert werden, dass bei Eingabe einer handgeschriebenen Ziffer d das Neuron an Indexposition d der Ausgabeschicht einen hohen Wert liefert und alle anderen Neuronen der Ausgabeschicht einen niedrigen Wert. Die Ausgabewerte des neuronalen Netzes liegen stets zwischen 0 und 1, da sie als Fiúnktionswerte der Funktion σ zustande kommen.
Eingabevektor und zugehöriger Zielvektor werden miteinander verkettet, und alle so aufbereiteten Zeilen werden zum Schluss zu einer zweidimensionalen Liste r zusammengefügt.
In entsprechender Weise werden auch die Testdaten aus der Datei mnist_test.csv eingelesen und aufbereitet.
Es folgt das fertige Programm. Es beginnt mit den Definitionen der Funktionen readInput und prepareInput. Dann kommt die Definition der Funktion sigma. Die Definitionen der eigentlichen Funktionen des neuronalen Netzes, nämlich propagate, backpropagate, train und test schließen sich an. Die Theorie dazu, wie die Funktionen propagate und backpropagate zustande kommen, finden Sie in dem Artikel über Neuronale Netze.
Im Hauptprogramm definieren Sie zunächst das neuronale Netz, indem Sie pro Schicht die Anzahl der Neuronen angeben. Hier etwa definieren Sie ein neuronales Netz mit drei Schichten, wobei die Eingabeschicht 28 · 28 = 784 Neuronen umfasst, die innere Schicht 100 Neuronen und die Ausgabeschicht 10 Neuronen. Alternativ, hier im Programmtext auskommentiert, können Sie auch ein neuronales Netz mit vier Schichten definieren.
Überraschenderweise hat die Initialisierung der Gewichtungsmatrizen erheblichen Einfluss auf die Erkennungsrate des neuronalen Netzes. Hier ist eine Initialisierung gewählt, die normalverteilte Zufallswerte enthält.
Für die im Verlauf der Berechnung erforderlichen Vektoren erzeugen Sie zunächst Platzhalter, sodass Sie später per Indizierung darauf zugreifen können (zum Beispiel muss e[0] vorhanden sein, wenn Sie ihm ein Wert zuweisen).
Es folgt dann das Programmstück zum Trainieren und Testen des neuronalen Netzes. Die 60.000 Trainingsdatensätze geben Sie mehrfach in sogenannten Epochen in das Netz ein, um es zu trainieren. Im Anschluss daran bestimmen Sie mit den 10.000 Testdatensätzen jeweils die erzielte Erkennungsrate.
Der Programmtext steht in Form eines jupyter-Notebooks unter MultilayerNeuralNetwork-HandwrittenNumbers.ipynb zum Herunterladen zur Verfügung. Zusätzlich erforderlich sind die Dateien mnist_train.csv und mnist_test.csv. Kopieren Sie diese drei Dateien in ein Verzeichnis.
Probieren Sie das Programm mit unterschiedlichen neuronalen Netzen mit unterschiedlicher Anzahl von Schichten und Anzahl von Neuronen in den inneren Schichten aus. Die Anzahl der Neuronen in der Eingabeschicht liegt fest, sie beträgt 28 · 28 = 784 entsprechend der Anzahl der Pixel der Eingabebilder. Die Anzahl der Neuronen der Ausgabeschicht liegt ebenfalls fest, sie beträgt 10 entsprechend der Anzahl der zu erkennenden unterschiedlichen Ziffern 0, ..., 9.
Das hier angegebene neuronale Netz erzielt nach der vierten Trainingsepoche eine Erkennungsrate von über 95 %. Tatsächlich wäre eine Erkennungsrate von 100 % auch gar nicht unbedingt sinnvoll, da manche Ziffer so unsauber geschrieben ist, dass eine Zuordnung zu einem "richtigen" Wert rein willkürlich wäre.
Weiter mit: [up]