CNN-Bildklassifizierung in TensorFlow mit Schritten und Beispielen
โก Intelligente Zusammenfassung
Convolutional Neural Networks (CNNs) scannen ein Bild mit kleinen Filtern, anstatt jedes Pixel gleich zu gewichten. Deshalb dominieren sie die Computer Vision. Diese Anleitung erklรคrt jede Schicht und klassifiziert anschlieรend MNIST-Ziffern mithilfe von TensorFlow.
Was ist Convolutional Neural Network?
Faltungs-Neuronales NetzConvolutional Neural Networks (CNNs), auch bekannt als Convolutional Neural Networks, sind eine etablierte Methode in der Computer Vision. Sie gehรถren zu den tiefen neuronalen Netzen und werden zur Analyse visueller Daten eingesetzt. Diese Architektur ist besonders geeignet fรผr die Objekterkennung in Bildern oder Videos. Sie findet Anwendung in Bereichen wie Bild- und Videoerkennung, natรผrlicher Sprachverarbeitung und Empfehlungssystemen.
ArchiStruktur eines Faltungs-Neuronalen Netzwerks
Denken Sie an Facebook vor ein paar Jahren: Nachdem Sie ein Bild in Ihr Profil hochgeladen hatten, wurden Sie aufgefordert, dem Gesicht auf dem Bild manuell einen Namen hinzuzufรผgen. Heutzutage verwendet Facebook convnet, um Ihren Freund automatisch auf dem Bild zu markieren.
Ein Convolutional Neural Network zur Bildklassifizierung ist nicht sehr schwer zu verstehen. Ein Eingabebild wird wรคhrend der Faltungsphase verarbeitet und spรคter mit einem Label versehen.
Eine typische Architektur eines Convolutional Neural Networks (CNN) lรคsst sich in der folgenden Abbildung zusammenfassen. Zunรคchst wird ein Bild an das Netzwerk รผbergeben; dies wird als Eingabebild bezeichnet. Anschlieรend durchlรคuft das Eingabebild eine Reihe von Schritten; dies ist der Faltungsteil des Netzwerks. Schlieรlich kann das neuronale Netzwerk die Ziffer im Bild vorhersagen.

