1. Übersicht
In diesem Lab lernen Sie, wie Sie einen Keras-Klassifikator erstellen. Anstatt die perfekte Kombination von neuronalen Netzwerkebenen zu finden, um Blumen zu erkennen, verwenden wir zuerst eine Technik namens Transfer Learning, um ein leistungsstarkes vortrainiertes Modell an unseren Datensatz anzupassen.
Dieses Lab enthält die erforderlichen theoretischen Erklärungen zu neuronalen Netzen und ist ein guter Ausgangspunkt für Entwickler, die mehr über Deep Learning erfahren möchten.
Dieses Lab ist Teil 2 der Reihe „Keras on TPU“. Sie können sie in der folgenden Reihenfolge oder unabhängig voneinander durchführen.
- Datenpipelines mit TPU-Geschwindigkeit: tf.data.Dataset und TFRecords
- [DIESES LAB] Ihr erstes Keras-Modell mit Transfer Learning
- Convolutional Neural Networks mit Keras und TPUs
- Moderne ConvNets, SqueezeNets, Xception, mit Keras und TPUs

Lerninhalte
- Eigenen Keras-Bildklassifikator mit Softmax-Schicht und Cross-Entropy-Verlust erstellen
- Um zu schummeln 😈, können Sie Transfer Learning verwenden, anstatt eigene Modelle zu erstellen.
Feedback
Wenn Sie in diesem Codelab etwas Ungewöhnliches sehen, teilen Sie uns das bitte mit. Feedback kann über GitHub-Probleme [ Feedback-Link] gegeben werden.
2. Google Colaboratory – Kurzanleitung
In diesem Lab wird Google Colaboratory verwendet. Sie müssen nichts einrichten. Colaboratory ist eine Online-Notebook-Plattform für Bildungszwecke. Es bietet kostenloses CPU-, GPU- und TPU-Training.

Sie können dieses Beispiel-Notebook öffnen und einige Zellen durchlaufen, um sich mit Colaboratory vertraut zu machen.
TPU-Backend auswählen

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

Führen Sie die Zellen einzeln aus, indem Sie auf eine Zelle klicken und UMSCHALTTASTE + EINGABETASTE drücken. Sie können das gesamte Notebook auch mit Laufzeit > Alle ausführen ausführen.
Inhaltsverzeichnis

Alle Notebooks haben ein Inhaltsverzeichnis. Sie können sie über den schwarzen Pfeil auf der linken Seite öffnen.
Ausgeblendete Zellen

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, aber das ist in der Regel nicht sehr interessant. Sie unterstützen in der Regel Support- oder Visualisierungsfunktionen. Sie müssen diese Zellen weiterhin ausführen, damit die Funktionen darin definiert werden.
Authentifizierung

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 mit neuronalem Netzwerk – Einführung
Kurz zusammengefasst
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, sind Sie hier genau richtig.
Für Modelle, die als Folge von Layern erstellt wurden, bietet Keras die Sequential API. Ein Bildklassifikator mit drei dichten Layern kann 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, ... )

Dichtes neuronales Netzwerk
Dies ist das einfachste neuronale Netzwerk für die Klassifizierung von Bildern. Es besteht aus „Neuronen“, die in Schichten angeordnet sind. Die erste Ebene verarbeitet Eingabedaten und leitet die Ergebnisse an andere Ebenen weiter. Sie wird als „dicht“ bezeichnet, weil jedes Neuron mit allen Neuronen in der vorherigen Schicht verbunden ist.

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 Eingaben 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, addiert einen Wert namens „Bias“ und leitet das Ergebnis durch eine sogenannte „Aktivierungsfunktion“. Die Gewichte und der Bias sind anfangs unbekannt. Sie werden zufällig initialisiert und durch das Trainieren des neuronalen Netzwerks mit vielen bekannten Daten „gelernt“.

