[PYTHON] TensorFlow Tutorial Ich habe CNN 4th ausprobiert

Ich habe [TensorFlow Official Tutorial] ausprobiert (https://www.tensorflow.org/get_started/mnist/pros) Das Ergebnis ist im vorherigen NN immer noch schlecht. Durch die Verwendung von CNN wird die Genauigkeit weiter verbessert.

CNN CNN wird häufig bei der Bilderkennung und Spracherkennung verwendet. Dies kann durch Kombinieren einer "Faltungsschicht" und einer "Pooling-Schicht" erfolgen.

Faltvorgang

① Wenden Sie einen 3 * 3-Quadrat-Faltungsfilter auf die Eingabedaten an. Der Faltfilter bestimmt die zurückgelegte Strecke. Wenn 1 Pixel angegeben ist, wird es um 1 Pixel verschoben. Wenn Sie einen 5x5-Faltfilter auf 28x28-Daten anwenden, wird dieser 24x24 und kleiner. ← Es gibt keine Polsterung, um damit umzugehen. Beim Null-Auffüllen werden die Eingabedaten mit Nullen umgeben. (2) Ermitteln Sie die Summe der mit einem Filter erhaltenen Berechnungen.

Pooling-Prozess

Ein Prozess, der die Dimension des Ergebnisses des Faltungsprozesses reduziert. Beispiel: Angenommen, Sie haben einen 2x2-Pooling-Filter Max Pooling wendet einen 2x2-Pooling-Filter auf das Faltungsergebnis an und erhält den Maximalwert in diesem 2x2.

Aktivierungsfunktion

Dieses Mal werden wir die ReLu-Funktion verwenden Die ReLu-Funktion lautet wie folgt y = max(x, 0) 0 wenn 0 oder weniger Wenn es 0 oder mehr ist, x Funktion, die zurückgibt

Programmablauf

Daten lesen

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot = True)

Tensorflow importieren

import tensorflow as tf

Richten Sie eine Sitzung ein

Verwenden Sie diesmal "InteractiveSession ()"

sess = tf.InteractiveSession()

Erstellen Sie einen Container für die Eingabe x und korrigieren Sie die Bezeichnung y_

Erstellt mit "Platzhalter". Übrigens habe ich auch Gewichte und Vorurteile geschaffen.

x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None,10])

W = tf.Variable(tf.zeros([783, 10]))
b = tf.Variable(tf.zeros([10]))

Erstellen Sie eine Funktion zum Berechnen von Gewichten und Verzerrungen

Das Gewicht initial = tf.truncated_normal (Form, stddev = 0.1) gibt den Anfangswert an. Es hat eine Form, in der die linke und rechte Seite der Normalverteilung abgeschnitten sind, und stddev gibt die Verteilung der Daten mit der Standardabweichung an.

Die Vorspannung "initial = tf.constant (0.1, shape = shape)" ergibt "0.1" als Vorspannung, da die Berechnung nicht fortgesetzt wird, wenn der Wert "0" ist.

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
    
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

Faltvorgang / Faltschicht

Argumentieren Sie die Eingabedaten und das Ohr. "Schritte = [1,1,1,1]" bedeutet Anpassung durch Verschiebung um 1 Pixel. padding = 'SAME' wird in Daten mit 0s links und rechts konvertiert (mit 0s gefüllt, damit die Ausgabe dieselbe Größe wie die Eingabe hat).

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')

Pooling-Schicht

Ebene zum Extrahieren von Features, um die Größe zu reduzieren ksize = [1,2,2,1] Wende 2 * 2 Blöcke an. "Schritte = [1,2,2,1]" bedeutet Anpassung durch Verschiebung um 2 Pixel. padding = 'SAME' wird in Daten mit 0s links und rechts konvertiert (mit 0s gefüllt, damit die Ausgabe dieselbe Größe wie die Eingabe hat).

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

Einstellung der ersten Faltungsschicht

Bereiten Sie 32 5 * 5 Gewichtspflaster vor. [Patchgröße, Anzahl der Eingangskanäle, Anzahl der Ausgangskanäle]. Die Vorspannung wird so viele wie die Anzahl der Ausgangskanäle vorbereitet.

W_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])

Geben Sie den Wert von x an

Um eine Ebene anzuwenden, transformieren Sie sie zunächst in einen 4d-Tensor mit x, wobei die zweite und dritte Dimension der Breite und Höhe des Bildes und die endgültige Dimension der Anzahl der Farbkanäle entsprechen. tf.reshape (x, [-1, 28, 28, 1]) transformiert die Form der Matrix. Die letzte '1' zeigt an, dass es sich um ein Schattenbild handelt.

x_image = tf.reshape(x, [-1, 28, 28, 1])

Das Ergebnis des Faltens der ersten Schicht

Falten Sie mit x_image, Gewichtstensor, Bias, wenden Sie die ReLU-Funktion an und wenden Sie schließlich den maximalen Pool an. Diese Methode max_pool_2x2 reduziert die Bildgröße auf 14x14.

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

Einstellung der zweiten Faltungsschicht und das Ergebnis der Faltung

