CNN-Bildklassifizierung in TensorFlow mit Schritten und Beispielen
Was ist Convolutional Neural Network?
Faltungs-Neuronales Netz, auch bekannt als Convnets oder CNN, ist eine bekannte Methode in Computer Vision-Anwendungen. Es handelt sich um eine Klasse tiefer neuronaler Netzwerke, die zur Analyse visueller Bilder verwendet werden. Diese Art von Architektur ist vorherrschend, um Objekte aus einem Bild oder Video zu erkennen. Sie wird in Anwendungen wie Bild- oder Videoerkennung, neuronaler Sprachverarbeitung usw. verwendet.
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 Convnet-Architektur kann in der folgenden Abbildung zusammengefasst werden. Zunรคchst wird ein Bild in das Netzwerk รผbertragen; dies wird als Eingabebild bezeichnet. Dann durchlรคuft das Eingabebild eine unendliche Anzahl von Schritten; dies ist der Faltungsteil des Netzwerks. Schlieรlich kann das neuronale Netzwerk die Ziffer auf dem Bild vorhersagen.

Ein Bild besteht aus einer Reihe von Pixeln mit Hรถhe und Breite. Ein Graustufenbild hat nur einen Kanal, wรคhrend das Farbbild drei Kanรคle hat (jeweils einen fรผr Rot, Grรผn und Blau). Ein Kanal wird รผbereinander gestapelt. In diesem Tutorial verwenden Sie ein Graustufenbild mit nur einem Kanal. Jedes Pixel hat einen Wert von 0 bis 255, um die Intensitรคt der Farbe wiederzugeben. Beispielsweise zeigt ein Pixel mit dem Wert 0 eine weiรe Farbe an, wรคhrend ein Pixel mit einem Wert nahe 255 dunkler ist.
Werfen wir einen Blick auf ein im gespeichertes Bild MNIST-Datensatz. Das Bild unten zeigt, wie das Bild der linken Seite in einem Matrixformat dargestellt wird. Beachten Sie, dass die ursprรผngliche Matrix auf einen Wert zwischen 0 und 1 standardisiert wurde. Fรผr dunklere Farben betrรคgt der Wert in der Matrix etwa 0.9, wรคhrend weiรe Pixel einen Wert von 0 haben.
Faltungsoperation
Die kritischste Komponente im Modell ist die Faltungsschicht. Dieser Teil zielt darauf ab, die Grรถรe des Bildes zu reduzieren, um die Berechnung der Gewichte zu beschleunigen und seine Verallgemeinerung 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 lernen.
Komponenten des Convolutional Neural Network (ConvNet oder CNN)
Es gibt vier Komponenten eines Convnets
- 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 analysiert. Das bedeutet, dass das Netzwerk spezifische Muster innerhalb des Bildes lernt und es รผberall im Bild erkennen kann.
Faltung ist eine elementweise Multiplikation. Das Konzept ist leicht zu verstehen. Der Computer scannt einen Teil des Bildes, normalerweise mit einer Dimension von 3ร3, und multipliziert ihn mit einem Filter. Die Ausgabe der elementweisen Multiplikation wird als Merkmalskarte bezeichnet. Dieser Schritt wird wiederholt, bis das gesamte Bild gescannt ist. Beachten Sie, dass die Grรถรe des Bildes nach der Faltung reduziert wird.
Unten befindet sich ein URL um in Aktion zu sehen, wie die Faltung funktioniert.
Es stehen zahlreiche Kanรคle zur Verfรผgung. Nachfolgend haben wir einige der Kanรคle aufgelistet. Sie sehen, dass jeder Filter einen bestimmten Zweck hat. Beachten Sie, im Bild unten; Der Kernel ist ein Synonym fรผr den Filter.
Arithmetik hinter der Faltung
Die Faltungsphase wendet den Filter auf eine kleine Pixelanordnung im Bild an. Der Filter bewegt sich entlang des Eingabebildes in einer allgemeinen Form von 3ร3 oder 5ร5. Das bedeutet, dass das Netzwerk diese Fenster รผber das gesamte Eingabebild schiebt und die Faltung berechnet. Das folgende Bild zeigt, wie die Faltung funktioniert. Die Grรถรe des Patches betrรคgt 3ร3 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 verfรผgt รผber eine 5ร5-Funktionskarte und einen 3ร3-Filter. Es gibt nur ein Fenster in der Mitte, in dem der Filter ein 3ร3-Raster anzeigen kann. Die Ausgabe-Feature-Map wird zusammen mit einer 3ร3-Dimension um zwei Kacheln verkleinert.
Um die gleiche Ausgabedimension wie die Eingabedimension zu erhalten, mรผssen Sie eine Auffรผllung hinzufรผgen. Beim Auffรผllen wird auf jeder Seite der Matrix die richtige Anzahl an Zeilen und Spalten hinzugefรผgt. Dadurch kann die Faltung jede Eingabekachel zentrieren. Im Bild unten hat die Eingabe-/Ausgabematrix die gleiche Dimension 5ร5
Wenn Sie das Netzwerk definieren, werden die gefalteten Features durch drei Parameter gesteuert:
- Tiefe: Definiert die Anzahl der Filter, die wรคhrend der Faltung angewendet werden. Im vorherigen Beispiel haben Sie eine Tiefe von 1 gesehen, was bedeutet, dass nur ein Filter verwendet wird. In den meisten Fรคllen gibt es mehr als einen Filter. Das folgende Bild zeigt die Operationen, die in einer Situation mit drei Filtern durchgefรผhrt werden
- Schreiten: Definiert die Anzahl der โPixelsprรผngeโ zwischen zwei Slices. Wenn der Schritt gleich 1 ist, bewegen sich die Fenster mit einer Pixelbreite von eins. Wenn der Schritt gleich zwei ist, springen die Fenster um 2 Pixel. Wenn Sie den Schritt vergrรถรern, erhalten Sie kleinere Feature-Maps.
Beispielschritt 1
Schritt 2
- Nullauffรผllung: Beim Auffรผllen wird auf jeder Seite der Eingabe-Feature-Maps eine entsprechende Anzahl von Zeilen und Spalten hinzugefรผgt. In diesem Fall hat die Ausgabe die gleiche Dimension wie die Eingabe.
Nichtlinearitรคt (ReLU)
Am Ende der Faltungsoperation wird die Ausgabe einer Aktivierungsfunktion unterzogen, um Nichtlinearitรคt zu ermรถglichen. Die รผbliche Aktivierungsfunktion fรผr Convnet ist Relu. Alle Pixel mit einem negativen Wert werden durch Null ersetzt.
Pooling OperaProduktion
Dieser Schritt ist leicht zu verstehen. Der Zweck des Poolings besteht darin, die Dimensionalitรคt des Eingabebildes zu reduzieren. Die Schritte werden durchgefรผhrt, um die Rechenkomplexitรคt der Operation zu reduzieren. Durch die Verringerung der Dimensionalitรคt muss das Netzwerk weniger Gewichte berechnen, wodurch eine รberanpassung verhindert wird.
In dieser Phase mรผssen Sie die Grรถรe und die Schrittweite definieren. Eine Standardmethode zum Poolen des Eingabebilds besteht darin, den Maximalwert der Feature-Map zu verwenden. Sehen Sie sich das Bild unten an. Das โPoolingโ durchleuchtet eine Vierer-Submatrix der 4ร4-Feature-Map und gibt den Maximalwert zurรผck. Das Pooling nimmt den Maximalwert eines 2ร2-Arrays und verschiebt dieses Fenster dann um zwei Pixel. Wenn beispielsweise die erste Submatrix [3,1,3,2] ist, gibt das Pooling das Maximum zurรผck, also 3.
Es gibt eine weitere Pooling-Operation wie den Mittelwert.
Dieser Vorgang reduziert die Grรถรe der Feature-Map drastisch.
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:
Das TensorFlow Convolutional Neural Network kompiliert verschiedene Schichten, bevor es eine Vorhersage trifft. Ein neuronales Netzwerk hat:
- 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 Feature-Maps.
Alle diese Schichten z.B.tracDie wesentlichen Informationen werden aus den Bildern extrahiert. Schlieรlich werden die Merkmalskarten einer primรคren 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 Convnets vertraut sind, kรถnnen Sie mit dem Bau eines Convnets beginnen 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
Schritt 1: Datensatz hochladen
Der MNIST-Datensatz ist mit scikit zum Lernen verfรผgbar URL. Bitte laden Sie es herunter und speichern Sie es unter Downloads. Sie kรถnnen es mit fetch_mldata('MNIST original') hochladen.
Erstellen Sie einen Zug-/Testsatz
Sie mรผssen den Datensatz mit train_test_split aufteilen
Skalieren Sie die Funktionen
Schlieรlich kรถnnen Sie das Feature mit MinMaxScaler skalieren, wie in der folgenden Bildklassifizierung anhand des TensorFlow-CNN-Beispiels 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 fรผr die Rohpixel eines Bildes, um Detailmuster zu lernen, im Vergleich zu globalen Mustern mit einem herkรถmmlichen neuronalen Netz. Um ein CNN zu konstruieren, mรผssen Sie Folgendes definieren:
- Eine Faltungsschicht: Wenden Sie n Filter auf die Feature-Map an. Nach der Faltung mรผssen Sie eine Relu-Aktivierungsfunktion verwenden, um dem Netzwerk Nichtlinearitรคt hinzuzufรผgen.
- Pooling-Schicht: Der nรคchste Schritt nach der Faltung besteht darin, das Feature-Maximum herunterzusampeln. Ziel ist es, die Dimensionalitรคt der Feature-Map zu reduzieren, um eine รberanpassung zu verhindern und die Rechengeschwindigkeit zu verbessern. Max-Pooling ist die herkรถmmliche Technik, die die Feature-Maps in Unterbereiche (normalerweise mit einer Grรถรe von 2 ร 2) unterteilt und nur die Maximalwerte behรคlt.
- 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 definieren eine Funktion zum Erstellen des CNN. Sehen wir uns zunรคchst im Detail an, wie die einzelnen Bausteine โโaufgebaut werden, um alles in der Funktion zusammenzufassen.
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 ist ein monochrones Bild mit einer Grรถรe von 28ร28. Wir setzen die Stapelgrรถรe im Formargument auf -1, damit sie die Form der Features[โxโ] annimmt. Der Vorteil besteht darin, die Hyperparameter der Chargengrรถรe anzupassen. Wenn die Stapelgrรถรe auf 7 eingestellt ist, speist 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 verfรผgt รผber 14 Filter mit einer Kernelgrรถรe von 5ร5 und der gleichen Polsterung. Die gleiche Auffรผllung bedeutet, dass sowohl der Ausgabetensor als auch der Eingabetensor die gleiche Hรถhe und Breite haben sollten. Tensorflow fรผgt den Zeilen und Spalten Nullen hinzu, um die gleiche Grรถรe sicherzustellen.
Sie nutzen 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. Die Pooling-Berechnung reduziert die Dimensionalitรคt der Daten. Sie kรถnnen das Modul max_pooling2d mit einer Grรถรe von 2ร2 und einer Schrittweite von 2 verwenden. Sie verwenden die vorherige Ebene als Eingabe. Die Ausgabegrรถรe betrรคgt [batch_size, 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 hat 32 Filter mit einer Ausgabegrรถรe von [batch_size, 14, 14, 32]. Die Pooling-Schicht hat die gleiche Grรถรe wie zuvor und die Ausgabeform ist [batch_size, 14, 14, 18].
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 mรผssen Sie die vollstรคndig verbundene Ebene definieren. Die Feature-Map muss vor der Verbindung mit der dichten Ebene abgeflacht werden. Sie kรถnnen das Modul Reshape mit einer Grรถรe von 7*7*36 verwenden.
Die dichte Schicht wird 1764 Neuronen verbinden. Sie fรผgen eine Relu-Aktivierungsfunktion hinzu. Auรerdem fรผgen Sie einen Dropout-Regularisierungsterm mit einer Rate von 0.3 hinzu, was bedeutet, dass 30 Prozent der Gewichte auf 0 gesetzt werden. Beachten Sie, dass der Dropout nur wรคhrend der Trainingsphase stattfindet. Die Funktion cnn_model_fn verfรผgt รผber einen Argumentmodus, um zu deklarieren, ob das Modell trainiert oder ausgewertet werden muss, wie im folgenden TensorFlow-Beispiel fรผr die 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
Schlieรlich kรถnnen Sie im TensorFlow-Bildklassifizierungsbeispiel die letzte Ebene mit der Vorhersage des Modells definieren. Die Ausgabeform entspricht der Stapelgrรถรe und 10, der Gesamtzahl der Bilder.
# 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. Das Modul tf.argmax() gibt den hรถchsten Wert zurรผck, wenn die Logit-Schichten vorhanden sind. 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") }
Sie mรถchten die Wรถrterbuchvorhersage nur zurรผckgeben, wenn der Modus auf Vorhersage eingestellt ist. Sie fรผgen diese Codes hinzu, um die Vorhersagen anzuzeigen
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
Der nรคchste Schritt besteht darin, den Verlust des Modells zu berechnen. Im letzten Tutorial haben Sie gelernt, dass die Verlustfunktion fรผr ein Mehrklassenmodell 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 darin, das Modell zu optimieren, also die besten Werte der Gewichte zu finden. Dazu verwenden Sie einen Gradientenabstiegsoptimierer mit einer Lernrate von 0.001. 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 sind mit CNN fertig. Sie mรถchten jedoch die Leistungskennzahlen wรคhrend des Bewertungsmodus anzeigen. Die Leistungsmetrik fรผr ein Mehrklassenmodell sind die Genauigkeitsmetriken. Tensorflow verfรผgt รผber ein Genauigkeitsmodul mit zwei Argumenten, den Beschriftungen und den vorhergesagten Werten.
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)
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")
Das Training eines CNN dauert viele Male. Daher erstellen Sie einen Logging-Hook, um die Werte der Softmax-Ebenen 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 sind bereit, das Modell zu schรคtzen. Sie legen eine Stapelgrรถรe von 100 fest und mischen die Daten. Beachten Sie, dass wir Trainingsschritte von 16.000 festlegen. Das Training kann viel Zeit in Anspruch nehmen. Sei geduldig.
# 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 nun trainiert ist, 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)
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 erreichen Sie eine Genauigkeit von 97 %. Sie kรถnnen die Architektur, die Batch-Grรถรe und die Anzahl der Iterationen รคndern, um die Genauigkeit zu verbessern. Das neuronale CNN-Netzwerk hat eine weitaus bessere Leistung erbracht als ANN oder logistische Regression. Im Tutorial zum kรผnstlichen neuronalen Netzwerk hatten Sie eine Genauigkeit von 96 %, was niedriger ist als beim CNN. Die Leistungen des CNN sind bei einem grรถรeren Bild beeindruckend kompensieren, sowohl im Hinblick auf die Geschwindigkeitsberechnung als auch auf die Genauigkeit.
Zusammenfassung
Ein Convolutional Neural Network eignet sich sehr gut zur Bildauswertung. Diese Art von Architektur ist vorherrschend, um Objekte aus einem Bild oder Video zu erkennen.
Um ein TensorFlow-CNN zu erstellen, mรผssen Sie sieben Schritte ausfรผhren:
Schritt 1:: Datensatz hochladen:
Der MNIST-Datensatz ist mit Scikit zum Lernen verfรผgbar. Bitte laden Sie es herunter und speichern Sie es unter Downloads. Sie kรถnnen es mit fetch_mldata('MNIST original') hochladen.
Schritt 2:: Eingabeebene:
Dieser Schritt formt die Daten neu. Die Form entspricht der Quadratwurzel der Anzahl der Pixel. Wenn ein Bild beispielsweise 156 Pixel hat, ist die Form 26ร26. Sie mรผssen angeben, ob das Bild farbig ist oder nicht. Wenn ja, dann haben Sie 3 fรผr die Form โ 3 fรผr RGB โ, andernfalls 1.
input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Schritt 3:: Faltungsschicht
Als nรคchstes mรผssen Sie die Faltungsschichten erstellen. Sie wenden verschiedene Filter an, damit das Netzwerk wichtige Funktionen lernen kann. Sie legen die Grรถรe des Kernels und die Anzahl der Filter fest.
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=14,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
Schritt 4:: Pooling-Schicht
Im dritten Schritt fรผgen Sie eine Pooling-Schicht hinzu. Diese Schicht verringert die Grรถรe der Eingabe. Dies geschieht, indem der Maximalwert einer Untermatrix verwendet wird. Wenn die Untermatrix beispielsweise [3,1,3,2] ist, gibt das Pooling das Maximum zurรผck, also 3.
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Schritt 5:: Faltungsschicht hinzufรผgen und Pooling Ebene
In diesem Schritt kรถnnen Sie beliebig viele Convolutional Layers und Pooling Layers hinzufรผgen. Google verwendet eine Architektur mit mehr als 20 Faltungsschichten.
Schritt 6:: Dichte Schicht
Schritt 6 glรคttet den vorherigen, um eine vollstรคndig verbundene Ebene zu erstellen. In diesem Schritt kรถnnen Sie verschiedene Aktivierungsfunktionen verwenden und einen Dropout-Effekt hinzufรผgen.
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
Der letzte Schritt ist die Vorhersage.
logits = tf.layers.dense(inputs=dropout, units=10)