Die beliebteste Aktivierungsfunktion ist RELU (Rectified Linear Unit). Wie Sie im Diagramm oben sehen, ist es eine sehr einfache Funktion.
Softmax-Aktivierung
Das oben gezeigte Netzwerk endet mit einer Schicht mit 5 Neuronen, da wir Blumen in 5 Kategorien klassifizieren (Rose, Tulpe, Löwenzahn, Gänseblümchen, Sonnenblume). Neuronen in Zwischenschichten werden mit der klassischen ReLU-Aktivierungsfunktion aktiviert. In der letzten Schicht möchten wir jedoch Zahlen zwischen 0 und 1 berechnen, die die Wahrscheinlichkeit darstellen, dass es sich bei dieser Blume um eine Rose, eine Tulpe usw. handelt. Dazu verwenden wir eine Aktivierungsfunktion namens „Softmax“.
Beim Anwenden von Softmax auf einen Vektor wird von jedem Element die Exponentialfunktion gebildet 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.

Cross-Entropy Loss
Nachdem unser neuronales Netzwerk Vorhersagen aus Eingabebildern generiert, müssen wir messen, wie gut diese sind. Das heißt, wir müssen den Abstand zwischen dem, was das Netzwerk uns sagt, und den richtigen Antworten, oft als „Labels“ bezeichnet, ermitteln. Wir haben die richtigen Labels für alle Bilder im Dataset.
Jede Distanz würde funktionieren, aber für Klassifizierungsprobleme ist die sogenannte „Kreuzentropie-Distanz“ am effektivsten. Wir nennen dies unsere Fehler- oder Verlustfunktion:

Gradientenabstieg
Das „Trainieren“ des neuronalen Netzes bedeutet, dass Trainingsbilder und ‑labels verwendet werden, um Gewichte und Bias so anzupassen, dass die Cross-Entropy-Verlustfunktion minimiert wird. So funktioniert es:
Die Kreuzentropie ist eine Funktion von Gewichten, Bias, Pixeln des Trainingsbilds und seiner bekannten Klasse.
Wenn wir die partiellen Ableitungen der Kreuzentropie in Bezug auf alle Gewichte und alle Bias berechnen, erhalten wir einen „Gradienten“, der für ein bestimmtes Bild, Label und den aktuellen Wert der Gewichte und Bias berechnet wird. Da es Millionen von Gewichten und Bias geben kann, ist die Berechnung des Gradienten sehr aufwendig. Glücklicherweise erledigt TensorFlow das für uns. Die mathematische Eigenschaft eines Gradienten ist, dass er „nach oben“ zeigt. Da wir dorthin gehen möchten, wo die Kreuzentropie niedrig ist, gehen wir in die entgegengesetzte Richtung. Wir aktualisieren Gewichte und Bias um einen Bruchteil des Gradienten. Das wiederholen wir dann immer wieder mit den nächsten Batches von Trainingsbildern und ‑Labels in einer Trainingsschleife. Im Idealfall konvergiert dies zu einem Punkt, an dem die Kreuzentropie minimal ist. Es gibt jedoch keine Garantie dafür, dass dieses Minimum eindeutig ist.

Mini-Batching und Momentum
Sie können den Gradienten für nur ein Beispielbild berechnen und die Gewichte und Bias sofort aktualisieren. Wenn Sie dies jedoch für einen Batch von z. B. 128 Bildern tun, erhalten Sie einen Gradienten, der die Einschränkungen durch verschiedene Beispielbilder besser repräsentiert und daher wahrscheinlich schneller zur Lösung konvergiert. Die Größe des Mini-Batch ist ein anpassbarer Parameter.
Diese Technik, die manchmal auch als „stochastic gradient descent“ (stochastischer Gradientenabstieg) bezeichnet wird, hat einen weiteren, pragmatischeren Vorteil: Die Arbeit mit Batches bedeutet auch die Arbeit mit größeren Matrizen, die sich in der Regel leichter auf GPUs und TPUs optimieren lassen.
Die Konvergenz kann jedoch immer noch etwas chaotisch sein und sogar stoppen, wenn der Gradientenvektor nur Nullen enthält. Bedeutet das, dass wir ein Minimum gefunden haben? Nimmt immer. Eine Gradientenkomponente kann an einem Minimum oder Maximum null sein. Bei einem Gradientenvektor mit Millionen von Elementen ist die Wahrscheinlichkeit, dass alle Nullen einem Minimum und keine einem Maximum entsprechen, ziemlich gering. In einem Raum mit vielen Dimensionen sind Sattelpunkte ziemlich häufig und wir möchten nicht an ihnen anhalten.

