Ihr erstes Keras-Modell mit Lerntransfer

1. Übersicht

In diesem Lab lernen Sie, wie Sie einen Keras-Klassifikator erstellen. Anstatt die perfekte Kombination von Ebenen für neuronale Netzwerke zu finden, um Blumen zu erkennen, verwenden wir zuerst eine Technik namens Lerntransfer, um ein leistungsstarkes vortrainiertes Modell an unser Dataset anzupassen.

Dieses Lab enthält die notwendigen theoretischen Erklärungen zu neuronalen Netzwerken und ist ein guter Ausgangspunkt für Entwickler, die sich mit Deep Learning beschäftigen.

Dieses Lab ist Teil 2 der Reihe „Keras on TPU“. Sie können die Labs in der folgenden Reihenfolge oder unabhängig voneinander durcharbeiten.

ca8cc21f6838eccc.png

Lerninhalte

  • Eigenen Keras-Bildklassifikator mit einer Softmax-Ebene und Cross-Entropy-Verlust erstellen
  • 😈 Lerntransfer verwenden, anstatt eigene Modelle zu erstellen

Feedback

Wenn Sie in diesem Codelab etwas finden, das nicht stimmt, teilen Sie uns das bitte mit. Sie können Feedback über GitHub-Probleme geben [ Feedback-Link].

2. Kurzanleitung für Google Colaboratory

In diesem Lab wird Google Colaboratory 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-Backend auswählen

8832c6208c99687d.png

Wählen Sie im Colab-Menü Laufzeit > Laufzeittyp ändern und dann „TPU“ aus. In diesem Codelab verwenden Sie eine leistungsstarke TPU (Tensor Processing Unit), die für hardwarebeschleunigtes Training unterstützt wird. Die Verbindung zur Laufzeit erfolgt bei der ersten Ausführung automatisch. 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 Umschalt + Eingabetaste drücken. Sie können das gesamte Notebook auch mit Laufzeit > Alle ausführen ausführen.

Inhaltsverzeichnis

429f106990037ec4.png

Alle Notebooks haben ein Inhaltsverzeichnis. Sie können es mit dem schwarzen Pfeil links öffnen.

Ausgeblendete Zellen

edc3dba45d26f12a.png

Bei einigen Zellen wird nur der Titel angezeigt. Dies ist eine Colab-spezifische Notebook-Funktion. Sie können doppelt darauf klicken, um den Code zu sehen. Er ist aber in der Regel nicht sehr interessant. Normalerweise sind es Support- oder Visualisierungsfunktionen. Sie müssen diese Zellen trotzdem ausführen, damit die Funktionen darin definiert werden.

Authentifizierung

cdd4b41413100543.png

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

3. [INFO] Einführung in neuronale Netzwerkklassifikatoren

Zusammenfassung

Wenn Sie alle fett gedruckten Begriffe im nächsten Absatz bereits kennen, können Sie mit der nächsten Übung fortfahren. Wenn Sie gerade erst mit Deep Learning beginnen, lesen Sie bitte weiter.

Für Modelle, die als Sequenz von Ebenen erstellt wurden, bietet Keras die Sequential API. Ein Bildklassifikator mit drei dichten Ebenen 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

Dichtes neuronales Netzwerk

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

c21bae6dade487bc.png

Sie können ein Bild in ein solches Netzwerk einfügen, indem Sie die RGB-Werte aller Pixel in einen langen Vektor umwandeln 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 Eingaben, addiert einen Wert namens „Bias“ und leitet das Ergebnis über eine sogenannte „Aktivierungsfunktion“ weiter. Die Gewichte und der Bias sind anfangs unbekannt. Sie werden zufällig initialisiert und durch das Training des neuronalen Netzwerks mit vielen bekannten Daten „gelernt“.

644f4213a4ee70e5.png

Die beliebteste Aktivierungsfunktion ist ReLU (Rectified Linear Unit). Wie Sie im Diagramm oben sehen, ist sie sehr einfach.

