[PYTHON] [Einführung in TensorBoard: image] TensorFlow Visualisieren Sie die Bildverarbeitung, um das Verständnis zu vertiefen

Beschleunigen Sie Ihr Verständnis von TensorFlow mit TensorBoard

Ich wollte den Prozess des Faltens und Poolens von TensorFlow überprüfen und gab ihn daher an TensorBoard aus. Es ist ein Memo der damaligen Bildbestätigungsmethode. Grundlegende Informationen finden Sie unter [[Einführung in TensorBoard] Visualisieren der TensorFlow-Verarbeitung zur Vertiefung des Verständnisses]](http://qiita.com/FukuharaYohei/items/7ea120005f73cf882146). Umgebung: python3.5 tensorflow1.21

Referenzlink

Einfache Logik für TensorBoard (Bild)

Handgeschriebene numerische Zeichen anzeigen (MNIST)

Schreiben wir einen Code, der nur die handgeschriebenen numerischen Zeichen (MNIST) betrachtet.

import tensorflow as tf
sess = tf.InteractiveSession()
#MNIST-Daten lesen
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

#Ausgabeverzeichnis für TensorBoard-Informationen
log_dir = '/tmp/tensorflow/test/tensorboard_image01'

#Löschen Sie das angegebene Verzeichnis, falls vorhanden, und erstellen Sie es neu
if tf.gfile.Exists(log_dir):
    tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)

#Platzhalter zum Einfügen von Bilddaten
x  = tf.placeholder(tf.float32, shape=[None, 784])

#Konvertieren Sie Bilder in 28x28 und geben Sie 10 in Tensorboard aus
_ = tf.summary.image('image', tf.reshape(x, [-1, 28, 28, 1]), 10)
merged = tf.summary.merge_all()

#Holen Sie sich das kleinste Bild
batch = mnist.train.next_batch(10)

#Lauf
summary = sess.run(merged, feed_dict={x: batch[0]})

#Writer-Verarbeitung
summary_writer = tf.summary.FileWriter(log_dir, sess.graph)
summary_writer.add_summary(summary)
summary_writer.close()

Starten Sie dann Tensorboard. Da meine Umgebung mit Anaconda erstellt wurde, starte ich das Terminal zunächst über Anaconda Navigator. 30.TensorFlow_Install01.JPG

Starten Sie dann Tensorbaord vom Terminal aus, indem Sie das Verzeichnis angeben (das Verzeichnis wird in der Python-Programmvariablen log_dir gespeichert).

tensorboard --logdir=/tmp/tensorflow/mnist/logs/simple01

Öffnen Sie nach dem Start http: // localhost: 6006 / in Ihrem Browser, um den TensorBoard-Bildschirm anzuzeigen.

TensorBoardBasic00.JPG

Ich ärgere mich über "Es wurden keine Skalardaten gefunden", aber diesmal gibt es kein Problem, da Skalar nicht ausgegeben wird und nur die Grafikausgabe verwendet wird. Sie können die Bilder anzeigen, indem Sie im Menü auf dem Bildschirm "Bilder" auswählen. 10.MNIST_Images01.JPG

Zeigen Sie das Bild der lokalen Datei an

Erläuterung

Liest und gibt eine lokale Datei aus. Für die lokale Methode zum Lesen von Dateien habe ich auf den Artikel "Vorbereitung zum Lesen des Originaldatensatzes" verwiesen.

import tensorflow as tf
sess = tf.InteractiveSession()

#Ausgabeverzeichnis für TensorBoard-Informationen
log_dir = '/tmp/tensorflow/test/tensorboard_image02'

#Löschen Sie das angegebene Verzeichnis, falls vorhanden, und erstellen Sie es neu
if tf.gfile.Exists(log_dir):
    tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)

#Speicherort("C:\\"Weil das Teil entkommen ist"\"Beachten Sie, dass es zwei gibt)
jpg = tf.read_file('C:\\Users\yohei.fukuhara\Pictures\Saved Pictures\Sample Pictures\Koala.jpg')

#JPEG-Dateidecodierung(tf.image.decode_png und vielseitig tf.image.decode_Es gibt auch ein Bild)
img_raw = tf.image.decode_jpeg(jpg, channels=3)

#Bildgröße abrufen(Kann auch über die Eigenschaften der Bilddatei bestätigt werden)
img_shape = tf.shape(img_raw)

#Bild auf Tensorboard ausgeben
_ = tf.summary.image('local', tf.reshape(img_raw, [-1, img_shape[0], img_shape[1], img_shape[2]]), 1)
merged = tf.summary.merge_all()

#Lauf
summary = sess.run(merged)

