TensorFlow, Keras und Deep Learning, ohne Promotion

In diesem Codelab lernen Sie, wie Sie ein neuronales Netzwerk erstellen und trainieren, das handschriftliche Ziffern erkennt. Während Sie Ihr neuronales Netzwerk optimieren, um eine Genauigkeit von 99% zu erreichen, lernen Sie auch die Tools kennen, die Deep-Learning-Experten für das effiziente Trainieren ihrer Modelle verwenden.

In diesem Codelab wird das MNIST-Dataset verwendet. Es ist eine Sammlung von 60.000 Kennzeichnungen, die Generationen von PhDs seit fast 20 Jahren zur Verfügung stellen. Das Problem wird mit weniger als 100 Zeilen von Python / TensorFlow-Code gelöst.

Lerninhalte

  • Was ist ein neuronales Netzwerk und wie funktioniert es?
  • Einfaches neuronales Netzwerk mit tf.keras erstellen
  • Weitere Ebenen hinzufügen
  • Zeitplan für die Lernrate einrichten
  • So erstellen Sie konvolutionale neuronale Netzwerke
  • So wenden Sie Techniken zur Normalisierung an: Drop-down, Batchnormalisierung
  • Was bedeutet „Überanpassung“

Voraussetzungen

Nur ein Browser. Dieser Workshop kann vollständig mit Google Colaboratory ausgeführt werden.

Feedback

Bitte teilen Sie uns mit, ob in diesem Lab etwas fehlt oder Sie Verbesserungsbedarf haben. Feedback zu GitHub-Problemen wird verarbeitet [feedback link].

In diesem Lab verwenden Sie Google Colaboratory und müssen nichts weiter einrichten. Er kann auf einem Chromebook ausgeführt werden. Öffnen Sie die Datei unten und führen Sie die Zellen aus, um sich mit Colab-Notebooks vertraut zu machen.

Welcome to Colab.ipynb

Weitere Informationen:

GPU-Back-End auswählen

Wählen Sie im Colab-Menü Laufzeit > Laufzeittyp ändern und dann „GPU“ aus. Die Verbindung zur Laufzeit erfolgt automatisch bei der ersten Ausführung oder Sie verwenden die Schaltfläche „Verbinden“ rechts oben.

Notebook-Ausführung

Führen Sie Zellen nacheinander durch Klicken auf eine Zelle aus und verwenden Sie die Umschalttaste + Eingabetaste. Sie können auch das gesamte Notebook mit Laufzeit > Ausführen aller ausführen.

Inhaltsverzeichnis

Alle Notebooks haben ein Inhaltsverzeichnis. Öffnen Sie sie über den schwarzen Pfeil links.

Ausgeblendete Zellen

Bei einigen Zellen wird nur der Titel angezeigt. Dies ist eine Colab-spezifische Notebook-Funktion. Sie können darauf doppelklicken, um den Code darin aufzurufen. Aber das ist normalerweise nicht sehr interessant. In der Regel werden Unterstützung oder Visualisierungsfunktionen unterstützt. Sie müssen diese Zellen noch ausführen, damit die Funktionen darin definiert werden können.

Zuerst schauen wir uns einen neuronalen Netzwerkzug an. Öffnen Sie das Notebook unten und sehen Sie sich die Zellen an. Beachten Sie den Code noch nicht. Wir werden später mit der Erläuterung beginnen.

keras_01_mnist.ipynb

Achten Sie beim Ausführen des Notebooks auf die Visualisierungen. Weitere Informationen finden Sie unten.

Trainingsdaten

Wir haben einen Datensatz mit handgeschriebenen Ziffern, die mit Labels versehen sind. So wissen wir, was die einzelnen Bilder darstellen, also eine Zahl zwischen 0 und 9. Im Notebook sehen Sie einen Auszug:

Das neuronale Netzwerk, das wir erstellen, klassifiziert die handgeschriebenen Ziffern in seinen zehn Klassen (0, ., 9). Das funktioniert auf interner Parameter, die einen korrekten Wert haben müssen, damit die Klassifizierung gut funktioniert. Dieser richtige Wert wird durch einen Trainingsprozess lernt, für den ein „Dataset mit Label“ mit Bildern und den zugehörigen richtigen Antworten erforderlich ist.

Wie können wir feststellen, ob das trainierte neuronale Netzwerk eine gute Leistung hat? Wenn Sie das Netzwerk verwenden, um das Netzwerk zu testen, können Sie Es hat bereits festgestellt, dass dieser Datensatz während des Trainings mehrmals erfolgreich ist und mit großer Wahrscheinlichkeit sehr leistungsfähig ist. Wir benötigen einen weiteren, mit Labels versehenen Datenpool, der während des Trainings nie erkannt wurde, um die Leistung des Netzwerks in der realen Welt zu beurteilen. Er wird als Validierungs-Dataset bezeichnet.

Schulungen

Während des Trainings werden die Batch-Trainingsdaten immer weiter aktualisiert. Interne Modellparameter werden automatisch aktualisiert, sodass die handschriftlichen Ziffern immer besser werden. Das sehen Sie in der Trainingsgrafik:

Rechts stellt „Genauigkeit“ die Prozentzahl richtig erkannter Ziffern dar. Im Laufe der Trainingsphase erhöht sich der Trainingsfortschritt.

Links sehen Sie den "loss". Für das Training definieren wir eine „&lost“-Funktion, die angibt, wie stark das System die Ziffern erkennt, und versuchen, diese zu minimieren. Sie sehen hier, dass der Verlust sowohl beim Trainings- als auch bei den Validierungsdaten beim Fortschritt des Trainings nachlässt. Das ist gut. Es bedeutet, dass das neuronale Netzwerk lernt.

Die X-Achse stellt die Anzahl der Epochen und Iterationen durch das gesamte Dataset dar.

Vorhersagen

Wenn das Modell trainiert wird, können wir damit handschriftliche Ziffern erkennen. In der nächsten Visualisierung sehen Sie die Leistung Ihrer Anzeige bei einigen Ziffern aus lokalen Schriftarten (erste Zeile) und bei den 10.000 Ziffern des Validierungs-Datasets. Die vorhergesagte Klasse wird unter jeder Ziffer in Rot angezeigt, wenn sie falsch war.