Softmax-Aktivierung

Das Netzwerk oben endet mit einer Ebene mit fünf Neuronen, da wir Blumen in fünf Kategorien klassifizieren (Rose, Tulpe, Löwenzahn, Gänseblümchen, Sonnenblume). Neuronen in Zwischenebenen 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 Softmax auf einen Vektor anzuwenden, wird der Exponentialwert jedes Elements berechnet und der Vektor dann normalisiert, in der Regel mit der L1-Norm (Summe der absoluten Werte), sodass die Werte sich zu 1 addieren und als Wahrscheinlichkeiten interpretiert werden können.

ef0d98c0952c262d.png d51252f75894479e.gif

Cross-Entropy-Verlust

Nachdem unser neuronales Netzwerk Vorhersagen aus Eingabebildern generiert hat, müssen wir messen, wie gut sie sind, d.h. den Abstand zwischen dem, was das Netzwerk uns sagt, und den richtigen Antworten, die oft als „Labels“ bezeichnet werden. Wir haben die richtigen Labels für alle Bilder im Dataset.

Jeder Abstand wäre möglich, aber für Klassifizierungsprobleme ist der sogenannte „Cross-Entropy-Abstand“ am effektivsten. Wir bezeichnen ihn als Fehler- oder „Verlustfunktion“:

7bdf8753d20617fb.png

Gradientenabstieg

Das „Training“ des neuronalen Netzwerks bedeutet, dass mit Trainingsbildern und Labels Gewichte und Bias angepasst werden, um die Cross-Entropy-Verlustfunktion zu minimieren. So funktioniert es:

Die Cross-Entropy ist eine Funktion von Gewichten, Bias, Pixeln des Trainingsbilds und seiner bekannten Klasse.

Wenn wir die partiellen Ableitungen der Cross-Entropy in Bezug auf alle Gewichte und alle Bias berechnen, erhalten wir einen „Gradienten“, der für ein bestimmtes Bild, Label und den aktuellen Wert von Gewichten und Bias berechnet wird. Wir können Millionen von Gewichten und Bias haben. Die Berechnung des Gradienten ist also viel Arbeit. Glücklicherweise übernimmt TensorFlow das für uns. Die mathematische Eigenschaft eines Gradienten ist, dass er „nach oben“ zeigt. Da wir dorthin wollen, wo die Cross-Entropy niedrig ist, gehen wir in die entgegengesetzte Richtung. Wir aktualisieren Gewichte und Bias um einen Bruchteil des Gradienten. Dann wiederholen wir den Vorgang immer wieder mit den nächsten Batches von Trainingsbildern und Labels in einer Trainingsschleife. Im Idealfall konvergiert dies zu einem Punkt, an dem die Cross-Entropy minimal ist. Es gibt jedoch keine Garantie dafür, dass dieses Minimum eindeutig ist.

gradient descent2.png

Mini-Batching und Momentum

Sie können den Gradienten nur für ein Beispielbild berechnen und die Gewichte und Bias sofort aktualisieren. Wenn Sie dies jedoch für einen Batch von beispielsweise 128 Bildern tun, erhalten Sie einen Gradienten, der die durch verschiedene Beispielbilder auferlegten Einschränkungen besser darstellt und daher wahrscheinlich schneller zur Lösung konvergiert. Die Größe des Mini-Batch ist ein anpassbarer Parameter.

Diese Technik, die manchmal als „stochastischer Gradientenabstieg“ bezeichnet wird, hat einen weiteren, pragmatischeren Vorteil: Die Arbeit mit Batches bedeutet auch die Arbeit mit größeren Matrizen, die in der Regel einfacher auf GPUs und TPUs optimiert werden können.

