Schnell und einfach ins Deep Learning einsteigen

Kick-start Deep Learning mit TensorFlow und Keras
Keine Kommentare

Wie steigt man ohne Overhead und Umwege ins Deep Learning ein? Mit diesem Kick-Start-Guide, der zeigt, wie man ganz schnell ein Beispiel mit Python und dem Paket Keras zum Laufen bekommt. Es geht dabei nicht darum, diverse Optionen zu berücksichtigen und Optimierungen durchzuführen, sondern schnell zu starten, um dann etwas in den Background einzutauchen.

Kick-start Schritt 1: TensorFlow

Das High-Level-API Keras ist eine populäre Möglichkeit, Deep Learning Neural Networks mit Python zu implementieren. Dafür benötigen wir TensorFlow; dafür muss sichergestellt werden, dass Python 3.5 oder 3.6 installiert ist – TensorFlow funktioniert momentan nicht mit Python 3.7. Wichtig ist auch, dass die 64bit-Version von Python installiert ist. Wenn man nicht die richtige Installation vorliegen hat, bekommt man eine Meldung wie die folgende:

'Could not find a version that satisfies the requirement tensorflow'.

Wenn alle Voraussetzungen erfüllt sind, kann man TensorFlow mit pip3 install –upgrade tensorflow installieren und sollte dann eine Darstellung wie in Abbildung 1 sehen (auf Windows 7), wobei der Pfad C:\Python36 bei der Installation manuell gesetzt wurde, also nicht das Default-Setting ist. Auf Windows 10 in der Powershell als Administrator sieht das wie folgt aus:

Abbildung 1: Installation von TensorFlow auf Windows 7

Abbildung 1: Installation von TensorFlow auf Windows 7

Abbildung 2: Installation von TensorFlow auf Windows 10

Abbildung 2: Installation von TensorFlow auf Windows 10

Welche Packages nachgeladen werden müssen, hängt davon ab, was man bereits installiert hat. Ich hatte beispielsweise schon einiges geladen, als ich mit der Textklassifizierung experimentiert habe.

Um die Installation zu überprüfen, kann man das folgende Skript laufen lassen:

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

Möglicherweise wird dann folgende Meldung ausgegeben:

'Your CPU supports instructions that this TensorFlow binary was not compiled to use:' AVX

Dies bedeutet, dass man nicht alle Leistungsmerkmale der CPU nutzt (dazu müsste man neu kompilieren). Um weiterzukommen, ignorieren wir das aber.

Beispiele für eine Anwendung auf GitHub

Den Quelltext von GitHub habe ich einfach in die IDE PyCharm kopiert. Ich verwende die kostenlose Community Edition.

Die Datei iris_data.py, mit der wir jetzt eine Irisdatenklassifikation durchführen, benötigt noch das Paket pandas, welches man über die Konsole installiert: pip3 install –upgrade pandas.

Hinweis: Die IDE verlangte auch noch einmal nach der Installation die Pakete. Dies benötigte aber nur einen Klick und wenige Sekunden Wartezeit.

Danach ist alles bereit, um premade_estimator.py zu starten, der auf TensorFlow und Pandas aufsetzt. Das Resultat ist in Abbildung 3 zu sehen.

Abbildung 3: Ergebnis der Irisdaten Klassifikation

Abbildung 3: Ergebnis der Irisdaten Klassifikation

Wir haben hier ein neuronales Netz mit zwei versteckten Lagen getestet, das Irisdaten klassifiziert. Weitere Informationen findet man auf der Website von TensorFlow. Hier soll es nur ein erster Schritt in Richtung Keras sein.

Kickstart Schritt 2: Keras

Der nächste Schritt zu Abstraktion ist Keras, das wir mit pip3 install –upgrade keras auf der Kommandozeile installieren. Dabei kann die folgende Fehlermeldung auftreten, die besagt, dass Visual Studio 14 fehlt:

error: [WinError 3] The system cannot find the path specified: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\PlatformSDK\\lib'

Dies bedeutet, dass das Windows SDK nicht installiert ist. Das ist aber unter http://landinghub.visualstudio.com/visual-cpp-build-tools verfügbar. Dabei sollten die Defaulteinstellungen übernommen werden. Der Inhalt hinter dem Link ändern sich öfter. Die Installation der Build Tools, Version 2015 oder höher sollte gewählt werden.

Um Keras zu testen, können wir ein Beispiel in unsere IDE kopieren: https://github.com/keras-team/keras/blob/master/examples/reuters_mlp.py Diese Datei sollte man dann als reuters_mlp.py sichern und ausführen. Dabei werden zunächst Daten geladen und vorbereitet. Enthalten sind 46 Kategorien, 8083 Trainingsdatensätze und 899 Testbeispiele. Der Ladevorgang ist in Abbildung 4 zu sehen; Abbildung 5 zeigt das Testergebnis.

Abbildung 4: Ladevorgang der Reuersdaten

Abbildung 4: Ladevorgang der Reuersdaten

Abbildung 5: Ergebnis der Klassifikation des Testdatensatzes, der nicht zum Training eingesetzt wurde.

Abbildung 5: Ergebnis der Klassifikation des Testdatensatzes, der nicht zum Training eingesetzt wurde.