Wie Sie sehen können, ist dieses erste Modell nicht sehr gut, aber einige Ziffern werden trotzdem richtig erkannt. Die endgültige Validierungsgenauigkeit liegt bei 90 %, was für das vereinfachte Modell, mit dem wir beginnen, nicht so schlecht ist. Trotzdem fehlen jedoch 1.000 Validierungsquoten von den 10.000. Das ist viel mehr, was angezeigt werden kann. Deshalb sieht es so aus, als wären alle Antworten falsch (rot).

Tensor-

Daten werden in Matrizes gespeichert. Ein graues Bild mit 28 x 28 Pixeln passt in eine zweidimensionale Matrix im Format 28 x 28. Für ein Farbbild benötigen wir jedoch mehr Abmessungen. Pro Pixel gibt es drei Farbwerte (Rot, Grün, Blau). Eine dreidimensionale Tabelle wird daher mit den Abmessungen [28, 28, 3] benötigt. Und zum Speichern eines Batches von 128 Farbbildern ist eine vierdimensionale Tabelle mit den Abmessungen [128, 28, 28, 3] erforderlich.

Diese mehrdimensionalen Tabellen heißen "tensors" und die Liste ihrer Abmessungen ist ihre "shape"-Tabelle.

Zusammenfassung

Wenn Sie bereits alle Begriffe in Fettschrift des nächsten Absatzes kennen, können Sie mit dem nächsten Training fortfahren. Falls Sie noch keine Erfahrung mit Deep Learning haben, sind Sie hier willkommen.

Hexe

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

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[28, 28, 1]),
    tf.keras.layers.Dense(200, activation="relu"),
    tf.keras.layers.Dense(60, activation="relu"),
    tf.keras.layers.Dense(10, activation='softmax') # classifying into 10 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, ... )

Eine einzelne dichte Ebene

Handgeschriebene Ziffern im MNIST-Dataset sind graue Bilder mit 28 x 28 Pixeln. Der einfachste Ansatz für die Klassifizierung ist die Verwendung von 28 x 28 × 784 Pixeln als Eingaben für ein neuronales Netzwerk mit 1 Schicht.

Screenshot 26.07.2016 um 12.32.24.png

Jedes &n Neuron in einem neuronalen Netzwerk führt eine gewichtete Summe aller Eingaben durch, addiert eine Konstante mit der Bezeichnung &bias" und gibt das Ergebnis dann über eine nicht lineare "activation-Funktion& ab. Die Parameter "weights" und &biases" sind Parameter, die durch das Training bestimmt werden. Zuerst werden sie mit Zufallswerten initialisiert.

Das Bild oben zeigt ein neuronales Netzwerk mit 1 Schicht, das 10 Ausgabe-Neuronen umfasst, da wir Ziffern in 10 Klassen klassifizieren möchten (0 bis 9).

Mit einer Matrixmultiplikation

Hier sehen Sie, wie eine neuronale Netzwerkschicht, die eine Sammlung von Bildern verarbeitet, durch eine Matrixmultiplikation dargestellt werden kann:

matmul.gif

Mit der ersten Spalte der Gewichtungen in der Gewichtungsmatrix W berechnen wir die gewichtete Summe aller Pixel des ersten Bilds. Das entspricht dem ersten Neuron. Mit der zweiten Gewichtung von Gewichten tun wir dasselbe für das zweite Neuron und so weiter bis zum zehnten Neuron. Wir können dann den Vorgang für die verbleibenden 99 Bilder wiederholen. Wenn wir X die Matrix aufrufen, die unsere 100 Bilder enthält, sind alle gewichteten Summen für unsere 10 Neuronen, berechnet auf 100 Bilder, einfach X.W, eine Matrixmultiplikation.

Jedes Neuron muss jetzt seine Verzerrung (eine Konstante) hinzufügen. Da wir zehn Neuronen haben, gibt es zehn Verzerrungskonstanten. Wir nennen diesen Vektor mit 10 Werten (b). Sie muss in jede Zeile der zuvor berechneten Matrix eingefügt werden. Mit ein bisschen Magie und sogenannten Casting haben wir hier ein einfaches Pluszeichen.

Schließlich aktivieren wir eine Aktivierungsfunktion, z. B. „softmax“ (siehe unten), und wir rufen die Formel ab, die ein neuronales Netzwerk mit 1 Ebene beschreibt, das auf 100 Bilder angewendet wird:

Screenshot 26.07.2016 um 16.02.36.png

In Keras

Bei allgemeinen neuronalen Netzwerkbibliotheken wie Keras müssen wir diese Formel nicht implementieren. Es ist jedoch wichtig zu verstehen, dass eine neuronale Netzwerkschicht nur eine Reihe von Multiplikationen und Additionen umfasst. In Keras würde diese Dichte folgendermaßen aussehen:

tf.keras.layers.Dense(10, activation='softmax')

Tiefe

Es ist einfach, neuronale Netzwerkebenen zu verketten. In der ersten Ebene werden gewichtete Summen von Pixeln berechnet. In nachfolgenden Ebenen werden gewichtete Summen der Ausgaben der vorherigen Ebenen berechnet.

Der einzige Unterschied bei der Auswahl der Aktivierungsfunktion ist, abgesehen von der Anzahl der Neuronen.

Aktivierungsfunktionen: Relu, Softmax und Sigmoid

In der Regel würden Sie die Aktivierungsfunktion für alle Ebenen bis auf die letzte verwenden. Die letzte Ebene in einem Klassifikator würde die Aktivierung von Softmax verwenden.

Auch hier berechnet „&ron“ eine gewichtete Summe aller Eingaben. Addiert einen Wert namens „Verzerrung“ und gibt das Ergebnis über die Aktivierungsfunktion ein.

Die häufigste Aktivierungsfunktion ist &quot Das ist eine sehr einfache Funktion, die im Diagramm oben zu sehen ist.

Die herkömmliche Aktivierungsfunktion in neuronalen Netzwerken war in diesem Fall der Sigmoid.

Softmax-Aktivierung für die Klassifizierung

Die letzte Schicht unseres neuronalen Netzwerks enthält 10 Neuronen, weil wir handschriftliche Ziffern in 10 Klassen (0, 9) unterteilen möchten. Es sollten zehn Zahlen zwischen 0 und 1 ausgegeben werden, die die Wahrscheinlichkeit darstellen, dass diese Ziffer eine 0, eine 1, eine 2 usw. ist. Dazu verwenden wir auf der letzten Ebene die Aktivierungsfunktion "softmax".