Die Konvergenz kann jedoch immer noch etwas chaotisch sein und sogar anhalten, wenn der Gradientenvektor nur Nullen enthält. Bedeutet das, dass wir ein Minimum gefunden haben? Nicht immer. Eine Gradientenkomponente kann an einem Minimum oder Maximum null sein. Wenn ein Gradientenvektor Millionen von Elementen enthält und alle null sind, ist die Wahrscheinlichkeit, dass jede Null einem Minimum entspricht und keine einem Maximum, ziemlich gering. In einem Raum mit vielen Dimensionen sind Sattelpunkte ziemlich häufig und wir möchten nicht an ihnen anhalten.

52e824fe4716c4a0.png

Abbildung: Ein Sattelpunkt. Der Gradient ist 0, aber es ist nicht in allen Richtungen ein Minimum. (Bildnachweis Wikimedia: Von Nicoguaro – Eigenes Werk, CC BY 3.0)

Die Lösung besteht darin, dem Optimierungsalgorithmus etwas Momentum hinzuzufügen, damit er Sattelpunkte überwinden kann, ohne anzuhalten.

Glossar

Batch oder Mini-Batch: Das Training wird immer mit Batches von Trainingsdaten und Labels durchgeführt. Dadurch kann der Algorithmus konvergieren. Die Dimension „Batch“ ist in der Regel die erste Dimension von Datentensoren. Ein Tensor mit der Form [100, 192, 192, 3] enthält beispielsweise 100 Bilder mit 192 × 192 Pixeln und drei Werten pro Pixel (RGB).

Cross-Entropy-Verlust: Eine spezielle Verlustfunktion, die häufig in Klassifikatoren verwendet wird.

Dichte Ebene: Eine Ebene von Neuronen, in der jedes Neuron mit allen Neuronen in der vorherigen Ebene 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 müssen, um gute Vorhersagen zu erhalten, wird als „Feature Engineering“ bezeichnet.

Labels: Ein anderer Name für "Klassen" oder richtige Antworten in einem überwachten Klassifizierungsproblem

Lernrate: Bruchteil des Gradienten, um den Gewichte und Bias bei jeder Iteration der Trainingsschleife aktualisiert werden.

Logits: Die Ausgaben einer Ebene von Neuronen, bevor die Aktivierungsfunktion angewendet wird, werden als „Logits“ bezeichnet. Der Begriff stammt von der „logistischen Funktion“, auch bekannt als „Sigmoidfunktion“, die früher die beliebteste Aktivierungsfunktion war. „Neuronausgaben vor der logistischen Funktion“ wurde zu „Logits“ verkürzt.

Verlust: Die Fehlerfunktion, die die Ausgaben des neuronalen Netzwerks mit den richtigen Antworten vergleicht

Neuron: Berechnet die gewichtete Summe seiner Eingaben, addiert einen Bias und leitet das Ergebnis über eine Aktivierungsfunktion weiter.

One-Hot-Codierung: Klasse 3 von 5 wird als Vektor mit fünf Elementen codiert, wobei alle Elemente null sind, außer dem dritten, der 1 ist.

ReLU: Rectified Linear Unit. Eine beliebte Aktivierungsfunktion für Neuronen.

sigmoid: Eine weitere Aktivierungsfunktion, die früher beliebt war und in Sonderfä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 vergrößert und den Vektor so normalisiert, dass die Summe 1 ergibt, 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 drei, vier, fünf oder mehr Dimensionen.

4. Lerntransfer

Für ein Bildklassifizierungsproblem reichen dichte Ebenen wahrscheinlich nicht aus. Wir müssen mehr über Convolutional Layers und die vielen Möglichkeiten lernen, sie anzuordnen.

Aber wir können auch eine Abkürzung nehmen. Es gibt vollständig trainierte Convolutional Neural Networks, die heruntergeladen werden können. Es ist möglich, die letzte Ebene, den Softmax-Klassifikationskopf, abzuschneiden und durch eine eigene zu ersetzen. Alle trainierten Gewichte und Bias bleiben unverändert. Sie trainieren nur die hinzugefügte Softmax-Ebene neu. Diese Technik wird als Lerntransfer bezeichnet und funktioniert erstaunlicherweise, solange das Dataset, mit dem das neuronale Netzwerk vortrainiert wurde, „nah genug“ an Ihrem Dataset ist.