Ein Bild besteht aus einer Anordnung von Pixeln mit bestimmter Hรถhe und Breite. Ein Graustufenbild hat nur einen Kanal, wรคhrend ein Farbbild drei Kanรคle besitzt (jeweils einen fรผr Rot, Grรผn und Blau). Die Kanรคle sind รผbereinander angeordnet. In diesem Tutorial verwenden Sie ein Graustufenbild mit nur einem Kanal. Jeder Pixel hat einen Wert zwischen 0 und 255, der die Farbintensitรคt widerspiegelt. Beispielsweise stellt ein Pixel mit dem Wert 0 Weiร dar, wรคhrend ein Pixel mit einem Wert nahe 255 dunkler ist.
Werfen wir einen Blick auf ein im gespeichertes Bild MNIST-DatensatzDie Abbildung unten zeigt, wie das Bild links in Matrixform dargestellt wird. Die ursprรผngliche Matrix ist auf einen Bereich zwischen 0 und 1 standardisiert. Dunklere Farben haben einen Matrixwert von etwa 0.9, wรคhrend weiรe Pixel den Wert 0 aufweisen.
Faltungsoperation
Die wichtigste Komponente des Modells ist die Faltungsschicht. Diese Schicht dient dazu, die Bildgrรถรe zu reduzieren, um die Gewichte schneller berechnen zu kรถnnen und die Generalisierung zu verbessern.
Wรคhrend des Faltungsteils behรคlt das Netzwerk die wesentlichen Merkmale des Bildes bei und schlieรt irrelevantes Rauschen aus. Das Modell lernt beispielsweise, wie man einen Elefanten anhand eines Bildes mit einem Berg im Hintergrund erkennt. Wenn Sie ein herkรถmmliches neuronales Netzwerk verwenden, weist das Modell allen Pixeln eine Gewichtung zu, auch denen vom Berg, was nicht unbedingt erforderlich ist und das Netzwerk irrefรผhren kann.
Stattdessen a Keras Ein Convolutional Neural Network (CNN) verwendet eine mathematische Technik, um โฆtracEs werden nur die relevantesten Pixel extrahiert. Diese mathematische Operation heiรt Faltung. Diese Technik ermรถglicht es dem Netzwerk, in jeder Schicht zunehmend komplexere Merkmale zu erlernen. Die Faltung teilt die Matrix in kleine Teile, um die wichtigsten Elemente innerhalb jedes Teils zu extrahieren.
Komponenten des Convolutional Neural Network (ConvNet oder CNN)
Ein Faltungsnetz besteht aus vier Komponenten:
- Windung
- Nichtlinearitรคt (ReLU)
- Pooling oder Subsampling
- Klassifizierung (vollstรคndig verbundene Schicht)
Windung
Der Zweck der Faltung besteht darin,tracDie Merkmale des Objekts im Bild werden lokal erfasst. Das bedeutet, dass das Netzwerk spezifische Muster innerhalb des Bildes lernt und diese รผberall im Bild erkennen kann.
Die Faltung ist eine elementweise Multiplikation. Das Prinzip ist leicht verstรคndlich. Der Computer scannt einen Bildausschnitt, รผblicherweise mit den Dimensionen 3ร3, und multipliziert ihn mit einem Filter. Das Ergebnis dieser elementweisen Multiplikation wird als Merkmalskarte bezeichnet. Dieser Schritt wird wiederholt, bis das gesamte Bild gescannt ist. Nach der Faltung ist die Bildgrรถรe reduziert.
Das untenstehende Diagramm zeigt, wie ein Ausschnitt des Bildes mit dem Filter multipliziert wird, um eine einzelne Zelle der Feature-Map zu erzeugen.
Die untenstehende Animation zeigt dieselbe Faltung, die รผber das gesamte Bild verlรคuft.
Es stehen zahlreiche Filter zur Verfรผgung. Im Folgenden haben wir einige davon aufgelistet. Jeder Filter hat einen bestimmten Zweck. Beachten Sie, dass im Bild unten der Begriff โKernelโ ein Synonym fรผr den Filter ist.
Arithmetik hinter der Faltung
Die Faltungsphase wendet den Filter auf ein kleines Pixel-Array innerhalb des Bildes an. Der Filter bewegt sich entlang des Eingabebildes mit einer typischen Form von 3ร3 oder 5ร5 Pixeln. Das Netzwerk verschiebt diese Fenster also รผber das gesamte Eingabebild und berechnet die Faltung. Die Animation unten veranschaulicht die Funktionsweise der Faltung. Die Grรถรe des Ausschnitts betrรคgt 3ร3 Pixel, und die Ausgabematrix ist das Ergebnis der elementweisen Operation zwischen der Bildmatrix und dem Filter.
Sie bemerken, dass die Breite und Hรถhe der Ausgabe von der Breite und Hรถhe der Eingabe abweichen kann. Dies geschieht aufgrund des Grenzeffekts.
Grenzeffekt
Das Bild enthรคlt eine 5ร5-Feature-Map und einen 3ร3-Filter. Es gibt nur ein Fenster in der Mitte, durch das der Filter ein 3ร3-Raster ausblenden kann. Die resultierende Feature-Map wird auf jeder Achse um zwei Kacheln verkleinert, sodass eine 3ร3-Dimension verbleibt.
Um die gleiche Ausgabedimension wie die Eingabedimension zu erhalten, muss Padding hinzugefรผgt werden. Padding bedeutet, die richtige Anzahl an Zeilen und Spalten auf jeder Seite der Matrix hinzuzufรผgen. Dadurch wird sichergestellt, dass die Faltung jedes Eingabefeld zentriert. In der Abbildung unten haben die Eingabe- und Ausgabematrix die gleiche Dimension, nรคmlich 5ร5.
Wenn Sie das Netzwerk definieren, werden die gefalteten Features durch drei Parameter gesteuert:
Tiefe: Sie definiert die Anzahl der Filter, die wรคhrend der Faltung angewendet werden. Im vorherigen Beispiel wurde eine Tiefe von 1 verwendet, was bedeutet, dass nur ein Filter zum Einsatz kommt. In den meisten Fรคllen werden jedoch mehrere Filter verwendet. Die folgende Animation veranschaulicht die Operationen mit drei Filtern.
Schreiten: Der Wert definiert die Anzahl der Pixel, die zwischen zwei Segmenten gesprungen werden. Bei einem Stride von 1 bewegt sich das Fenster um ein Pixel. Bei einem Stride von 2 springt das Fenster um zwei Pixel. Durch Erhรถhen des Strides werden die Feature-Maps kleiner. Die beiden folgenden Diagramme vergleichen einen Stride von 1 mit einem Stride von 2.
Beispielschritt 1
Schritt 2
Nullauffรผllung: Beim Padding werden den Eingabe-Feature-Maps auf beiden Seiten eine entsprechende Anzahl von Zeilen und Spalten hinzugefรผgt. Dadurch hat die Ausgabe die gleiche Dimension wie die Eingabe.
Nichtlinearitรคt (ReLU)
Am Ende der Faltungsoperation wird der Output einer Aktivierungsfunktion unterzogen, um Nichtlinearitรคt zu ermรถglichen. Die รผbliche Aktivierungsfunktion fรผr ein Convolutional Neural Network (CNN) ist ReLU. Alle Pixel mit einem negativen Wert werden durch Null ersetzt.
Pooling OperaProduktion
Dieser Schritt ist leicht verstรคndlich. Das Pooling dient dazu, die Dimensionalitรคt des Eingabebildes zu reduzieren. Die Schritte werden durchgefรผhrt, um die Rechenkomplexitรคt der Operation zu verringern. Durch die Reduzierung der Dimensionalitรคt muss das Netzwerk weniger Gewichte berechnen, wodurch ein รberanpassen verhindert wird.
In diesem Schritt mรผssen Sie die Grรถรe und die Schrittweite festlegen. Eine gรคngige Methode zum Pooling des Eingabebildes besteht darin, den Maximalwert der Feature-Map zu verwenden. Betrachten Sie die Abbildung unten. Beim Pooling werden vier Teilmatrizen der 4ร4-Feature-Map durchsucht und der Maximalwert zurรผckgegeben. Das Pooling nimmt den Maximalwert eines 2ร2-Arrays und verschiebt dieses Fenster dann um zwei Pixel. Beispielsweise ist die erste Teilmatrix [3,1,3,2], daher gibt das Pooling den Maximalwert 3 zurรผck.
Es gibt eine weitere Pooling-Operation wie den Mittelwert.
Diese Operation reduziert die Grรถรe der Feature-Map auf aggressive Weise.
Vollstรคndig verbundene Ebenen
Der letzte Schritt besteht im Aufbau eines traditionellen kรผnstliche neuronale Netz wie Sie es im vorherigen Tutorial getan haben. Sie verbinden alle Neuronen der vorherigen Schicht mit der nรคchsten Schicht. Sie verwenden eine Softmax-Aktivierungsfunktion, um die Zahl auf dem Eingabebild zu klassifizieren.
Recap:
Ein Convolutional Neural Network (CNN) von TensorFlow kompiliert verschiedene Schichten, bevor es eine Vorhersage trifft. Ein neuronales Netzwerk besteht aus:
- Eine Faltungsschicht
- ReLU-Aktivierungsfunktion
- Pooling-Schicht
- Dicht verbundene Schicht
Die Faltungsschichten wenden unterschiedliche Filter auf einen Teilbereich des Bildes an. Die ReLU-Aktivierungsfunktion fรผgt Nichtlinearitรคt hinzu, und die Pooling-Schichten reduzieren die Dimensionalitรคt der Merkmalskarten.
Alle diese Schichten z.B.tracDie wesentlichen Informationen werden aus den Bildern extrahiert. Schlieรlich werden die Feature-Maps einer vollstรคndig verbundenen Schicht mit einer Softmax-Funktion zugefรผhrt, um eine Vorhersage zu treffen.
Trainieren Sie CNN mit TensorFlow
Nachdem Sie nun mit den Bausteinen eines Faltungsnetzes vertraut sind, kรถnnen Sie selbst eines erstellen. TensorFlow. Wir werden den MNIST-Datensatz fรผr die CNN-Bildklassifizierung verwenden.
Die Datenaufbereitung erfolgt wie im vorherigen Tutorial. Sie kรถnnen die Codes ausfรผhren und direkt zur Architektur des CNN springen.
Fรผr die Bildklassifizierung mit CNN fรผhren Sie die folgenden Schritte aus:
- Schritt 1: Datensatz hochladen
- Schritt 2: Eingabeebene
- Schritt 3: Faltungsschicht
- Schritt 4: Pooling-Schicht
- Schritt 5: Zweite Faltungsschicht und Pooling Ebene
- Schritt 6: Dichte Schicht
- Schritt 7: Logit-Schicht
Versionshinweis: Die folgenden Auflistungen beziehen sich auf TensorFlow 1.x. In TensorFlow 2 existieren der Namespace `tf.layers` und die Funktion `tf.estimator.inputs.numpy_input_fn` nicht mehr; die Entsprechungen sind `tf.keras.layers.Conv2D` und `Max`.Pooling2D, Dense und Dropout wurden in einem tf.keras.Model zusammengefasst und mit model.fit() trainiert. Lesen Sie die Schritte, um die Funktionsweise jeder Schicht zu verstehen, und wenden Sie diese dann auf die Keras-API an.
Schritt 1: Datensatz hochladen
Der MNIST-Datensatz ist รผber scikit-learn verfรผgbar. Bitte laden Sie ihn herunter und speichern Sie ihn im Ordner โDownloadsโ. Sie kรถnnen ihn mit `fetch_mldata('MNIST original')` hochladen.
Versionshinweis: mldata.org wurde abgeschaltet und fetch_mldata() wurde in scikit-learn 0.22 entfernt. Laden Sie bei jeder aktuellen Installation die gleichen Ziffern mit fetch_openml Stattdessen wird fetch_openml('mnist_784', version=1) verwendet. Der Rest der Pipeline bleibt unverรคndert.
Erstellen Sie einen Zug-/Testsatz
Sie mรผssen den Datensatz mit train_test_split aufteilen.
Skalieren Sie die Funktionen
Abschlieรend kรถnnen Sie die Merkmale mit MinMaxScaler skalieren, wie im folgenden Beispiel zur Bildklassifizierung mit TensorFlow CNN gezeigt.
import numpy as np import tensorflow as tf from sklearn.datasets import fetch_mldata #Change USERNAME by the username of your machine ## Windows USER mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original') ## Mac User mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original') print(mnist.data.shape) print(mnist.target.shape) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape ) ## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64)) feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])] X_train_scaled.shape[1:]
Definieren Sie das CNN
Ein CNN verwendet Filter auf den Rohpixeln eines Bildes, um Detailmuster zu lernen, im Gegensatz zu den globalen Mustern, die ein herkรถmmliches neuronales Netz lernt. Um ein CNN zu konstruieren, mรผssen Sie Folgendes definieren:
- Eine Faltungsschicht: Wenden Sie n Filter auf die Merkmalskarte an. Nach der Faltung muss eine ReLU-Aktivierungsfunktion verwendet werden, um dem Netzwerk Nichtlinearitรคt hinzuzufรผgen.
- Pooling-Schicht: Nach der Faltung erfolgt das Downsampling der Feature-Map. Ziel ist es, die Dimensionalitรคt der Feature-Map zu reduzieren, um Overfitting zu vermeiden und die Berechnungsgeschwindigkeit zu verbessern. Max-Pooling ist die gรคngige Methode, bei der die Feature-Map in Teilbereiche (รผblicherweise 2ร2) unterteilt und nur die Maximalwerte beibehalten werden.
- Vollstรคndig verbundene Schichten: Alle Neuronen der vorherigen Schichten sind mit den nรคchsten Schichten verbunden. Das CNN klassifiziert das Label anhand der Merkmale aus den Faltungsschichten und reduziert sie mit der Pooling-Schicht.
CNN-Architektur
- Faltungsschicht: Wendet 14 5ร5-Filter an (z. B.tracting 5ร5-Pixel-Teilbereiche), mit ReLU-Aktivierungsfunktion
- Pooling-Ebene: Fรผhrt Max-Pooling mit einem 2ร2-Filter und einer Schrittweite von 2 aus (wodurch festgelegt wird, dass sich die gepoolten Bereiche nicht รผberschneiden)
- Faltungsschicht: Wendet 36 5ร5-Filter mit ReLU-Aktivierungsfunktion an
- Pooling Schicht #2: Fรผhrt erneut Max Pooling mit einem 2ร2 Filter und einer Schrittweite von 2 durch
- 1,764 Neuronen mit einer Dropout-Regularisierungsrate von 0.4 (Wahrscheinlichkeit von 0.4, dass ein bestimmtes Element wรคhrend des Trainings gelรถscht wird)
- Dichte Schicht (Logits-Schicht): 10 Neuronen, eines fรผr jede Ziffernzielklasse (0โ9).
Es gibt drei wichtige Module zur Erstellung eines CNN:
- conv2d(). Konstruiert eine zweidimensionale Faltungsschicht mit der Anzahl der Filter, der Filterkerngrรถรe, der Auffรผllung und der Aktivierungsfunktion als Argumente.
- max_pooling2d(). Erstellt eine zweidimensionale Pooling-Schicht unter Verwendung des Max-Pooling-Algorithmus.
- dicht(). Konstruiert eine dichte Ebene mit den verborgenen Ebenen und Einheiten
Sie werden eine Funktion zum Erstellen des CNN definieren. Sehen wir uns im Detail an, wie die einzelnen Bausteine โโkonstruiert werden, bevor wir fortfahren.ping Alles zusammen in der Funktion.
Schritt 2: Eingabeebene
def cnn_model_fn(features, labels, mode): input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Sie mรผssen einen Tensor mit der Form der Daten definieren. Dazu kรถnnen Sie das Modul tf.reshape verwenden. In diesem Modul mรผssen Sie den umzuformenden Tensor und die Form des Tensors deklarieren. Das erste Argument sind die Merkmale der Daten, die im Argument der Funktion definiert werden.
Ein Bild hat eine Hรถhe, eine Breite und einen Kanal. Der MNIST-Datensatz besteht aus monochromen Bildern der Grรถรe 28ร28. Wir setzen die Batchgrรถรe im Formargument auf -1, sodass sie die Form von features["x"] annimmt. Der Vorteil besteht darin, dass die Batchgrรถรe als Hyperparameter optimiert werden kann. Bei einer Batchgrรถรe von 7 enthรคlt der Tensor 5,488 Werte (28ร28ร7).
Schritt 3: Faltungsschicht
# first Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
Die erste Faltungsschicht besteht aus 14 Filtern mit einer Kernelgrรถรe von 5ร5 und gleichem Padding. Gleiches Padding bedeutet, dass sowohl der Ausgabetensor als auch der Eingabetensor die gleiche Hรถhe und Breite aufweisen. TensorFlow fรผgt den Zeilen und Spalten Nullen hinzu, um die gleiche Grรถรe zu gewรคhrleisten.
Sie verwenden die ReLU-Aktivierungsfunktion. Die Ausgabegrรถรe betrรคgt [28, 28, 14].
Schritt 4: Pooling-Schicht
Der nรคchste Schritt nach der Faltung ist die Pooling-Berechnung. Diese reduziert die Dimensionalitรคt der Daten. Sie kรถnnen das Modul `max_pooling2d` mit einer Grรถรe von 2ร2 und einem Stride von 2 verwenden. Die vorherige Schicht dient als Eingabe. Die Ausgabegrรถรe betrรคgt dann [Batchgrรถรe, 14, 14, 14].
# first Pooling Layer
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Schritt 5: Zweite Faltungsschicht und Pooling Ebene
Die zweite Faltungsschicht wendet 36 Filter an, was zu einer Ausgabegrรถรe von [Batchgrรถรe, 14, 14, 36] fรผhrt. Die Pooling-Schicht verwendet dasselbe 2ร2-Fenster und denselben Schritt von 2 wie zuvor, halbiert also jede rรคumliche Achse, und die Ausgabegrรถรe betrรคgt [Batchgrรถรe, 7, 7, 36].
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=36,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
Schritt 6: Dichte Schicht
Anschlieรend muss die vollstรคndig verbundene Ebene definiert werden. Die Feature-Map muss vor der Verbindung mit der dichten Ebene abgeflacht werden. Hierfรผr kann das Modul `reshape` mit einer Grรถรe von 7x7x36 verwendet werden.
Die dichte Schicht verbindet 1,764 Neuronen. Sie verwenden eine ReLU-Aktivierungsfunktion. Zusรคtzlich fรผgen Sie einen Dropout-Regularisierungsterm mit einer Rate von 0.3 hinzu, was bedeutet, dass 30 Prozent der Aktivierungen auf 0 gesetzt werden. Beachten Sie, dass der Dropout nur wรคhrend der Trainingsphase stattfindet. Die Funktion `cnn_model_fn` verfรผgt รผber das Argument `mode`, mit dem Sie festlegen kรถnnen, ob das Modell trainiert oder evaluiert werden soll, wie im folgenden TensorFlow-Beispiel zur CNN-Bildklassifizierung gezeigt.
pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])
dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)
Schritt 7: Logit-Schicht
Im TensorFlow-Beispiel zur Bildklassifizierung kรถnnen Sie schlieรlich die letzte Schicht mit der Vorhersage des Modells definieren. Die Ausgabegrรถรe entspricht der Batchgrรถรe plus 10, der Gesamtzahl der Zielklassen.
# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=10)
Sie kรถnnen ein Wรถrterbuch erstellen, das die Klassen und die Wahrscheinlichkeit jeder Klasse enthรคlt. Die Funktion `tf.argmax()` gibt den Index des hรถchsten Werts in der Logit-Schicht zurรผck. Die Softmax-Funktion gibt die Wahrscheinlichkeit jeder Klasse zurรผck.
predictions = {
# Generate predictions
"classes": tf.argmax(input=logits, axis=1),
"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }
Das Vorhersagewรถrterbuch soll nur dann zurรผckgegeben werden, wenn der Modus auf โVorhersageโ gesetzt ist. Fรผgen Sie diesen Code hinzu, um die Vorhersagen anzuzeigen.
if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
Der nรคchste Schritt besteht in der Berechnung des Modellverlusts. Im letzten Tutorial haben Sie gelernt, dass die Verlustfunktion fรผr ein Multiklassenmodell die Kreuzentropie ist. Der Verlust lรคsst sich einfach mit dem folgenden Code berechnen:
# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
Der letzte Schritt des TensorFlow-CNN-Beispiels besteht in der Optimierung des Modells, d. h. in der Ermittlung der optimalen Gewichtswerte. Dazu wird ein Gradientenabstiegsverfahren mit einer Lernrate von 0.001 verwendet. Ziel ist es, den Verlust zu minimieren.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step())
Sie haben die CNN-Implementierung abgeschlossen. Sie mรถchten jedoch die Leistungsmetriken im Auswertungsmodus anzeigen lassen. Die Leistungsmetrik fรผr ein Multiklassenmodell ist die Genauigkeit. TensorFlow verfรผgt รผber ein Genauigkeitsmodul, das zwei Argumente benรถtigt: die Labels und die vorhergesagten Werte.
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Das ist es. Sie haben Ihr erstes CNN erstellt und sind bereit, alles in eine Funktion zu packen, um es zum Trainieren und Bewerten des Modells zu verwenden.
def cnn_model_fn(features, labels, mode): """Model function for CNN.""" # Input Layer input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) # Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) # Convolutional Layer #2 and Pooling Layer conv2 = tf.layers.conv2d( inputs=pool1, filters=36, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) # Dense Layer pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36]) dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu) dropout = tf.layers.dropout( inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) # Logits Layer logits = tf.layers.dense(inputs=dropout, units=10) predictions = { # Generate predictions (for PREDICT and EVAL mode) "classes": tf.argmax(input=logits, axis=1), "probabilities": tf.nn.softmax(logits, name="softmax_tensor") } if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions) # Calculate Loss loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) # Configure the Training Op (for TRAIN mode) if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) # Add evaluation metrics Evaluation mode eval_metric_ops = { "accuracy": tf.metrics.accuracy( labels=labels, predictions=predictions["classes"])} return tf.estimator.EstimatorSpec( mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
Hinweis zur zusammengesetzten Funktion: Die obenstehende, umschlossene Version verwendet 32 โโFilter in der ersten Faltungsschicht und einen Dropout-Wert von 0.4, wรคhrend die schrittweisen Codebeispiele 14 Filter und 0.3 verwenden. Beide Varianten laufen, aber wรคhlen Sie ein Wertepaar und behalten Sie es bei, damit die ausgegebenen Formen mit der Schichttabelle รผbereinstimmen.
Die folgenden Schritte sind die gleichen wie in den vorherigen Tutorials.
Zunรคchst definieren Sie einen Schรคtzer mit dem CNN-Modell zur Bildklassifizierung.
# Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")
Da das Training eines CNN sehr lange dauert, erstellt man einen Logging-Hook, um die Werte der Softmax-Schichten alle 50 Iterationen zu speichern.
# Set up logging for predictions tensors_to_log = {"probabilities": "softmax_tensor"} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)
Sie kรถnnen das Modell nun schรคtzen. Legen Sie eine Batchgrรถรe von 100 fest und mischen Sie die Daten. Beachten Sie, dass wir 16,000 Trainingsschritte festgelegt haben, was viel Zeit in Anspruch nehmen kann. Haben Sie Geduld.
# Train the model train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=100, num_epochs=None, shuffle=True) mnist_classifier.train( input_fn=train_input_fn, steps=16000, hooks=[logging_hook])
Nachdem das Modell trainiert wurde, kรถnnen Sie es auswerten und die Ergebnisse ausdrucken.
# Evaluate the model and print results eval_input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, num_epochs=1, shuffle=False) eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn) print(eval_results)
Die Auswertung gibt den wiederhergestellten Prรผfpunkt, den Schritt, bei dem er gestoppt wurde, und das endgรผltige Metrikenwรถrterbuch aus.
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56 INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269 {'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}
Mit der aktuellen Architektur meldet das Auswertungswรถrterbuch eine Genauigkeit von 0.9689286, was etwa 97 % entspricht. Sie kรถnnen die Architektur, die Batchgrรถรe und die Anzahl der Iterationen anpassen, um die Genauigkeit zu verbessern. Das CNN hat deutlich besser abgeschnitten als ein kรผnstliche neuronale Netz Oder logistische Regression: Im Tutorial zu kรผnstlichen neuronalen Netzen erzielten Sie eine Genauigkeit von 96 %, die niedriger ist als die des CNN. Die Leistung des CNN ist bei grรถรeren Bilddatensรคtzen sowohl hinsichtlich der Rechengeschwindigkeit als auch der Genauigkeit beeindruckend.