Softmax wird auf einen Vektor angewendet, indem die Exponentialzahl jedes Elements verwendet und dann der Vektor normalisiert wird. In der Regel wird dieser Faktor durch seine L1-Norm (Summe der absoluten Werte) geteilt, sodass die normalisierten Werte zu 1 addiert werden und als Wahrscheinlichkeiten interpretiert werden können.

Die Ausgabe der letzten Ebene vor der Aktivierung wird manchmal auch als "logits" bezeichnet. Wenn für diesen Vektor L = [L0, L1, L2, L3, L4, L5, L6, L7, L8, L9] und dann:

Kreuzentropieverlust

Da unser neuronales Netzwerk Vorhersagen aus Eingabebildern erzeugt, müssen wir messen, wie gut sie sind – also die Entfernung zwischen dem, was das Netzwerk sagt, und den richtigen Antworten (oft auch als „Labels“ bezeichnet). Denken Sie daran, dass wir für alle Bilder im Datensatz die richtigen Labels haben.

Alle Entfernungen würden funktionieren, für Klassifizierungsprobleme ist die sogenannte Kreuzentropie jedoch die effektivste Entfernung. Wir nennen diesen Fehler oder „Fehler“:

Gradientenabstieg

Im neuronalen Netzwerk werden Trainingsbilder und -labels zur Anpassung von Gewichtungen und Verzerrungen verwendet, um die Kreuzentropie-Verlustfunktion zu minimieren. So funktionierts.

Die Kreuzentropie ist eine Funktion von Gewichtungen, Verzerrungen, Pixeln des Trainingsbilds und seiner bekannten Klasse.

Wenn wir die Teilableitungen der Kreuzentropie relativ zu allen Gewichtungen und allen Verzerrungen berechnen, erhalten wir einen Übergangsgrad, der für ein bestimmtes Bild, Label und den aktuellen Wert von Gewichtungen und Verzerrungen berechnet wird. Denken Sie daran, dass wir Millionen von Gewichtungen und Verzerrungen haben können, sodass die Berechnung des Farbverlaufs viel Arbeit kostet. Glücklicherweise macht TensorFlow das für uns. Die mathematische Property eines Farbverlaufs besteht darin, dass er auf &upt oben verweist. Da wir sich mit einer geringen Kreuzentropie auseinandersetzen möchten, gehen wir in die entgegengesetzte Richtung. Gewichtungen und Verzerrungen werden nach Anteilen des Farbverlaufs aktualisiert. Wir wiederholen diesen Vorgang mit den nächsten Batch-Trainingsbildern und -Labels in einer Trainingsschleife. Wir hoffen, dass sich dieser Punkt an einer Stelle annähert, an der die Kreuzentropie nur minimal ist, aber kein Mindestwert garantiert.

Farbverlauf descent2.png

Batchverarbeitung und Dynamik in Miniversion

Sie können den Farbverlauf nur für ein Beispielbild berechnen und die Gewichtungen und Verzerrungen sofort aktualisieren. Wenn Sie dies jedoch bei einem Batch von beispielsweise 128 Bildern tun, erhält der Verlauf einen Farbverlauf, der die Beschränkungen der verschiedenen Beispielbilder besser darstellt und daher wahrscheinlich schneller zu der Lösung konvergiert. Die Größe des Mini-Batches ist ein anpassbarer Parameter.

Diese Technik, die manchmal als stochastischer Gradientenabstieg bezeichnet wird, hat einen weiteren, pragmatischen Vorteil: Wenn man mit Batches arbeitet, bedeutet das auch die Arbeit mit größeren Matrizes und diese sind in der Regel einfacher für GPUs und TPUs zu optimieren.

Die Konvergenz kann jedoch etwas chaotisch sein und sogar aufhören, wenn der Farbverlaufsvektor null ist. Gibt es damit ein Minimum? Nimmt immer. Eine Farbverlaufskomponente kann bei einem Minimum oder Höchstwert null sein. Wenn ein Farbverlaufsvektor mit Millionen von Elementen alle Nullen sind, entspricht die Wahrscheinlichkeit, dass jede Null einem Minimum entspricht, und keiner davon einem maximalen Punkt. In einem Raum mit vielen Abmessungen sind Sattelpunkte ziemlich häufig und wir möchten nicht bei ihnen anhalten.

Abbildung: Sattelpunkt. Der Farbverlauf lautet 0, es ist aber nicht in allen Richtungen ein Minimum. (Namensnennte Attribution Wikimedia: Von Nicoguaro – Eigene Arbeit, CC BY 3,0)

Die Lösung besteht darin, dem Optimierungsalgorithmus eine gewisse Dynamik hinzuzufügen, damit er ohne Satterei über die Sattelpunkte hinausgehen kann.

Glossar

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

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

Dichte: eine Schicht von Neuronen, bei der jedes Neuron mit allen Neuronen in der vorherigen Schicht verbunden ist.

Funktionen: Die Eingaben eines neuronalen Netzwerks werden manchmal als "features" bezeichnet. Die Bestimmung der Teile eines Datenbestands (oder Kombinationen von Teilen) in ein neuronales Netzwerk, die gute Vorhersagen erhalten, wird als „Feature Engineering“ bezeichnet.

labels: ein anderer Name für &classes; oder korrekte Antworten in einem beaufsichtigten Klassifizierungsproblem

Lernrate: Anteil des Gradienten, um den Gewichtungen und Verzerrungen bei jeder Iteration der Trainingsschleife aktualisiert werden.

Logits: Die Ausgaben einer Schicht von Neuronen, bevor die Aktivierungsfunktion angewendet wird, werden als „logits&logt“ bezeichnet. Der Begriff stammt von der logistischen Funktion und war die beliebteste Aktivierungsfunktion. Neuron-Ausgaben vor der Logistikfunktion wurden auf „Logiere“ gekürzt.

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

neuron: Berechnet die gewichtete Summe der Eingaben. Addiert eine Verzerrung und gibt das Ergebnis über eine Aktivierungsfunktion ein.

One-Hot-Codierung: Klasse 3 von 5 ist als Vektor von 5 Elementen codiert, alle Nullen außer der dritten, 1.

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

sigmoid: Eine weitere Aktivierungsfunktion, die beliebt war und in Sonderfällen noch nützlich ist.

softmax: eine spezielle Aktivierungsfunktion, die für einen Vektor arbeitet, den Unterschied zwischen der größten Komponente und allen anderen erhöht und die Summe des Vektors normalisiert, damit dieser als Vektor für die Wahrscheinlichkeit interpretiert wird. Wird als letzter Schritt in Klassifikatoren verwendet.