#Writer-Verarbeitung
summary_writer = tf.summary.FileWriter(log_dir, sess.graph)
summary_writer.add_summary(summary)
summary_writer.close()

Das Ergebnis wird herauskommen.

20.Local_Images01.JPG

Experten-Tutorial Deep MNIST für Experten

Es ist endlich das Hauptthema. Im Experten-Tutorial werden wir uns den Prozess des Faltens und Poolens ansehen. Der Code ist unten.

import tensorflow as tf
sess = tf.InteractiveSession()
#MNIST-Daten lesen
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

#Ausgabeverzeichnis für TensorBoard-Informationen
log_dir = '/tmp/tensorflow/mnist/logs/mnist_expert_images'

#Löschen Sie das angegebene Verzeichnis, falls vorhanden, und erstellen Sie es neu
if tf.gfile.Exists(log_dir):
    tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)

# Input placeholders &Bildkonvertierung
with tf.name_scope('input'):
    x  = tf.placeholder(tf.float32, shape=[None, 784], name='x-input')
    y_ = tf.placeholder(tf.float32, shape=[None, 10],  name='y-input')

    #Bild in 28x28 konvertieren
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    tf.summary.image('preprocess', x_image, 10)

#Funktion, die Variablen verarbeitet und TensorBoard ausgibt
def variable_summaries(var):

    #Variablenübersicht
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)                      #Skalare Ausgabe(durchschnittlich)
        tf.summary.scalar('mean', mean)
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        tf.summary.scalar('stddev', stddev)             #Skalare Ausgabe(Standardabweichung)
        tf.summary.scalar('max', tf.reduce_max(var))    #Skalare Ausgabe(Maximalwert)
        tf.summary.scalar('min', tf.reduce_min(var))    #Skalare Ausgabe(Mindestwert)
        tf.summary.histogram('histogram', var)          #Histogrammausgabe

#Gewichteter Wert
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)    #Standardabweichung 0.Normalverteilungs-Zufallszahl von 1
    return tf.Variable(initial)

#Vorspannungswert
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)             #Anfangswert 0.1 Konstante
    return tf.Variable(initial)

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

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

#1. Schicht
with tf.name_scope('1st_layer'):

    #1. Faltungsschicht
    with tf.name_scope('conv1_layer'):
        with tf.name_scope('weight'):
            W_conv1 = weight_variable([5, 5, 1, 32])
            variable_summaries(W_conv1)
            
            #Tensor[5,5,1,32]Von[32,5,5,1]Und Bildausgabe
            tf.summary.image('filter', tf.transpose(W_conv1,perm=[3,0,1,2]), 10)

        with tf.name_scope('bias'):            
            b_conv1 = bias_variable([32])
            variable_summaries(b_conv1)
        with tf.name_scope('activations'):            
            h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
            tf.summary.histogram('activations', h_conv1)

            #Tensor[-1,28,28,32]Von[-1,32,28,28]Und Auftragsumwandlung,[-1]Wann[-32]Bild zusammenführen und ausgeben
            tf.summary.image('convolved', tf.reshape(tf.transpose(h_conv1,perm=[0,3,1,2]),[-1,28,28,1]), 10)

#1. Pooling-Schicht
    with tf.name_scope('pool1_layer'):    
        h_pool1 = max_pool_2x2(h_conv1)

        #Tensor[-1,14,14,32]Von[-1,32,14,14]Und Auftragsumwandlung,[-1]Wann[32]Bild zusammenführen und ausgeben
        tf.summary.image('pooled', tf.reshape(tf.transpose(h_pool1,perm=[0,3,1,2]),[-1,14,14,1]), 10)

#2. Schicht
with tf.name_scope('2nd_layer'):
    
    #2. Faltungsschicht
    with tf.name_scope('conv2_layer'):
        with tf.name_scope('weight'):
            W_conv2 = weight_variable([5, 5, 32, 64])
            variable_summaries(W_conv2)

            #Tensor[5,5,32,64]Von[32*64,5,5,1]Und Bildausgabe
            tf.summary.image('filter', tf.reshape(tf.transpose(W_conv2,perm=[2,3,0,1]),[-1,5,5,1]), 20)
        with tf.name_scope('bias'):            
            b_conv2 = bias_variable([64])
            variable_summaries(b_conv2)
        with tf.name_scope('activations'):
            h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
            tf.summary.histogram('activations', h_conv2)
            #Tensor[-1,14,14,64]Von[-1,64,14,14]Und Auftragsumwandlung,[-1]Wann[64]Bild zusammenführen und ausgeben
            tf.summary.image('convolved', tf.reshape(tf.transpose(h_conv2,perm=[0,3,1,2]),[-1,14,14,1]), 10)
    