Praktische Übung

Öffnen Sie das folgende Notebook, führen Sie die Zellen aus (Umschalt + Eingabetaste) und folgen Sie der Anleitung, wenn Sie das Label „WORK REQUIRED“ sehen.

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

Weitere Informationen

Mit Lerntransfer profitieren Sie sowohl von fortschrittlichen Convolutional Neural Network-Architekturen, die von Top-Forschern entwickelt wurden, als auch vom Vortraining mit einem riesigen Dataset von Bildern. In unserem Fall führen wir einen Lerntransfer von einem Netzwerk durch, das mit ImageNet trainiert wurde. ImageNet ist eine Datenbank mit Bildern, die viele Pflanzen und Außenszenen enthält und die Blumen sehr ähnlich sind.

b8fc1efd2001f072.png

Abbildung: Ein komplexes Convolutional Neural Network, das bereits trainiert wurde, als Blackbox verwenden und nur den Klassifikationskopf neu trainieren. Das ist Lerntransfer. Wir werden später sehen, wie diese komplizierten Anordnungen von Convolutional Layers funktionieren. Im Moment ist das das Problem von jemand anderem.

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 hat. Wenn Sie include_top=False auswählen, erhalten Sie das vortrainierte Modell ohne die 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. Dadurch werden die Gewichte und Bias des vortrainierten Modells eingefroren, sodass Sie nur die Softmax-Ebene trainieren. Dabei werden in der Regel relativ wenige Gewichte verwendet und der Vorgang kann schnell und ohne sehr großes Dataset durchgeführt werden. Wenn Sie jedoch viele Daten haben, kann der Lerntransfer mit pretrained_model.trainable = True noch besser funktionieren. Die vortrainierten Gewichte liefern dann hervorragende Anfangswerte und können durch das Training angepasst werden, um besser zu Ihrem Problem zu passen.

Beachten Sie schließlich die Ebene Flatten(), die vor der dichten Softmax-Ebene eingefügt wurde. Dichte Ebenen arbeiten mit flachen Vektoren von Daten, aber wir wissen nicht, ob das vortrainierte Modell das zurückgibt. Deshalb müssen wir die Daten flach machen. Im nächsten Kapitel, in dem wir uns mit Convolutional-Architekturen beschäftigen, erklären wir das Datenformat, das von Convolutional Layers zurückgegeben wird.

Mit diesem Ansatz sollten Sie eine Genauigkeit von etwa 75% erreichen.

Lösung

Hier finden Sie das Notebook mit der Lösung. Sie können es verwenden, wenn Sie nicht weiterkommen.

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

Behandelte Themen

  • 🤔 Klassifikator in Keras schreiben
  • 🤓 Mit einer letzten Softmax-Ebene und Cross-Entropy-Verlust konfiguriert
  • 😈 Lerntransfer
  • 🤔 Erstes Modell trainieren
  • 🧐 Verlust und Genauigkeit während des Trainings verfolgen

Nehmen Sie sich einen Moment Zeit, um diese Checkliste im Kopf durchzugehen.

5. Glückwunsch!

Sie können jetzt ein Keras-Modell erstellen. Fahren Sie mit dem nächsten Lab fort, um zu erfahren, wie Sie Convolutional Layers zusammensetzen.

TPUs in der Praxis

TPUs und GPUs sind in Cloud AI Platform verfügbar:

Wir freuen uns immer über Feedback. Teilen Sie uns mit, wenn Sie in diesem Lab etwas finden, das nicht stimmt, oder wenn Sie der Meinung sind, dass es verbessert werden sollte. Sie können Feedback über GitHub-Probleme geben [ Feedback-Link].

HR.png

Martin Görner ID small.jpg
Autor: Martin Görner
Twitter: @martin_gorner

tensorflow logo.jpg
www.tensorflow.org