tensor ist ein Tensor & ist wie eine Matrix, aber mit einer beliebigen Anzahl von Dimensionen. Ein eindimensionaler Tensor ist ein Vektor. Ein Tensor mit zwei Dimensionen ist eine Matrix. Dann können Sie Tensoren mit 3, 4, 5 oder mehr Dimensionen haben.

Kehren Sie zum Notizbuch zurück und lassen Sie uns den Code lesen.

keras_01_mnist.ipynb

Gehen Sie alle Zellen in diesem Notebook durch.

Zellen

Hier sind die Batchgröße, die Anzahl der Trainingsphasen und der Speicherort der Datendateien definiert. Datendateien werden in einem GCS-Bucket (Google Cloud Storage) gehostet, weshalb ihre Adresse mit gs:// beginnt

Zelle; Importe"

Alle erforderlichen Python-Bibliotheken werden hier importiert, einschließlich TensorFlow und matplotlib für Visualisierungen.

Zelle: Visualisierungs-Dienstprogramme [RUN ME]"

Diese Zelle enthält uninteressanten Visualisierungscode. Sie ist standardmäßig minimiert, Sie können sie jedoch öffnen und sich den Code ansehen, wenn Sie Zeit haben.

Zelle tf.data.Dataset: Dateien parsen und Trainings- und Validierungs-Datasets vorbereiten"

In dieser Zelle wurde die tf.data.Dataset API verwendet, um das MNIST-Dataset aus den Datendateien zu laden. Sie müssen nicht zu viel Zeit in dieser Zelle verbringen. Wenn Sie an der tf.data.Dataset API interessiert sind, finden Sie in dieser Anleitung die Anleitung: TPU-Geschwindigkeitspipelines. Grundlegende Informationen:

Bilder und Labels (die richtigen Antworten) aus dem MNIST-Dataset werden in Datensätzen mit fester Länge in vier Dateien gespeichert. Die Dateien können mit der entsprechenden Funktion für feste Datensätze geladen werden:

imagedataset = tf.data.FixedLengthRecordDataset(image_filename, 28*28, header_bytes=16)

Wir haben jetzt ein Dataset mit Bildbytes. Sie müssen in Bilder decodiert werden. Dafür definieren wir eine Funktion. Das Image wird nicht komprimiert, sodass die Funktion nichts entschlüsseln muss (decode_raw tut im Grunde nichts). Das Bild wird dann in Gleitkommawerte zwischen 0 und 1 konvertiert. Wir können es hier als 2D-Bild umformen, aber wir speichern es als flaches Array von Pixeln der Größe 28*28, weil das unsere erwartete hohe Dichte ist.

def read_image(tf_bytestring):
    image = tf.decode_raw(tf_bytestring, tf.uint8)
    image = tf.cast(image, tf.float32)/256.0
    image = tf.reshape(image, [28*28])
    return image

Wir wenden diese Funktion auf das Dataset mit .map an und rufen ein Dataset mit Bildern ab:

imagedataset = imagedataset.map(read_image, num_parallel_calls=16)

Wir lesen die gleichen Arten von Labels und decodieren sie auch zusammen und wir kombinieren .zip Bilder und Labels:

dataset = tf.data.Dataset.zip((imagedataset, labelsdataset))

Es gibt einen Datensatz (Bild, Label). Und genau das erwartet unser Modell. Wir sind noch nicht bereit, sie in der Trainingsfunktion zu verwenden:

dataset = dataset.cache()
dataset = dataset.shuffle(5000, reshuffle_each_iteration=True)
dataset = dataset.repeat()
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

Die tf.data.Dataset API hat alle erforderlichen Dienstfunktionen zur Vorbereitung von Datasets:

.cache speichert das Dataset im RAM. Dies ist ein winziges Dataset, das funktioniert. .shuffle gibt einen Zufallsmix mit einem Puffer von 5.000 Elementen ab. Es ist wichtig, dass die Trainingsdaten genau angeordnet sind. .repeat leitet das Dataset als Schleife ab. Wir werden sie mehrfach aktualisieren (mehrere Epochen). .batch fasst mehrere Bilder und Labels in einer Miniliste zusammen. Schließlich kann .prefetch die CPU verwenden, um den nächsten Batch vorzubereiten, während der aktuelle Batch auf der GPU trainiert wird.

Das Validierungs-Dataset wird auf ähnliche Weise vorbereitet. Jetzt können Sie ein Modell definieren und dieses Dataset zum Trainieren verwenden.

Zellenmodell

Alle unsere Modelle sind gerade Reihen von Ebenen, sodass wir sie mit dem Stil tf.keras.Sequential erstellen können. Anfangs ist das eine dichte Schicht. Es hat zehn Neuronen, da wir handschriftliche Ziffern in zehn Klassen einteilen. Es wird die Aktivierung von Softmax verwendet, da es die letzte Ebene in einem Klassifikator ist.

Ein Keras-Modell muss auch die Form der Eingaben kennen. Mit tf.keras.layers.Input kann sie definiert werden. Hier werden Eingabevektoren Flachvektoren von Pixelwerten mit der Länge 28 x 28.

model = tf.keras.Sequential(
  [
    tf.keras.layers.Input(shape=(28*28,)),
    tf.keras.layers.Dense(10, activation='softmax')
  ])

