Open Source im professionellen Einsatz
Linux-Magazin 11/2017
558

One-hot-Encoding

Traktiert der KI-Lehrling ein neuronales Netzwerk mit diesen 3er-Eingangstupeln mit jeweils einem 1er-Ergebnistupel in der Trainingsphase, wird kein Schuh daraus. Die Indices sind auch weniger als Zahlenwerte relevant, sie stehen vielmehr für Kategorien, von denen jede Tür eine andere repräsentiert. Solche Datensätze formt der KI-Fachmann vor dem Training mit so genanntem One-hot-Encoding um. Besteht ein Datensatz aus n Kategorien, formt der Kodierer daraus n-Tupel, in denen jeweils ein Element auf 1 gesetzt ist, sonst bestehen sie aus Nullen.

Abbildung 3 zeigt als Beispiel, wie das Tupel »[2,1,2,0,1,0]« in sechs One-hot-kodierte Matrixreihen umgeformt wird. Der Code in Listing 2 nutzt dazu die Funktion »to_categorical()« aus dem Fundus »np_utils« des Pakets »keras.utils« . Um von der One-hot-Kodierung wieder zurück zum ursprünglichen Wert zu gelangen, dient die Methode »argmax()« , die jeder Numpy-Array bereitstellt.

Listing 2

one-hot

01 #!/usr/bin/env python3
02
03 from keras.utils import np_utils
04 import numpy
05
06 X = numpy.array([2,1,2,0,1,0])
07 print("org=", X)
08
09 onehot=np_utils.to_categorical(X)
10 print("onehot=", onehot)
11
12 a=onehot.argmax(1)
13 print("reverse=", a)

Maschine lernt

Mit den Eingabewerten im One-hot-Format lernt nun das in Listing 3 definierte dreischichtige neuronale Netzwerk. Wichtig: Auch die Ausgabewerte kodiert das Netzwerk nun nach der One-hot-Methode und benötigt daher nicht ein Neuron für die Ausgabe, sondern gleich drei, da sowohl die Trainings- als auch später die vorhergesagten Werte als 3er-Tupel mit gesetzten Einsen vorliegen, wobei jede Kombination eine bestimmte Tür der Spielshow anzeigt.

Listing 3

learn

01 #!/usr/bin/env python3
02 from keras.models import Sequential
03 from keras.layers import Dense
04 from keras.utils import np_utils
05 import numpy
06
07 data = numpy.loadtxt("shows.csv",
08         delimiter=",", skiprows=1)
09 X = data[:,0:3]
10 Y = data[:,3]
11
12 categories=np_utils.to_categorical(Y)
13
14 model = Sequential()
15 model.add(Dense(10, input_dim=3,
16     activation='relu'))
17 model.add(Dense(3, activation='relu'))
18 model.add(Dense(3, activation='sigmoid'))
19
20 model.compile(loss='binary_crossentropy',
21         optimizer='adam')
22 model.fit(X, categories, epochs=100,
23         batch_size=100, verbose=0)
24
25 test_data = numpy.array(
26     [[0,1,2], [0,2,1], [1,0,2],
27      [1,2,0], [2,0,1], [2,1,0]
28     ])
29
30 pred = model.predict(test_data)
31
32 for (idx,row) in enumerate(test_data):
33     print(row, pred[idx].argmax())

Liegen die von Listing 1 erzeugten Trainingsdaten in der Datei »shows.csv« , liest Listing 3 diese in Zeile 7 wieder von der Platte aus. Die ersten drei Elemente jeder Zeile sind die Eingangsdaten des Netzwerks (Kandidatentür, Moderatortür, alternative Tür), und das letzte gibt den Index der Tür zum Hauptpreis an.

Abbildung 3: One-hot wandelt Werte in Kategorien um, die einen Wert pro Tupel auf 1 setzen.

Zeile 16 transformiert die gewünschten Ausgabewerte in Kategorien in der One-hot-Kodierung, die Zeilen 14 bis 18 bauen das neuronale Netzwerk mit einer Eingangsschicht, einer verdeckten Schicht und einer Ausgabeschicht auf. Alle Layer sind vom Typ »Dense« , also mit allen Elementen angrenzender Schichten gehirnartig vernetzt. Die Klasse »Sequential« des Keras-Pakets hält die Schichten zusammen. Zeile 20 kompiliert das Netzwerkmodell, wobei Listing 3 als Lernparameter die Fehlerfunktion als »binary_crossentropy« angibt und als Optimizer den Algorithmus »adam« wählt.

Im dreischichtigen Modell nehmen in der Eingangsschicht zehn Neuronen die Eingabedaten entgegen, die Datenbreite legt »input_dim=3« auf 3 fest, da es sich um 3er-Tupel (jeweils Daten von drei Türen) handelt. Der mittlere Layer hat drei Neuronen, der Ausgabe-Layer nochmals drei, Letzteres ist wie erwähnt der One-hot-Kodierung der Ergebnisse als Kategorien geschuldet.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Snapshot

    2, 5, 7, 10, 12 – und welche Zahl kommt als nächste? Michael Schilli testet, ob sich von Psychologen erdachte Intelligenztests mit modernen KI-Automaten knacken lassen.

  • Tensorflow erreicht Version 1.0

    Tensorflow 1.0 verspricht Stabilität für sein Python API und beschleunigt die aktuelle und zukünftige Arbeit mit der Einführung des domain-spezifischen XLA Compilers.

  • Perl-Snapshot

    Zum Stöbern in vorbeirauschenden Paketen im lokalen Netzwerk leistet Platzhirsch Wireshark gute Dienste. Wer lieber eigene Tools baut, greift auf die Kommandozeilenversion Tshark zurück.

  • Verständnisfrage

    Als Prüfer Programmcode oder Multiple-Choice-Fragen elektronisch auszuwerten ist nicht allzu schwer. Doch das Korrektursystem zur Linux-Vorlesung an der Hochschule Heidelberg versteht nicht nur vorformulierte Textbausteine, sondern auch Freitextantworten.

  • Python asynchron

    Das Python-Modul Asyncio bringt neuen Schwung in vernetzte Anwendungen. Als Alternative zu Threads kann ein Entwickler es geschickt mit bestehenden Python-Bibliotheken kombinieren.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.