#2. Pooling-Schicht
    with tf.name_scope('pool2_layer'):
        h_pool2 = max_pool_2x2(h_conv2)
        
        #Tensor[-1,7,7,64]Von[-1,64,7,7]Und Auftragsumwandlung,[-1]Wann[64]Bild zusammenführen und ausgeben
        tf.summary.image('pooled', tf.reshape(tf.transpose(h_pool2,perm=[0,3,1,2]),[-1,7,7,1]), 10)

#Eng gekoppelte Schicht
with tf.name_scope('fc1_layer'):
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    with tf.name_scope('weight'):
        W_fc1 = weight_variable([7 * 7 * 64, 1024])
        variable_summaries(W_fc1)
    with tf.name_scope('bias'):            
        b_fc1 = bias_variable([1024])
        variable_summaries(b_fc1)
    with tf.name_scope('activations'):
        h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
        tf.summary.histogram('activations', h_fc1)

    #Aussteigen
    with tf.name_scope('dropout'):
        keep_prob  = tf.placeholder(tf.float32)
        tf.summary.scalar('dropout_keep_probability', keep_prob)
        h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

#Ebene lesen
with tf.name_scope('fc2_layer'):
    with tf.name_scope('weight'):
        W_fc2 = weight_variable([1024, 10])
        variable_summaries(W_fc2)
    with tf.name_scope('bias'):            
        b_fc2 = bias_variable([10])
        variable_summaries(b_fc2)
    with tf.name_scope('preactivations'):
        y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2
        tf.summary.histogram('preactivations', y_conv)

#Gekreuzte Entropie(Kreuzentropie)Berechnung
with tf.name_scope('cross_entropy'):
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
    tf.summary.scalar("cross_entropy", cross_entropy)

#Ausbildung
with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

#Richtige Berechnung der Antwortrate
with tf.name_scope('accuracy'):
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.summary.scalar('accuracy', accuracy)

#Alle Zusammenfassung ausgeben
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph) #Trainingsdaten
test_writer  = tf.summary.FileWriter(log_dir + '/test')              #Testdaten

#Initialisieren
tf.global_variables_initializer().run()

#Training / Test wiederholen
for i in range(3000):
    batch = mnist.train.next_batch(50)
    
    #Details zur Trainingsverfolgung alle 100 Male
    if i % 100 == 0:
        run_options  = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
        run_metadata = tf.RunMetadata()
        summary, train_accuracy, _   = sess.run([merged, accuracy , train_step],
                                                feed_dict={x: batch[0], y_:batch[1], keep_prob: 1.0},
                                                options=run_options,
                                                run_metadata=run_metadata)
        train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
        train_writer.add_summary(summary, i)
        print('step %d, training accuracy %g' % (i, train_accuracy))
    #Alle 100 Male testen
    elif i % 100 == 99:
        summary_test, train_accuracy = sess.run([merged, accuracy], feed_dict={x: mnist.test.images, y_:mnist.test.labels, keep_prob: 1.0})
        test_writer.add_summary(summary_test, i)
        
    #Schreiben von Trainingsergebnissen
    summary, _ = sess.run([merged, train_step], feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
    train_writer.add_summary(summary, i)

#Endgültige Ausgabe des Testergebnisses
print('test accuracy %g' % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

#Schriftsteller geschlossen
train_writer.close()
test_writer.close()

Ergebnis Es ist nach Namen gruppiert (Eingabe, 1st_layer, 2nd_layer). Siehe auch den Artikel "[Erklärung für Anfänger] TensorFlow Tutorial Deep MNIST".

30.DeepMNISTImanges01.JPG

Es ist gut, Bilder gemäß den Trainingsschritten ausgeben zu können.

30.DeepMNISTImanges02.JPG

Recommended Posts

[Einführung in TensorBoard: image] TensorFlow Visualisieren Sie die Bildverarbeitung, um das Verständnis zu vertiefen
opencv-python Einführung in die Bildverarbeitung
Einführung in Private TensorFlow
[Erklärung für Anfänger] Einführung in die Faltverarbeitung (erklärt in TensorFlow)
[Erklärung für Anfänger] Einführung in die Pooling-Verarbeitung (erklärt in TensorFlow)
Einführung in TensorFlow - Hallo World Edition
Einführung in die Bildanalyse opencv python
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Wahrscheinlich die einfachste Einführung in TensorFlow
Anfänger lesen "Einführung in TensorFlow 2.0 für Experten"
Versuchen Sie, Ihre Tweets zu visualisieren, während Sie BERT Hands-on verstehen
Verwendung der PyTorch-basierten Bildverarbeitungsbibliothek "Kornia"