model.compile(optimizer='sgd',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# print model layers
model.summary()

# utility callback that displays training curves
plot_training = PlotTraining(sample_rate=10, zoom=1)

Das Modell wird in Keras mit der Funktion model.compile konfiguriert. Hier verwenden wir den einfachen Optimierer 'sgd' (Stochastic Gradient Descent). Für ein Klassifizierungsmodell ist eine Kreuzentropie-Verlustfunktion erforderlich, die in Keras mit dem Namen 'categorical_crossentropy' bezeichnet wird. Zum Schluss bitten wir das Modell, den Messwert 'accuracy' zu berechnen. Das ist der Prozentsatz der richtig klassifizierten Bilder.

Keras bietet das sehr nützliche model.summary()-Dienstprogramm, mit dem die Details des von Ihnen erstellten Modells ausgegeben werden. Ihre Artlehrer hat das Dienstprogramm PlotTraining hinzugefügt (in der Zelle „&visualisierung“ definiert), das während des Trainings verschiedene Trainingskurven anzeigt.

Zelle; Modell trainieren und validieren

Hier wird das Training durch Aufrufen von model.fit ausgeführt und sowohl das Trainings- als auch das Validierungs-Dataset wird übergeben. Standardmäßig führt Keras am Ende jeder Epoche eine Validierungsrunde durch.

model.fit(training_dataset, steps_per_epoch=steps_per_epoch, epochs=EPOCHS,
          validation_data=validation_dataset, validation_steps=1,
          callbacks=[plot_training])

In Keras ist es möglich, während des Trainings benutzerdefinierte Verhaltensweisen mithilfe von Callbacks hinzuzufügen. So wurde das dynamisch aktualisierte Trainingsdiagramm für diesen Workshop implementiert.

Zelle & Prognosen

Sobald das Modell trainiert wird, können wir Vorhersagen durch Aufrufen von model.predict() abrufen:

probabilities = model.predict(font_digits, steps=1)
predicted_labels = np.argmax(probabilities, axis=1)

Hier haben wir eine Reihe von gedruckten Ziffern vorbereitet, die aus lokalen Schriftarten gerendert wurden. Beachten Sie, dass das neuronale Netzwerk einen Vektor von 10 Wahrscheinlichkeiten aus seinem endgültigen Softmax-Wert zurückgibt. Um das Label zu erhalten, müssen wir herausfinden, welche Wahrscheinlichkeit am höchsten ist. np.argmax aus der Numpy-Bibliothek.

Damit Sie nachvollziehen können, warum der Parameter axis=1 benötigt wird, haben wir einen Batch von 128 Bildern verarbeitet. Das Modell gibt also 128 Vektoren mit Wahrscheinlichkeiten zurück. Die Form des Ausgabetensors ist [128, 10]. Wir berechnen den Wert für „argmax“ für die 10 Wahrscheinlichkeiten, die für jedes Bild zurückgegeben werden. Dadurch wird axis=1 – die erste Achse ist 0.

Dieses einfache Modell erkennt bereits 90% der Ziffern. Nicht schlecht, aber du wirst das jetzt deutlich verbessern.

godeep.png

Um die Erkennungsgenauigkeit zu verbessern, fügen wir dem neuronalen Netzwerk mehr Ebenen hinzu.

Screenshot 27.07.2016 um 15.36.55.png

Softmax wird als Aktivierungsfunktion auf der letzten Ebene beibehalten, da dies am besten für die Klassifizierung funktioniert. Für Zwischenschichten wird jedoch die klassischste Aktivierungsfunktion verwendet: Sigmoid:

Ihr Modell könnte z. B. so aussehen (vergessen Sie die Kommas nicht, tf.keras.Sequential verwendet eine durch Kommas getrennte Liste von Ebenen):

model = tf.keras.Sequential(
  [
      tf.keras.layers.Input(shape=(28*28,)),
      tf.keras.layers.Dense(200, activation='sigmoid'),
      tf.keras.layers.Dense(60, activation='sigmoid'),
      tf.keras.layers.Dense(10, activation='softmax')
  ])

Sehen Sie sich die „Zusammenfassung“ Ihres Modells an. Jetzt gibt es mindestens zehnmal mehr Parameter. Das sollte 10-mal besser sein. Aber aus irgendeinem Grund ist es ...

Der Verlust scheint sich auch durch das Dach zu schießen. Ein Problem ist aufgetreten.

Du hast eben schon neuronale Netzwerke kennengelernt, wie sie früher in den 80 und 90 verwendet wurden. Kein Wunder, dass sie auf diesen Vorschlag verzichteten und den sogenannten „KI-Winter“ löschten. Wenn Sie Schichten hinzufügen, sind die Konvergenz von neuronalen Netzwerken immer schwieriger.

Es stellte sich heraus, dass tiefe neuronale Netzwerke mit vielen Schichten (20, 50 und sogar 100 heute) sehr gut funktionieren können. Allerdings müssen ein paar mathematischer Schmutz angewendet werden, damit sie konvergieren. Diese einfachen Tricks sind einer der Gründe, warum wir Deep Learning in den 2010er-Jahren wieder erleben wurden.

RELU-Aktivierung

Logo: lulu.png

Die Sigmoid-Aktivierungsfunktion ist in tiefen Netzwerken ziemlich problematisch. Dabei werden alle Werte zwischen 0 und 1 zusammengefasst. Wenn Sie dies wiederholt tun, können Neuronenausgaben und ihre Gradienten vollständig verschwinden. Es wurde aus historischen Gründen erwähnt, aber moderne Netzwerke verwenden die RELU (Rectify Linear Unit), die so aussieht:

Die Relu-Seite wiederum hat eine Ableitung von 1, zumindest auf der rechten Seite. Mit der RELU-Aktivierung gilt: Selbst wenn die Gradienten von einigen Neuronen null sind, gibt es immer andere, die einen klaren Grad ungleich null haben und das Training in einem guten Tempo fortgesetzt werden kann.

Bessere Optimierung

In sehr komplexen Bereichen wie hier – hier sind 10.000 Gewichte und Verzerrungen – treten Sattelpunkte häufig auf. Dabei handelt es sich nicht um lokale Minima. Trotzdem bleiben der Farbverlauf dennoch null und der Farbverlaufsoptimierung bleibt dort erhalten. TensorFlow verfügt über ein breites Spektrum an verfügbaren Optimierungstools, darunter einige, die mit einer gewisse Trägheit arbeiten und sicher über Sattelpunkte segeln.

Zufällige Initialisierungen

Die Art der Gewichtung von Gewichtungen vor dem Training ist selbst ein Forschungsbereich, in dem zahlreiche Artikel zum Thema veröffentlicht werden. Hier finden Sie eine Übersicht über die in Keras verfügbaren Initialisierer. Glücklicherweise ist Keras standardmäßig die richtige Lösung und verwendet den Initialisierer 'glorot_uniform', der in fast allen Fällen die beste ist.

Sie müssen nichts weiter tun, da Keras schon das Richtige tut.

NaN???

Die Kreuzentropieformel umfasst einen Logarithmus und log(0) ist keine Zahl (NaN, wenn Sie möchten, ein numerischer Absturz). Kann die Eingabe für die Kreuzentropie 0 sein? Die Eingabe stammt aus Softmax. Dieser ist im Wesentlichen exponentiell und der exponentielle Wert ist nie null. Wir sind also sicher!

Wirklich nicht. In der wunderschönen Welt der Mathematik wären wir sicher, aber in der Computerwelt wäre exp(-150), dargestellt im float32-Format, so null wie möglich und die Kreuzentropie stürzt ab.

Glücklicherweise gibt es hier nichts zu tun, da Keras das kümmert und Softmax gefolgt von der Kreuzentropie berechnet, um die numerische Stabilität zu gewährleisten und die geheimnisvollen NaNs zu vermeiden.

Fertig?

Nun sollten Sie eine Genauigkeit von 97% erreichen. Das Ziel dieses Workshops ist, deutlich über 99% zu liegen. Also weitermachen.

Wenn Sie nicht mehr weiterkommen, finden Sie hier die Lösung:

keras_02_mnist_dense.ipynb

Vielleicht können wir versuchen, schneller zu trainieren? Die Standard-Lernrate im Adam-Optimierungstool ist 0,001. Versuchen wir, sie zu erhöhen.

Schneller zu sein, scheint nicht viel zu helfen, und ist das Lärm?

Die Trainingskurven sind sehr ungenau und sehen sich beide Validierungskurven an: Sie springen nach oben und unten. Das bedeutet, dass wir zu schnell gehen. Wir könnten zu unserer vorherigen Geschwindigkeit zurückkehren, aber es gibt eine bessere Möglichkeit.

langsamer.png

Die gute Lösung besteht darin, schnell zu beginnen und die Lernrate exponentiell zu verringern. In Keras ist das mit dem tf.keras.callbacks.LearningRateScheduler-Callback möglich.

Nützlicher Code zum Kopieren und Einfügen:

# lr decay function
def lr_decay(epoch):
  return 0.01 * math.pow(0.6, epoch)

# lr schedule callback
lr_decay_callback = tf.keras.callbacks.LearningRateScheduler(lr_decay, verbose=True)

# important to see what you are doing
plot_learning_rate(lr_decay, EPOCHS)

Denken Sie daran, die erstellte lr_decay_callback zu verwenden. Fügen Sie es der Liste der Callbacks in model.fit hinzu:

model.fit(...,  callbacks=[plot_training, lr_decay_callback])

Diese kleinen Änderungen haben spektakuläre Auswirkungen. Sie sehen, dass der Großteil der Geräusche beseitigt und die Testgenauigkeit kontinuierlich über 98% liegt.

Das Modell scheint jetzt konvergent zu sein. Gehen wir noch einen Schritt weiter.

Hilft es Ihnen?

Nicht wirklich, die Genauigkeit liegt noch bei 98% und berücksichtigt den Validierungsverlust. Geht weiter! Der Lernalgorithmus funktioniert nur mit Trainingsdaten und optimiert den Trainingsverlust entsprechend. Es werden keine Validierungsdaten angezeigt. Daher ist es nicht überraschend, dass die Arbeit nach einer gewissen Zeit keinen Einfluss mehr auf den Validierungsverlust hat. Dadurch wird der Rückgang abgebrochen und manchmal wird sie wieder zurückgesendet.

Dies wirkt sich nicht sofort auf die tatsächlichen Erkennungsfunktionen Ihres Modells aus, es verhindert jedoch die Ausführung vieler Iterationen. Dies ist normalerweise ein Zeichen dafür, dass das Training keine positiven Auswirkungen mehr hat.

Drop-out-PNG

Diese Verknüpfung wird normalerweise als „Überanpassung“ bezeichnet. Wenn sie angezeigt wird, können Sie versuchen, das Normalisierungsverfahren „&outt“ anzuwenden. Das Drop-down-Verfahren löst bei jeder Trainingsausführung zufällige Neuronen aus.

Hat es funktioniert?

Es kommt überraschend vor, dass ein Rauschen plötzlich auftritt. Die Validierungsverluste scheint sich nicht mehr zu verstärken, ist aber insgesamt höher als ohne Abbruch. Und die Validierungsgenauigkeit ist etwas gesunken. Das ist ein ziemlich enttäuschendes Ergebnis.

„Out-of-Display“ war nicht die richtige Lösung oder vielleicht ist die „Überanpassung“ ein komplexeres Konzept und einige ihrer Ursachen lassen sich nicht beheben.

Was bedeutet „Überanpassung“? Eine Überanpassung tritt auf, wenn ein neuronales Netzwerk „schlecht“ lernt, und zwar auf eine Art, die für die Trainingsbeispiele geeignet ist, aber nicht so gut für reale Daten. Es gibt Routinemethoden, z. B. Ausstiege, die das bessere Lernen ermöglichen, aber eine Überanpassung wirkt sich auch auf die Wurzeln aus.

Überanpassung.png

Eine einfache Überanpassung tritt auf, wenn ein neuronales Netzwerk zu viele Freiheitsgrade für das Problem hat. Stellen Sie sich vor, wir haben so viele Neuronen, dass das Netzwerk alle unsere Trainingsbilder speichern und dann anhand des Musterabgleichs erkennen kann. Bei echten Daten würde das völlig ausfallen. Ein neuronales Netzwerk muss etwas beschränkt sein, damit es während des Trainings verallgemeinern muss.

Bei sehr geringen Trainingsdaten kann auch ein kleines Netzwerk von Herzen lernen, und Sie sehen eine Überanpassung. Grundsätzlich benötigen Sie immer große Datenmengen, um neuronale Netzwerke zu trainieren.

Wenn Sie alles durch das Buch gemacht haben, mit verschiedenen Größen des Netzwerks getestet haben, um sicherzustellen, dass die Freiheitsgrade eingeschränkt sind, angewendet werden und mit vielen Daten trainiert werden, bleiben Sie möglicherweise bei einem Leistungsniveau, das sich nicht verbessern lässt. Dies bedeutet, dass Ihr neuronales Netzwerk in dieser aktuellen Form keine weiteren Informationen aus Ihren Daten extrahieren kann, wie in diesem Fall.

Erinnern Sie sich noch an die Verwendung unserer Bilder, die in einem einzigen Vektor zusammengefasst werden? Das war eine wirklich schlechte Idee. Handgeschriebene Ziffern bestehen aus Formen und wir haben die Forminformationen beim Flatten der Pixel verworfen. Es gibt jedoch eine Art neuronales Netzwerk, das Forminformationen nutzen kann: Faltungsnetzwerke. Probieren Sie sie einfach aus.

Wenn Sie nicht mehr weiterkommen, finden Sie hier die Lösung:

keras_03_mnist_dense_lrdecay_dropout.ipynb

Zusammenfassung

Wenn Sie bereits alle Begriffe in Fettschrift des nächsten Absatzes kennen, können Sie mit dem nächsten Training fortfahren. Wenn Sie noch keine Erfahrung mit konvolutionalen neuronalen Netzwerken haben, lesen Sie bitte weiter.

Convolutional.gif

Abbildung: Ein Bild mit zwei aufeinanderfolgenden Filtern filtern, die jeweils 4 x 4 x 48 Pixel mit unterschiedlichen Gewichtungen haben

So sieht ein einfaches konvolutionales neuronales Netzwerk in Keras aus:

model = tf.keras.Sequential([
    tf.keras.layers.Reshape(input_shape=(28*28,), target_shape=(28, 28, 1)),
    tf.keras.layers.Conv2D(kernel_size=3, filters=12, activation='relu'),
    tf.keras.layers.Conv2D(kernel_size=6, filters=24, strides=2, activation='relu'),
    tf.keras.layers.Conv2D(kernel_size=6, filters=32, strides=2, activation='relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(10, activation='softmax')
])

In einer Ebene eines Faltungsnetzwerks führt ein &Neuronen eine gewichtete Summe der Pixel nur über einem kleinen Bereich des Bildes aus. Sie fügt eine Verzerrung hinzu und füttert die Summe mit einer Aktivierungsfunktion, genau wie ein Neuron in einer normalen dichten Schicht. Dieser Vorgang wird dann im gesamten Bild mit denselben Gewichtungen wiederholt. Denken Sie daran, dass jedes einzelne Neuron eine dichte Gewichtung hatte. Hier werden einzelne Gewichte auf dem Bild in beide Richtungen verschoben (also „Convolution“ und „Gewicht“). Die Ausgabe hat so viele Werte wie das Pixel im Bild hat. An den Rändern muss jedoch ein Abstand hinzugefügt werden. Es handelt sich um einen Filtervorgang. In der Abbildung oben wird ein Filter mit einer Gewichtung von 4 x 4 x 3=48 verwendet.

48 Gewichte sind jedoch nicht ausreichend. Um mehr Freiheitsgrade hinzuzufügen, wiederholen wir denselben Vorgang mit einer neuen Gewichtung. Dadurch werden neue Filterausgaben erzeugt. Analog zu den R-, G- und B-Kanälen im Eingabebild wird die Funktion als Kanal bezeichnet.

Screenshot 29.07.2016 um 16.02.37.png

Die zwei (oder mehr) Gruppen von Gewichtungen können durch Hinzufügen einer neuen Dimension als ein Tensor addiert werden. Dadurch erhalten wir die generische Form des Gewichtungstensors für eine Faltungsebene. Da die Anzahl der Eingabe- und Ausgabekanäle Parameter ist, können wir mit dem Stapeln und Verketten von Faltungsschichten beginnen.

Illustration: Ein konvolutionales neuronales Netzwerk wandelt &würfel Daten in andere Würfel um.

Strolge Faltungen, max. Pooling

Durch die Erstellung der Faltungen mit einem Schritt von 2 oder 3 können wir den resultierenden Datenwürfel auch in seinen horizontalen Dimensionen verkleinern. Dafür gibt es zwei gängige Methoden:

  • Stehbare Faltung: ein gleitender Filter wie oben, aber mit einem Schritt
  • Max. Pooling: ein gleitendes Fenster, das den MAX-Vorgang anwendet (üblicherweise auf 2 × 2-Patches, wiederholt alle 2 Pixel)

Abbildung: Wenn Sie das Computing-Fenster um 3 Pixel verschieben, erhalten Sie weniger Ausgabewerte. Reflektierte Faltungen oder maximales Pooling (max. an einem 2x2-Fenster durch einen Schritt von 2) sind eine Möglichkeit, den Datenwürfel in den horizontalen Abmessungen zu verkleinern.

Die letzte Ebene

Nach der letzten Faltungsebene befinden sich die Daten in der Form eines Würfels&quot. Es gibt zwei Möglichkeiten, sie in die finale Dichte zu füttern.

Der erste Schritt besteht darin, den Würfel von Daten in einen Vektor abzuflachen und dann in die Softmax-Ebene zu füttern. Manchmal haben Sie sogar eine dichte Ebene vor der Softmax-Ebene. Dies ist in der Regel in Bezug auf die Anzahl der Gewichtungen teuer. Eine dichte Schicht am Ende eines Faltnetzwerks kann mehr als die Hälfte der Gewichtungen des gesamten neuronalen Netzwerks enthalten.

Anstatt eine teure dichte Ebene zu verwenden, können wir die eingehenden Daten auch in mehrere Teile aufteilen, indem wir Klassen erstellen, ihre Werte durchschnittlich aufschlüsseln und diese Funktionen durch eine Softmax-Aktivierungsfunktion einspeisen. Diese Methode zum Erstellen des Klassifizierungskopfs kostet 0 Gewichte. In Keras gibt es eine Ebene dafür: tf.keras.layers.GlobalAveragePooling2D().

Springen Sie zum nächsten Abschnitt, um ein faltendes Netzwerk für das vorliegende Problem zu erstellen.

Bauen Sie ein Faltnetzwerk für die Handschrifterkennung auf. Wir verwenden oben drei Faltungsschichten, unsere herkömmliche Softmax-Auslagerungsebene unten und verbinden sie mit einer vollständig verbundenen Ebene:

Beachten Sie, dass die zweite und die dritte Faltungsebene einen Streitwert von zwei haben. Das erklärt, warum sie die Anzahl der Ausgabewerte von 28x28 auf 14x14 und dann 7x7 reduzieren.

Schreiben Sie den Keras-Code.

Vor der ersten Faltungsebene ist besondere Aufmerksamkeit erforderlich. In Wirklichkeit wird ein 3D-Kuben mit Daten erwartet. Unser Dataset ist aber bisher für dichte Schichten eingerichtet und alle Pixel der Bilder werden in einem Vektor zusammengefasst. Wir müssen sie wieder in Bilder im Format 28 x 28 x 1 umwandeln (1 Kanal für Graustufenbilder):

tf.keras.layers.Reshape(input_shape=(28*28,), target_shape=(28, 28, 1))

Sie können diese Zeile anstelle der bisherigen tf.keras.layers.Input-Ebene verwenden.

In Keras lautet die Syntax für eine „relu'-aktivierte Faltungsebene“:

tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu')

Für eine komplexe Entwicklung würden Sie Folgendes schreiben:

tf.keras.layers.Conv2D(kernel_size=6, filters=24, padding='same', activation='relu', strides=2)

So glätten Sie einen Würfel von Daten zu einem Vektor, damit er von einer dichten Schicht verarbeitet werden kann:

tf.keras.layers.Flatten()

Bei dichten Schichten hat sich die Syntax nicht geändert:

tf.keras.layers.Dense(200, activation='relu')

Hat Ihr Modell die 99% ige Genauigkeitssperre überwunden? Ziemlich nah... aber auf die Validierungsverlustkurve achten. Läutet es?

Sehen Sie sich auch die Vervollständigungen an. Sie werden nun zum ersten Mal sehen, dass die meisten der 10.000 Testziffern jetzt korrekt erkannt werden. Es bleiben nur etwa 41⁄2 Zeilen der Fehlerkennung (etwa 110 von 10.000 Ziffern)

Wenn Sie nicht mehr weiterkommen, finden Sie hier die Lösung:

keras_04_mnist_convolutional.ipynb

Im vorherigen Training wurden eindeutige Anzeichen für eine Überanpassung gezeigt, die jedoch immer noch keine 99% Genauigkeit aufweist. Sollte ich es noch einmal versuchen?

Wie ist es gelaufen?

Es scheint, als hätte dies diesmal funktioniert. Die Validierungsverluste steigt nicht mehr an und die endgültige Genauigkeit sollte deutlich über 99 % liegen. Glückwunsch!

Als wir versuchten, das erste Mal anzuwenden, dachten wir, dass wir ein Überanpassungsproblem haben, obwohl das Problem in der Architektur des neuronalen Netzwerks lag. Wir könnten den Weg ohne weitere Faltebenen nicht meistern.

Diesmal scheint die Ursache für das Problem zu sein, da eine Überanpassung dadurch verursacht wurde. Denken Sie daran: Es gibt viele Dinge, die zu einer Trennung zwischen Trainings- und Validierungsverlustkurven führen können, wobei die Validierungsverlust sich zunimmt. Überanpassung (zu viele Freiheitsgrade, die vom Netzwerk schlecht genutzt wird) ist nur einer davon. Wenn Ihr Dataset zu klein ist oder die Architektur Ihres neuronalen Netzwerks nicht ausreicht, können Sie ein ähnliches Verhalten auf den Verlustkurven beobachten. Aussetzer sind jedoch nicht hilfreich.

Schließlich versuchen wir, die Batchnormalisierung hinzuzufügen.

Nach der Theorie in der Praxis musst du dich nur ein paar Regeln merken:

Wir spielen erst einmal das Buch und fügen auf jeder Ebene im neuronalen Netzwerk bis auf die letzte eine Normebene im Batch hinzu. Fügen Sie ihn nicht der letzten Softmax-Ebene hinzu. Das wäre an dieser Stelle nicht hilfreich.

# Modify each layer: remove the activation from the layer itself.
# Set use_bias=False since batch norm will play the role of biases.
tf.keras.layers.Conv2D(..., use_bias=False),
# Batch norm goes between the layer and its activation.
# The scale factor can be turned off for Relu activation.
tf.keras.layers.BatchNormalization(scale=False, center=True),
# Finish with the activation.
tf.keras.layers.Activation('relu'),

Wie ist die Genauigkeit jetzt?

Mit ein wenig mehr Optimierung (BATCH_SIZE=64, Parameter für die Lernrate abnehmend 0,666, Abbruchrate auf dichter Schicht 0,3) und viel Glück erhalten Sie 99,5%. Die Lernrate und die Abbruchvorgänge wurden nach der Verwendung der Batchnorm gemäß den Best Practices vorgenommen:

  • Die Batchnorm ermöglicht die Konvergenz von neuronalen Netzwerken und ermöglicht in der Regel ein schnelleres Training.
  • Die Batchnorm ist ein Regularisierer. Sie können die Anzahl der verwendeten Drop-downs in der Regel verringern oder sie sogar ganz entfernen.

Das Notebook der Lösung hat einen Trainingslauf von 99,5 %:

keras_05_mnist_batch_norm.ipynb

Im mlengine-Ordner auf GitHub finden Sie eine cloudfähige Version des Codes. Außerdem finden Sie dort eine Anleitung zum Ausführen auf der Google Cloud AI Platform. Bevor Sie diesen Teil ausführen können, müssen Sie ein Google Cloud-Konto erstellen und die Abrechnung aktivieren. Die für den Abschluss des Labs erforderlichen Ressourcen sollten kleiner als ein paar Dollar sein. Dabei wird von einer Trainingszeit von 1 Stunde auf einer GPU ausgegangen. So bereiten Sie Ihr Konto vor:

  1. Erstellen Sie ein Google Cloud Platform-Projekt (http://cloud.google.com/console).
  2. Aktivieren Sie die Abrechnung.
  3. Installieren Sie die GCP-Befehlszeilentools (GCP SDK).
  4. Erstellen Sie einen Google Cloud Storage-Bucket (mit der Region us-central1). Er wird verwendet, um den Trainingscode bereitzustellen und das trainierte Modell zu speichern.
  5. Aktivieren Sie die erforderlichen APIs und fordern Sie die erforderlichen Kontingente an. Führen Sie den Trainingsbefehl einmal aus und Sie erhalten Fehlermeldungen, um Sie zu aktivieren.

Sie haben Ihr erstes neuronales Netzwerk erstellt und es bis in 99% der Genauigkeit trainiert. Die dabei gewonnenen Verfahren sind nicht spezifisch für das MNIST-Dataset, sondern werden häufig für neuronale Netzwerke verwendet. Als kleines Dankeschön haben wir hier die Karte für das Lab in Cartoonversion. Damit können Sie sich das Gelernte merken:

Klippennotizen tensorflow Lab.png

Nächste Schritte

  • Sobald Sie vollständig verbunden und mit Faltungen verbunden sind, sollten Sie sich wiederkehrende neuronale Netzwerke ansehen.
  • Für das Training oder die Inferenz in der Cloud in einer verteilten Infrastruktur bietet Google Cloud AI Platform.
  • Wir freuen uns immer über Feedback. Bitte teilen Sie uns mit, ob in diesem Lab etwas fehlt oder Sie Verbesserungsbedarf haben. Feedback zu GitHub-Problemen wird verarbeitet [feedback link].

Personalabteilung

Martin Görner-ID Small.jpg

Der Autor: Martin Görner

Twitter-Profil: @martin_gorner

Alle Cartoonbilder in diesem Lab: alexpokusay / 123RF Stockfotos