Ihr erstes Keras-Modell mit Lerntransfer

1. Übersicht

In diesem Lab lernen Sie, wie Sie einen Keras-Klassifikator erstellen. Anstatt zu versuchen, die perfekte Kombination von Schichten für ein neuronales Netzwerk zur Erkennung von Blumen zu finden, verwenden wir zuerst eine Methode namens Transferlernen, um ein leistungsstarkes vorab trainiertes Modell an unseren Datensatz anzupassen.

Dieses Lab enthält die notwendigen theoretischen Erläuterungen zu neuronalen Netzwerken und ist ein guter Ausgangspunkt für Entwickler, die sich mit Deep Learning vertraut machen.

Dieses Lab ist Teil 2 der Serie „Keras auf TPU“. Sie können sie in der folgenden Reihenfolge oder einzeln durchführen.

ca8cc21f6838eccc.png

Lerninhalte

  • Erstellen eines eigenen Keras-Bildklassifikators mit einer Softmax-Schicht und Kreuzentropieverlust
  • Um 😈 zu betrügen, indem du Lerntransfers nutzt, anstatt eigene Modelle zu entwickeln.

Feedback

Bitte teilen Sie uns mit, wenn Sie in diesem Code-Lab etwas nicht erkennen. Feedback kann über GitHub-Probleme [Feedback-Link] gegeben werden.

2. Kurzanleitung für Google Colaboratory

Für dieses Lab wird Google Collaboratory verwendet. Sie müssen nichts einrichten. Colaboratory ist eine Online-Notebook-Plattform für Bildungszwecke. Sie bietet kostenloses CPU-, GPU- und TPU-Training.

688858c21e3beff2.png

Sie können dieses Beispielnotebook öffnen und einige Zellen durchgehen, um sich mit Colaboratory vertraut zu machen.

c3df49e90e5a654f.png Welcome to Colab.ipynb

TPU-Back-End auswählen

8832c6208c99687d.png

Wählen Sie im Colab-Menü Laufzeit > Laufzeittyp ändern und dann TPU aus. In diesem Code-Lab verwenden Sie eine leistungsstarke TPU (Tensor Processing Unit), die für hardwarebeschleunigtes Training unterstützt wird. Die Verbindung zur Laufzeit wird bei der ersten Ausführung automatisch hergestellt. Sie können auch die Schaltfläche „Verbinden“ rechts oben verwenden.

Notebook-Ausführung

76d05caa8b4db6da.png

Führen Sie die Zellen einzeln aus, indem Sie auf eine Zelle klicken und die Umschalttaste und die Eingabetaste drücken. Mit Laufzeit > Alle ausführen können Sie auch das gesamte Notebook ausführen.

Inhaltsverzeichnis

429f106990037ec4.png

Alle Notizenbücher haben ein Inhaltsverzeichnis. Sie können ihn mit dem schwarzen Pfeil auf der linken Seite öffnen.

Ausgeblendete Zellen

edc3dba45d26f12a.png

Bei einigen Zellen wird nur der Titel angezeigt. Dies ist eine Colab-spezifische Notebookfunktion. Sie können darauf doppelklicken, um den Code zu sehen, der aber in der Regel nicht sehr interessant ist. Sie unterstützen in der Regel Funktionen für die Visualisierung. Sie müssen diese Zellen trotzdem ausführen, damit die darin enthaltenen Funktionen definiert werden.

Authentifizierung

cdd4b41413100543.png

Colab kann auf Ihre privaten Google Cloud Storage-Buckets zugreifen, sofern Sie sich mit einem autorisierten Konto authentifizieren. Das obige Code-Snippet löst einen Authentifizierungsprozess aus.

3. [INFO] Klassifikator für neuronale Netzwerke – erste Schritte

Kurz und bündig

Wenn Ihnen alle Begriffe im nächsten Abschnitt, die fett hervorgehoben sind, bereits bekannt sind, können Sie mit der nächsten Übung fortfahren. Wenn Sie gerade erst mit Deep Learning beginnen, lesen Sie weiter.