Abbildung: Sattelpunkt. Der Gradient ist 0, aber es handelt sich nicht in allen Richtungen um ein Minimum. (Bildnachweis: Wikimedia: Von Nicoguaro – Eigene Arbeit, CC BY 3.0)
Die Lösung besteht darin, dem Optimierungsalgorithmus etwas Schwung zu verleihen, damit er Sattelpunkte passieren kann, ohne anzuhalten.
Glossar
Batch oder Mini-Batch: Das Training erfolgt immer mit Batches von Trainingsdaten und Labels. Das hilft dem Algorithmus, zu 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).
Kreuzentropie-Verlust: Eine spezielle Verlustfunktion, die häufig in Klassifizierern verwendet wird.
Dense Layer (dichte Schicht): Eine Schicht von Neuronen, in der jedes Neuron mit allen Neuronen in der vorherigen Schicht verbunden ist.
Features: Die Eingaben eines neuronalen Netzwerks werden manchmal als „Features“ bezeichnet. Die Kunst, herauszufinden, welche Teile eines Datensatzes (oder Kombinationen von Teilen) in ein neuronales Netzwerk eingegeben 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 Neuronen-Schicht, bevor die Aktivierungsfunktion angewendet wird, werden als „Logits“ bezeichnet. Der Begriff stammt von der „logistischen Funktion“ bzw. „Sigmoid-Funktion“, die früher die beliebteste Aktivierungsfunktion war. „Neuron outputs before logistic function“ (Neuronenausgaben vor logistischer Funktion) wurde zu „Logits“ verkürzt.
loss: Die Fehlerfunktion, mit der die Ausgaben des neuronalen Netzwerks mit den richtigen Antworten verglichen werden.
Neuron: Berechnet die gewichtete Summe seiner Eingaben, fügt einen Bias hinzu und leitet das Ergebnis durch eine Aktivierungsfunktion.
One-Hot-Codierung: Die Klasse 3 von 5 wird als Vektor mit 5 Elementen codiert, die alle null sind, mit Ausnahme des dritten Elements, das 1 ist.
relu: Rektifizierte Lineareinheit. 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 angewendet wird, den Unterschied zwischen der größten Komponente und allen anderen erhöht und den Vektor so normalisiert, dass die Summe 1 ergibt. So kann er als Vektor von Wahrscheinlichkeiten interpretiert werden. Wird als letzter Schritt in Klassifikatoren verwendet.
Tensor: Ein Tensor ist wie eine Matrix, aber mit einer beliebigen Anzahl von Dimensionen. Ein eindimensionaler Tensor ist ein Vektor. Ein 2-dimensionaler Tensor ist eine Matrix. Dann können Sie Tensoren mit 3, 4, 5 oder mehr Dimensionen haben.
4. Lerntransfer
Für ein Bildklassifizierungsproblem reichen dichte Ebenen wahrscheinlich nicht aus. Wir müssen etwas über Convolutional Layers und die vielen Möglichkeiten lernen, sie anzuordnen.
Wir können aber auch eine Abkürzung nehmen. Es sind vollständig trainierte Convolutional Neural Networks zum Herunterladen verfügbar. Es ist möglich, die letzte Ebene, den Softmax-Klassifikationskopf, zu entfernen und durch eine eigene zu ersetzen. Alle trainierten Gewichte und Bias bleiben unverändert. Sie trainieren nur die Softmax-Schicht neu, die Sie hinzufügen. Diese Technik wird als Transfer Learning bezeichnet und funktioniert erstaunlicherweise, solange das Dataset, mit dem das neuronale Netzwerk vortrainiert wird, „nah genug“ an Ihrem Dataset ist.
Praxisorientiert
Ö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.
Keras Flowers transfer learning (playground).ipynb
Weitere Informationen
Beim Transfer Learning profitieren Sie sowohl von fortschrittlichen Architekturen für Convolutional Neural Networks, die von Spitzenforschern entwickelt wurden, als auch vom Vortraining mit einem riesigen Dataset von Bildern. In unserem Fall werden wir das Transfer Learning von einem Netzwerk ausführen, das auf ImageNet trainiert wurde. ImageNet ist eine Bilddatenbank, die viele Pflanzen und Außenszenen enthält, was für Blumen ausreichend ist.