W_conv2 = weight_variable ([5,5,32,64]) hat 64 5 * 5 Patches von 32 Typen

Da es sich um die zweite Schicht handelt, erfolgt die Faltungsberechnung von "h_pool1" und "W_conv2"

W_conv2 = weight_variable([5,5,32,64])
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

Klebeschicht

W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

Dropout Wenden Sie vor der Leseschicht ein Dropout an, um eine Überanpassung zu vermeiden. Wir Platzhalter erstellen eine Wahrscheinlichkeit, dass eine neuronale Ausgabe während eines Ausfalls erhalten bleibt. Auf diese Weise können Sie Aussetzer während des Trainings ein- und während des Tests ausschalten.

keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

Ebene lesen

W_fc2 = weight_variable ([1024,10]) 1024 Zeilen x 10 Spalten (Festlegung von Zahlen von 0 bis 9)

W_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

Modellschulung und Bewertung

cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) redu_mean () nimmt den Durchschnittswert an tf.nn.softmax_cross_entropy_with_logits (labels = y_, logits = y_conv) vergleicht das korrekte Label (y_) mit dem geschätzten Wert (y_conv)

Stellen Sie die Lernmethode mit tf.train.AdamOptimizer (1e-4) .minimize (cross_entropy) ein. Diesmal AdamOptimizer

cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  for i in range(20000):
    batch = mnist.train.next_batch(50)
    if i % 100 == 0:
      train_accuracy = accuracy.eval(feed_dict={
          x: batch[0], y_: batch[1], keep_prob: 1.0})
      print('step %d, training accuracy %g' % (i, train_accuracy))
    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

  print('test accuracy %g' % accuracy.eval(feed_dict={
      x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

Komplettes Programm

Hier ist eine Zusammenfassung des obigen Ablaufs

mnist_cnn.py


from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot = True)

import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None,10])

W = tf.Variable(tf.zeros([783, 10]))
b = tf.Variable(tf.zeros([10]))

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
    
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)
    
def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')
    
def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
    
W_conv1 = weight_variable([5,5,1,32])
b_conv1 = bias_variable([32])

x_image = tf.reshape(x, [-1, 28, 28, 1])

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

W_conv2 = weight_variable([5,5,32,64])
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

W_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  for i in range(20000):
    batch = mnist.train.next_batch(50)
    if i % 100 == 0:
      train_accuracy = accuracy.eval(feed_dict={
          x: batch[0], y_: batch[1], keep_prob: 1.0})
      print('step %d, training accuracy %g' % (i, train_accuracy))
    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

  print('test accuracy %g' % accuracy.eval(feed_dict={
      x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

Ausgabe


step 0, training accuracy 0
step 100, training accuracy 0.9
step 200, training accuracy 0.9
~~~~~~~~~~~~~~~~Abkürzung~~~~~~~~~~~~~~~~~
step 19900, training accuracy 1
test accuracy 0.9916

99% !! Die Genauigkeit wurde verbessert, da sie beim letzten Mal 92% betrug.

Recommended Posts

TensorFlow Tutorial Ich habe CNN 4th ausprobiert
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe das 2. TensorFlow-Tutorial ausprobiert
TensorFlow Tutorial Ich habe MNIST 3rd ausprobiert
Ich habe versucht, TensorFlow auszuführen
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe das MNIST-Tutorial von tensorflow für Anfänger ausprobiert.
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
TensorFlow Tutorial Tutorial
Ich habe ein Convolutional Neural Network (CNN) mit einem TensorFlow-Tutorial zur Cloud9-Klassifizierung handgeschriebener Bilder ausprobiert.
Ich habe versucht, das TensorFlow-Tutorial mit Kommentaren auszuführen (_TensorFlow_2_0_Einführung für Anfänger).
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, CNN mit Resnet fein abzustimmen
Ich habe versucht zu kratzen
Ich habe PyQ ausprobiert
Ich habe AutoKeras ausprobiert
Ich habe es mit Papiermühle versucht
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Ich habe mit TensorFlow eine nicht negative Matrixzerlegung (NMF) versucht
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe das TensorFlow-Tutorial (MNIST für Anfänger) zur Cloud9-Klassifizierung handgeschriebener Bilder ausprobiert.
Ich habe das TensorFlow-Tutorial mit Kommentaren ausgeführt (Textklassifizierung von Filmkritiken).
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Pymc auszuführen
Ich habe ARP-Spoofing ausprobiert
Ich habe versucht, aiomysql zu verwenden
Ich habe Python> autopep8 ausprobiert
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe PyCaret2.0 (pycaret-nightly) ausprobiert.
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, TensorFlow in der AWS Lambda-Umgebung auszuführen: Vorbereitung
Ich habe versucht, tief zu lernen
Ich habe AWS CDK ausprobiert!
Ich habe versucht, Ipython zu verwenden
Ich habe versucht zu debuggen.
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
[TensorFlow] Ich habe versucht, KI in Fahrzeugeisen einzuführen
Ich habe Kivys Kartenansicht ausprobiert
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, EfficientDet zu verschieben
Ich habe versucht, Shell zu programmieren