Dropout Neural Network Layer In Keras erklärt

Maschinelles Lernen wird letztendlich verwendet, um Ergebnisse bei einer Reihe von Merkmalen vorherzusagen. Daher wird alles, was wir tun können, um die Leistung unseres Modells zu verallgemeinern, als Nettogewinn angesehen. Dropout ist eine Technik, die verwendet wird, um zu verhindern, dass ein Modell überanpasst. Dropout funktioniert, indem die ausgehenden Kanten versteckter Einheiten (Neuronen, aus denen versteckte Ebenen bestehen) bei jeder Aktualisierung der Trainingsphase zufällig auf 0 gesetzt werden. Wenn Sie sich die Keras-Dokumentation für die Dropout-Ebene ansehen, sehen Sie einen Link zu einem Whitepaper von Geoffrey Hinton und Freunden, das sich mit der Theorie hinter Dropout befasst.

Im folgenden Beispiel verwenden wir Keras, um ein neuronales Netzwerk mit dem Ziel zu erstellen, handgeschriebene Ziffern zu erkennen.

from keras.datasets import mnist
from matplotlib import pyplot as plt
plt.style.use('dark_background')
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation, Dropout
from keras.utils import normalize, to_categorical

Wir verwenden Keras, um die Daten in unser Programm zu importieren. Die Daten sind bereits in die Trainings- und Testsets aufgeteilt.

(X_train, y_train), (X_test, y_test) = mnist.load_data()

Schauen wir uns an, womit wir arbeiten.

plt.imshow(x_train, cmap = plt.cm.binary)
plt.show()

Nachdem wir das Modell trainiert haben, sollte es in der Lage sein, das vorhergehende Bild als fünf zu erkennen.

Es gibt eine kleine Vorverarbeitung, die wir vorher durchführen müssen. Wir normalisieren die Pixel (Features) so, dass sie von 0 bis 1 reichen. Dadurch kann das Modell viel schneller zu einer Lösung konvergieren. Als nächstes transformieren wir jede der Zielbeschriftungen für ein bestimmtes Sample in ein Array von 1s und 0s, wobei der Index der Zahl 1 die Ziffer angibt, die das Bild darstellt. Wir tun dies, weil sonst unser Modell die Ziffer 9 als eine höhere Priorität als die Zahl 3 interpretieren würde.

X_train = normalize(X_train, axis=1)
X_test = normalize(X_test, axis=1)
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

Ohne Dropout

Bevor wir eine 2-dimensionale Matrix in ein neuronales Netzwerk einspeisen, verwenden wir eine Flatten-Schicht, die sie in ein 1-dimensionales Array umwandelt, indem wir jede nachfolgende Zeile an die vorangegangene Zeile anhängen. Wir werden zwei versteckte Schichten verwenden, die jeweils aus 128 Neuronen bestehen, und eine Ausgabeschicht, die aus 10 Neuronen besteht, jeweils für eine der 10 möglichen Ziffern. Die Softmax-Aktivierungsfunktion gibt die Wahrscheinlichkeit zurück, dass eine Stichprobe eine bestimmte Ziffer darstellt.

Da wir beim Versuch, Klassen vorherzusagen, verwenden wir die kategoriale Crossentropie als Verlustfunktion. Wir werden die Leistung des Modells anhand der Genauigkeit messen.

model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=
)

Wir legen 10% der Daten zur Validierung beiseite. Damit vergleichen wir die Tendenz eines Modells zum Overfit mit und ohne Dropout. Eine Stapelgröße von 32 impliziert, dass wir den Gradienten berechnen und einen Schritt in Richtung des Gradienten mit einer Größe gleich der Lernrate machen, nachdem wir 32 Proben durch das neuronale Netzwerk geleitet haben. Wir tun dies insgesamt 10 Mal, wie durch die Anzahl der Epochen angegeben.

history = model.fit(
X_train,
y_train,
epochs=10,
batch_size=32,
validation_split=0.1,
verbose = 1,
shuffle=True
)

Wir können die Trainings- und Validierungsgenauigkeiten in jeder Epoche zeichnen, indem wir die von der fit-Funktion zurückgegebene history-Variable verwenden.

Wie Sie sehen können, nimmt der Validierungsverlust ohne Dropout nach der dritten Epoche nicht mehr ab.

As you can see, without dropout, the validation accuracy tends to plateau around the third epoch.

Using this simple model, we still managed to obtain an accuracy of over 97%.

test_loss, test_acc = model.evaluate(X_test, y_test)
test_acc

Dropout

Es gibt einige Diskussionen darüber, ob der Dropout vor oder nach der Aktivierungsfunktion platziert werden soll. Als Faustregel gilt, bei allen Aktivierungsfunktionen außer relu den Dropout nach der Funktion aktivieren zu platzieren. Beim Passieren von 0.5 wird jede versteckte Einheit (Neuron) mit einer Wahrscheinlichkeit von 0.5 auf 0 gesetzt. Mit anderen Worten, es gibt eine 50% ige Änderung, dass die Ausgabe eines bestimmten Neurons auf 0 gezwungen wird.

Wieder, da wir versuchen, Klassen vorherzusagen , wir verwenden kategoriale crossentropy als unsere Verlustfunktion.

model_dropout.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=
)

Durch die Bereitstellung des Parameters validations split setzt das Modell einen Bruchteil der Trainingsdaten auseinander und bewertet den Verlust und alle Modellmetriken für diese Daten am Ende jeder Epoche. Wenn die Prämisse hinter Dropout zutrifft, sollten wir einen bemerkenswerten Unterschied in der Validierungsgenauigkeit im Vergleich zum vorherigen Modell feststellen. Der Shuffle-Parameter mischt die Trainingsdaten vor jeder Epoche.

history_dropout = model_dropout.fit(
X_train,
y_train,
epochs=10,
batch_size=32,
validation_split=0.1,
verbose = 1,
shuffle=True
)

Wie Sie sehen können, ist der Validierungsverlust signifikant niedriger als der, der mit dem regulären Modell erhalten wird.

Wie sie sehen können, die modell konvergierte viel schneller und erreichte eine Genauigkeit von fast 98% auf dem Validierungssatz, während das Vorgängermodell um die dritte Epoche herum Plateau erreichte.

Die genauigkeit erhalten auf die prüfung set ist nicht ganz anders als das Modell ohne Ausfallende. Dies ist aller Wahrscheinlichkeit nach auf die begrenzte Anzahl von Proben zurückzuführen.

test_loss, test_acc = model_dropout.evaluate(X_test, y_test)
test_acc

Abschließende Gedanken

Dropout kann einem Modell helfen, sich zu verallgemeinern, indem es die Ausgabe für ein bestimmtes Neuron zufällig auf 0 setzt. Wenn Sie die Ausgabe auf 0 setzen, reagiert die Kostenfunktion empfindlicher auf benachbarte Neuronen, die die Art und Weise ändern, wie die Gewichte während des Prozesses der Rückpropagation aktualisiert werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.