Für Modelle, die als Folge von Ebenen erstellt wurden, bietet Keras die Sequential API an. Ein Bildklassifikator mit drei dichten Schichten kann beispielsweise in Keras so geschrieben werden:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

Kompaktes neuronales Netzwerk

Dies ist das einfachste neuronale Netzwerk zum Klassifizieren von Bildern. Es besteht aus „Neuronen“, die in Schichten angeordnet sind. Die erste Ebene verarbeitet Eingabedaten und speist ihre Ausgaben in andere Ebenen ein. Sie wird als „dicht“ bezeichnet, weil jedes Neuron mit allen Neuronen aus der vorherigen Schicht verbunden ist.

c21bae6dade487bc.png

Sie können ein Bild in ein solches Netzwerk einspeisen, indem Sie die RGB-Werte aller seiner Pixel zu einem langen Vektor zusammenfassen und als Eingabe verwenden. Es ist nicht die beste Technik für die Bilderkennung, aber wir werden sie später verbessern.

Neuronen, Aktivierungen, RELU

Ein „Neuron“ berechnet eine gewichtete Summe aller seiner Eingaben, fügt einen Wert namens „Bias“ hinzu und leitet das Ergebnis durch eine sogenannte „Aktivierungsfunktion“ weiter. Die Gewichtungen und Verzerrungen sind zunächst unbekannt. Sie werden zufällig initialisiert und durch Training des neuronalen Netzwerks mit vielen bekannten Daten „erlernt“.

644f4213a4ee70e5.png

Die gängigste Aktivierungsfunktion heißt RELU (Rectified Linear Unit). Wie Sie in der Grafik oben sehen können, ist dies eine sehr einfache Funktion.

Softmax-Aktivierung

Das obige Netzwerk endet mit einer Schicht mit 5 Neuronen, da wir Blumen in fünf Kategorien unterteilen: Rose, Tulpe, Löwenzahn, Gänseblümchen, Sonnenblume. Neuronen in Zwischenschichten werden mit der klassischen RELU-Aktivierungsfunktion aktiviert. In der letzten Ebene möchten wir jedoch Zahlen zwischen 0 und 1 berechnen, die die Wahrscheinlichkeit darstellen, dass diese Blume eine Rose, eine Tulpe usw. ist. Dazu verwenden wir eine Aktivierungsfunktion namens „Softmax“.

Um die Softmax-Funktion auf einen Vektor anzuwenden, wird die Exponentialfunktion auf jedes Element angewendet und der Vektor dann normalisiert. Normalerweise wird dabei die L1-Norm (Summe der Absolutwerte) verwendet, damit sich die Werte auf 1 summieren und als Wahrscheinlichkeiten interpretiert werden können.

ef0d98c0952c262d.png d51252f75894479e.gif

Kreuzentropieverlust

Jetzt, da unser neuronales Netzwerk Vorhersagen aus Eingabebildern generiert, müssen wir messen, wie gut sie sind, d. h. den Abstand zwischen den Angaben des Netzwerks und den richtigen Antworten, die oft als „Labels“ bezeichnet werden. Denken Sie daran, dass wir für alle Bilder im Datensatz korrekte Labels haben.

Jede Entfernung würde funktionieren, aber für Klassifizierungsprobleme ist die sogenannte Kreuzentropie-Distanz am effektivsten. Wir nennen dies unsere Fehler- oder „Verlust“-Funktion:

7bdf8753d20617fb.png

Gradientenabstieg

Das „Trainieren“ des neuronalen Netzwerks bedeutet eigentlich, Bilder und Labels zu trainieren, um Gewichtungen und Verzerrungen so anzupassen, dass die Kreuzentropie-Verlustfunktion minimiert wird. Und so funktioniert es:

Die Kreuzentropie ist eine Funktion von Gewichten, Voreingenommenheiten, Pixeln des Trainingsbilds und seiner bekannten Klasse.

Wenn wir die partiellen Ableitungen der Kreuzentropie relativ zu allen Gewichten und Voreingenommenheiten berechnen, erhalten wir einen „Gradienten“, der für ein bestimmtes Bild, Label und den aktuellen Wert der Gewichte und Voreingenommenheiten berechnet wird. Denken Sie daran, dass wir Millionen von Gewichtungen und Verzerrungen haben können. Die Berechnung des Farbverlaufs klingt also wie eine Menge Arbeit. Glücklicherweise erledigt Tensorflow das für uns. Die mathematische Eigenschaft eines Farbverlaufs besteht darin, dass er nach oben zeigt. Da wir hingehen möchten, wo die Kreuzentropie gering ist, gehen wir in die entgegengesetzte Richtung. Wir aktualisieren die Gewichte und Voreingenommenheiten um einen Bruchteil des Gradienten. Anschließend wiederholen wir immer wieder die gleiche Aufgabe mit den nächsten Batches von Trainingsbildern und ‐labels in einer Trainingsschleife. Hoffentlich konvergiert dies zu einem Punkt, an dem die Kreuzentropie minimal ist, obwohl es keine Garantie dafür gibt, dass dieses Minimum eindeutig ist.

Gradientenabstieg2.png

Mini-Batching und Impuls

Sie können Ihren Gradienten nur für ein Beispielbild berechnen und die Gewichtungen und Gewichtungen sofort aktualisieren. Bei einem Batch von beispielsweise 128 Bildern ergibt sich jedoch ein Farbverlauf, der die Einschränkungen durch verschiedene Beispielbilder besser darstellt und daher wahrscheinlich schneller der Lösung näherkommt. Die Größe des Mini-Batches ist ein anpassbarer Parameter.

Diese Methode, die manchmal als „stochastischer Gradientenabstieg“ bezeichnet wird, hat einen weiteren, pragmatischeren Vorteil: Die Arbeit mit Batches bedeutet auch, mit größeren Matrizen zu arbeiten, und diese lassen sich in der Regel für GPUs und TPUs einfacher optimieren.

Die Konvergenz kann jedoch immer noch etwas chaotisch sein und sogar aufhören, wenn der Gradientenvektor nur Nullen enthält. Bedeutet das, dass wir ein Minimum gefunden haben? Nimmt immer. Eine Farbverlaufskomponente kann bei einem Minimum oder Maximum null sein. Bei einem Gradientenvektor mit Millionen von Elementen ist die Wahrscheinlichkeit, dass jede Null einem Minimum und keines von ihnen einem Höchstpunkt entspricht, ziemlich gering, wenn alle Nullen sind. In einem Raum mit vielen Dimensionen kommen Sattelpunkte häufig vor, sodass wir nicht bei ihnen anhalten möchten.

52e824fe4716c4a0.png

Abbildung: Sattelpunkt. Der Farbverlauf ist 0, aber kein Mindestwert in alle Richtungen. (Bildzuordnung Wikimedia: By Nicoguaro – Own work, CC BY 3.0)

Die Lösung besteht darin, dem Optimierungsalgorithmus etwas Schwung zu verleihen, damit er die Sattelpunkte überwinden kann, ohne anzuhalten.

Glossar

batch oder mini-batch: Das Training wird immer mit Batches von Trainingsdaten und Labels durchgeführt. Dies trägt dazu bei, dass der Algorithmus konvergiert. Die Dimension „Batch“ ist in der Regel die erste Dimension von Datentensoren. Beispiel: Ein Tensor der Form [100, 192, 192, 3] enthält 100 Bilder mit 192 × 192 Pixeln mit drei Werten pro Pixel (RGB).

Kreuzentropieverlust: Eine spezielle Verlustfunktion, die häufig in Klassifikatoren verwendet wird.