Was haben wir eigentlich getan?

Nachdem wir Python, TensorFlow und Keras installiert haben, haben wir das ‘Reuters Example’ ausprobiert, über einen Link der auf der Keras-Website zur Verfügung gestellt wurde. Um zu verstehen, was das Programm eigentlich getan hat, sehen wir uns zunächst die genutzten Daten an, die wir von https://s3.amazonaws.com/text-datasets/reuters.npz mit reuters.py gelesen haben.

Wenn man das npz entpackt, was mit 7-zip funktioniert, sieht man zwei Dateien: x.npy und y.npy. Eine Dokumentation zu den Daten gibt es unter https://keras.io/datasets/ unter dem Stichwort ‘Reuters’. Hier bekommen wir Erklärungen: ‘each wire is encoded as a sequence of word indexes’. Das bedeutet: Jede Nachricht (news wire) ist kodiert als Sequenz von Wort Indizes. D.h. unser Input ist ein Vektor von Indizes.

Die Daten, die in diesem Beispiel verwendet werden, sind 11.228 Nachrichten (newswires) von Reuters, jeweils gekennzeichnet mit einer von 46 Kategorien. Im Pycharm Debugger können wir uns die Repräsentation dieser Nachrichten etwas näher ansehen: die Variable xs sowie die Kategorien: die Labels (Abb. 6). Damit wir die Daten verstehen, setzen wir einen Breakpoint in reuters.py (Abb. 7).

Abbildung 6: Breakpoint in PyCharm zur Analyse mittels Debugger

Abbildung 6: Breakpoint in PyCharm zur Analyse mittels Debugger

Abbildung 7: Debuggen der Eingangsdaten xs

Abbildung 7: Debuggen der Eingangsdaten xs

Die Eingangsdaten (xs, ganz oben, blau markiert) für unser neuronales Netzwerk sind 11.228 Listen von Zahlen, wobei jede Zahl ein Wort repräsentiert. Das heißt, die Beispieldaten sind schon vorbereitet. Die Worte der Texte sind bereits in Zahlenwerte umgewandelt. Die Daten werden dann in ein Trainingsset (80 %) und ein Testset (20 %) geteilt.

In reuters_mlp.py ist dann der erste Vorverarbeitungsschritt die Verwendung des Tokenizers, damit die Sequenzen von Indizes in eine Repräsentation überführt werden können, die es einfacher macht verschiedene Kategorien zu unterscheiden. Das wird erreicht, indem die Sequenzen in eine Matrix von Binärwerten konvertiert werden.

Was macht der Keras Tokenizer eigentlich ?

Um besser zu verstehen was der Keras Tokenizer eigentlich macht, lassen wir ein getrenntes kleines Beispiel laufen mit nur drei Sätzen, wobei jeder nur zwei Worte enthält:

from keras.preprocessing.text import Tokenizer

texts = ['hello, hello', 'hello world', 'good day']
tokenizer = Tokenizer(num_words=5)   # number of words + 1
tokenizer.fit_on_texts(texts)

print (tokenizer.word_index)

my_sequences = tokenizer.texts_to_sequences(texts)

print (my_sequences)
print (tokenizer.sequences_to_matrix(my_sequences))

Was dann die folgende Ausgabe generiert:

Using TensorFlow backend.
{'hello': 1, 'world': 2, 'good': 3, 'day': 4}
[[1, 1], [1, 2], [3, 4]]
[[0. 1. 0. 0. 0.]
 [0. 1. 1. 0. 0.]
 [0. 0. 0. 1. 1.]]

Hier sehen wir, dass…:

  1. jedes Wort einen eindeutigen Index besitzt
  2. Die Sequenz (in diesem Fall) mit einem Lookup im Wortindex in den Ursprungszustand versetzt werden kann.
  3. Die Binärdaten nur zeigen, ob ein Wort in den Eingangsdaten vorkommt, aber nicht wie oft.
  4. Überlappungen in Sätzen als ‚1‘ an der gleichen Position des Vektors (Zeilen der Matrix) gezeigt werden.

Neuronale Netzwerke ganz kompakt

Wenn man sich noch einmal reuters_mlp.py ansieht, sieht man nach Zeile 40, wie das neuronale Netzwerk aufgebaut, trainiert und getestet wird. All das passiert in 20 Zeilen. Davor geht es rein darum, die Daten vorzubereiten. Gerade die Vorbereitung ist nicht zu unterschätzen, hierbei können wichtige Merkmale verlorengehen oder Repräsentationen gewählt werden, die nicht für den Klassifikationsalgorithmus geeignet sind. Es hängt vom Datenmaterial ab, welche Vorverarbeitung geeignet ist, d. h. wie relevant vor allem Häufigkeiten von einzelnen Wörtern ist.

Das Neuronale Netz haben wir hier als Black Box zur Klassifikation genutzt. Eine Vielzahl von Algorithmen ist hier geeignet. Hier sei für den interessierten Leser an Wikipedia mit Informationenen für einen kompakten Start verwiesen. Bleibt mir noch viel Spaß bei weiteren Experimenten und Anwendungen zu wünschen.

Unsere Redaktion empfiehlt:

Relevante Beiträge

X
- Gib Deinen Standort ein -
- or -