Abbildung: Ein komplexes, bereits trainiertes faltendes neuronales Netzwerk wird als Blackbox verwendet und nur der Klassifikations-Head wird neu trainiert. Das ist Lerntransfer. Wie diese komplizierten Anordnungen von Faltungsebenen funktionieren, sehen wir uns später an. Im Moment ist es das Problem eines anderen.
Lerntransfer in Keras
In Keras können Sie ein vortrainiertes Modell aus der tf.keras.applications.*-Sammlung instanziieren. MobileNet V2 ist beispielsweise eine sehr gute Faltungsarchitektur, die eine angemessene Größe hat. Wenn Sie include_top=False auswählen, erhalten Sie das vortrainierte Modell ohne die letzte Softmax-Schicht, 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-Schicht trainieren. Dazu sind in der Regel relativ wenige Gewichte erforderlich und es kann schnell und ohne sehr großen Datensatz erfolgen. Wenn Sie jedoch viele Daten haben, kann Transfer Learning mit pretrained_model.trainable = True noch besser funktionieren. Die vortrainierten Gewichte liefern dann hervorragende Anfangswerte und können durch das Training noch angepasst werden, um besser zu Ihrem Problem zu passen.
Beachten Sie schließlich die Flatten()-Ebene, die vor Ihrer dichten Softmax-Ebene eingefügt wurde. Dichte Ebenen arbeiten mit flachen Datenvektoren, aber wir wissen nicht, ob das vortrainierte Modell diese zurückgibt. Deshalb müssen wir die Hierarchie vereinfachen. Im nächsten Kapitel, in dem wir uns mit faltenden Architekturen befassen, erklären wir das von faltenden Layern zurückgegebene Datenformat.
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.
Keras Flowers transfer learning (solution).ipynb
Behandelte Themen
- 🤔 Klassifikator in Keras schreiben
- 🤓 mit einer Softmax-Ausgabeschicht und Cross-Entropy-Verlust konfiguriert
- 😈 Lerntransfer
- 🤔 Erstes Modell trainieren
- 🧐 Verlust und Genauigkeit während des Trainings beobachten
Bitte gehen Sie diese Checkliste kurz durch.
5. Glückwunsch!
Sie können jetzt ein Keras-Modell erstellen. Im nächsten Lab erfahren Sie, wie Sie Convolutional Layers zusammenstellen.
- Datenpipelines mit TPU-Geschwindigkeit: tf.data.Dataset und TFRecords
- [DIESES LAB] Ihr erstes Keras-Modell mit Transfer Learning
- Convolutional Neural Networks mit Keras und TPUs
- Moderne ConvNets, SqueezeNets, Xception, mit Keras und TPUs
TPUs in der Praxis
TPUs und GPUs sind in Cloud AI Platform verfügbar:
- Auf Deep-Learning-VMs
- In AI Platform Notebooks
- In AI Platform Training-Jobs
Und schließlich freuen wir uns über Feedback. Bitte teilen Sie uns mit, wenn Sie in diesem Lab etwas Ungewöhnliches feststellen oder wenn Sie der Meinung sind, dass es verbessert werden sollte. Feedback kann über GitHub-Probleme [ Feedback-Link] gegeben werden.

|