Ganze Schicht: Eine Schicht von Neuronen, in der jedes Neuron mit allen Neuronen der vorherigen Schicht verbunden ist.

features: Die Eingaben eines neuronalen Netzwerks werden manchmal als „Features“ bezeichnet. Die Kunst, herauszufinden, welche Teile eines Datasets (oder Kombinationen von Teilen) in ein neuronales Netzwerk eingespeist werden sollen, um gute Vorhersagen zu erhalten, wird als „Feature Engineering“ bezeichnet.

Labels: Ein anderer Name für „Klassen“ oder richtige Antworten bei einem Klassifizierungsproblem mit beaufsichtigtem Lernen

Lernrate: Bruchteil des Gradienten, mit dem Gewichte und Voreingenommenheiten bei jeder Iteration der Trainingsschleife aktualisiert werden.

Logits: Die Ausgaben einer Neuronenschicht vor Anwendung der Aktivierungsfunktion werden als „Logits“ bezeichnet. Der Begriff leitet sich von der „Logistischen Funktion“ bzw. „Sigmoidfunktion“ ab, die früher die beliebteste Aktivierungsfunktion war. „Neuron-Ausgaben vor der logistischen Funktion“ wurde zu „Logits“ verkürzt.

loss: die Fehlerfunktion, die die Ausgaben neuronaler Netzwerke mit den richtigen Antworten vergleicht

neuron: berechnet die gewichtete Summe der Eingaben, fügt eine Verzerrung hinzu und speist das Ergebnis über eine Aktivierungsfunktion ein.

One-Hot-Codierung: Die Klasse 3 von 5 wird als Vektor mit 5 Elementen codiert, wobei alle Elemente null sind, mit Ausnahme des 3. Elements, das 1 ist.

relu: korrigierte lineare Einheit. Eine beliebte Aktivierungsfunktion für Neuronen.

Sigmoid: Eine weitere Aktivierungsfunktion, die früher beliebt war und in bestimmten Fällen immer noch nützlich ist.

Softmax: Eine spezielle Aktivierungsfunktion, die auf einen Vektor wirkt, den Unterschied zwischen der größten Komponente und allen anderen erhöht und den Vektor so normalisiert, dass er eine Summe von 1 hat, sodass er als Vektor von Wahrscheinlichkeiten interpretiert werden kann. Wird als letzter Schritt in Klassifikatoren verwendet.

Tensor: Ein Tensor ist wie eine Matrix, hat aber eine beliebige Anzahl von Dimensionen. Ein eindimensionaler Tensor ist ein Vektor. Ein zweidimensionaler Tensor ist eine Matrix. Es gibt auch Tensoren mit 3, 4, 5 oder mehr Dimensionen.

4. Transfer Learning

Für ein Bildklassifizierungsproblem genügen dichte Schichten wahrscheinlich nicht. Wir müssen etwas über Faltungsebenen und die vielen Möglichkeiten lernen, sie anzuordnen.

Wir können aber auch einen Umweg gehen. Es gibt vollständig trainierte Convolutional Neural Networks, die zum Download verfügbar sind. Sie können die letzte Schicht, den Softmax-Klassifizierungskopf, abschneiden und durch einen eigenen ersetzen. Alle trainierten Gewichte und Vorurteile bleiben unverändert. Sie trainieren nur die hinzugefügte Softmax-Schicht neu. Diese Technik wird als Transferlernen bezeichnet und funktioniert erstaunlicherweise, solange der Datensatz, auf dem das neuronale Netzwerk vorab trainiert wurde, „nahe genug“ an Ihrem liegt.

Praxisorientiert

Öffnen Sie das folgende Notebook, führen Sie die Zellen aus (Umschalttaste + Eingabetaste) und folgen Sie den Anweisungen, wenn das Label „ARBEITSERFORDERLICH“ angezeigt wird.

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

Weitere Informationen

Mit Lerntransfers profitieren Sie sowohl von fortschrittlichen, von Top-Forschern entwickelten Convolutional Neural Network-Architekturen als auch vom Vorabtraining mit einem riesigen Dataset von Bildern. In unserem Fall verwenden wir das Transfer-Lernen aus einem Netzwerk, das auf ImageNet trainiert wurde, einer Datenbank mit Bildern vieler Pflanzen und Außenszenen, die Blumen sehr ähnlich sind.

b8fc1efd2001f072.png

Illustration: Mithilfe eines komplexen Convolutional Neural Network, das bereits als Blackbox trainiert wurde, wird nur der Klassifizierungskopf neu trainiert. Das ist der Lerntransfer. Wir werden später sehen, wie diese komplizierten Anordnungen von Faltungsebenen funktionieren. Im Moment ist es das Problem einer anderen Person.

Lerntransfer in Keras

In Keras können Sie ein vortrainiertes Modell aus der Sammlung tf.keras.applications.* instanziieren. MobileNet V2 ist beispielsweise eine sehr gute Convolutional-Architektur, die eine angemessene Größe hält. Wenn Sie include_top=False auswählen, erhalten Sie das vortrainierte Modell ohne seine letzte Softmax-Ebene, sodass Sie Ihre eigene hinzufügen können:

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

Beachten Sie auch die Einstellung pretrained_model.trainable = False. Es friert die Gewichtungen und Verzerrungen des vortrainierten Modells ein, sodass Sie nur Ihre Softmax-Ebene trainieren. Dies erfordert in der Regel relativ wenige Gewichtungen und kann schnell durchgeführt werden, ohne dass ein sehr großes Dataset erforderlich ist. Wenn Sie jedoch viele Daten haben, kann die Lerntransferfunktion mit pretrained_model.trainable = True noch besser funktionieren. Die vortrainierten Gewichtungen liefern dann hervorragende Anfangswerte und können im Rahmen des Trainings dennoch an Ihr Problem angepasst werden.

Beachten Sie auch die Flatten()-Ebene, die vor der dichten Softmax-Ebene eingefügt wurde. Dichte Ebenen funktionieren auf flachen Datenvektoren, aber wir wissen nicht, ob das vortrainierte Modell diese Ergebnisse zurückgibt. Deshalb müssen wir die Ebenen zusammenführen. Im nächsten Kapitel, in dem wir uns mit Convolutional Neural Networks befassen, erklären wir das Datenformat, das von Convolutional-Schichten zurückgegeben wird.

Bei diesem Ansatz sollten Sie eine Genauigkeit von fast 75% erreichen.

Lösung

Hier ist das Lösungs-Notebook. Sie können sie verwenden, wenn Sie nicht weiterkommen.

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

Behandelte Themen

  • 🤔 So schreibt man einen Klassifikator in Keras
  • 🤓 konfiguriert mit einem letzten Softmax-Layer und Kreuzentropieverlust
  • 😈 Lerntransfer
  • 🤔 Erstes Modell trainieren
  • 🧐 Verlust und Genauigkeit während des Trainings verfolgen

Bitte nehmen Sie sich einen Moment Zeit und gehen Sie diese Checkliste durch.

5. Glückwunsch!

Sie können jetzt ein Keras-Modell erstellen. Im nächsten Lab erfahren Sie, wie Sie Faltebenen zusammensetzen.

TPUs in der Praxis

TPUs und GPUs sind auf der Cloud AI Platform verfügbar:

Wir freuen uns über Feedback. Bitte teilen Sie uns mit, wenn Ihnen in diesem Lab etwas fehlt oder Sie der Meinung sind, dass es verbessert werden sollte. Feedback kann über GitHub-Probleme [Feedback-Link] gegeben werden.

HR.png

Martin Görner ID, klein.jpg
Der Autor: Martin Görner
Twitter: @martin_gorner

tensorflow logo.jpg
www.tensorflow.org