Je voulais vérifier le processus de pliage et de mise en commun de TensorFlow, donc je l'ai envoyé à TensorBoard. C'est un mémo de la méthode de confirmation d'image à ce moment-là. En guise de prémisse, veuillez vous référer à [[Introduction to TensorBoard] Visualiser le traitement TensorFlow pour approfondir la compréhension] pour une utilisation de base. Environnement: python3.5 tensorflow1.21
- Installer TensorFlow sur Windows Easy pour les débutants Python
- [Explication pour les débutants] Syntaxe et concept de base de TensorFlow
- [Explication pour les débutants] Tutoriel TensorFlow MNIST (pour les débutants)
- [Introduction à TensorBoard] Visualisez le traitement TensorFlow pour approfondir la compréhension
- [Introduction à TensorBoard: Projecteur] Rendre le traitement TensorFlow cool
- [TensorFlow Tutorial MNIST (pour les débutants) visualisé avec TensorBoard] (http://qiita.com/FukuharaYohei/items/2834cc054a8b8884e150)
- [Explication pour les débutants] Tutoriel TensorFlow Deep MNIST
- Mémo API TensorFlow
- Les traits du visage de Yuki Kashiwagi pour comprendre TensorFlow [Partie 1]
Écrivons un code qui ne regarde que les caractères numériques manuscrits (MNIST).
import tensorflow as tf
sess = tf.InteractiveSession()
#Lire les données MNIST
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
#Répertoire de sortie des informations TensorBoard
log_dir = '/tmp/tensorflow/test/tensorboard_image01'
#Supprimez le répertoire spécifié s'il existe et recréez-le
if tf.gfile.Exists(log_dir):
tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)
#Espace réservé pour mettre les données d'image
x = tf.placeholder(tf.float32, shape=[None, 784])
#Convertir les images en 28x28 et produire 10 en Tensorboard
_ = tf.summary.image('image', tf.reshape(x, [-1, 28, 28, 1]), 10)
merged = tf.summary.merge_all()
#Obtenir une image minuscule
batch = mnist.train.next_batch(10)
#Courir
summary = sess.run(merged, feed_dict={x: batch[0]})
#Traitement de l'écrivain
summary_writer = tf.summary.FileWriter(log_dir, sess.graph)
summary_writer.add_summary(summary)
summary_writer.close()
Puis lancez Tensorboard. Puisque mon environnement est construit avec Anaconda, je démarre d'abord Terminal à partir d'Anaconda Navigator.
Ensuite, démarrez Tensorbaord depuis Terminal en spécifiant le répertoire (le répertoire est stocké dans la variable de programme Python log_dir).
tensorboard --logdir=/tmp/tensorflow/mnist/logs/simple01
Après le lancement, ouvrez http: // localhost: 6006 / dans votre navigateur pour afficher l'écran TensorBoard.
Je me fâche avec "Aucune donnée scalaire n'a été trouvée", mais cette fois, il n'y a pas de problème car le scalaire n'est pas sorti et seule la sortie graphique est utilisée. Vous pouvez voir les images en sélectionnant "Images" dans le menu à l'écran.
Lit et génère un fichier local. Pour la méthode de lecture de fichier local, je me suis référé à l'article "Préparation à la lecture de l'ensemble de données d'origine".
import tensorflow as tf
sess = tf.InteractiveSession()
#Répertoire de sortie des informations TensorBoard
log_dir = '/tmp/tensorflow/test/tensorboard_image02'
#Supprimez le répertoire spécifié s'il existe et recréez-le
if tf.gfile.Exists(log_dir):
tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)
#Emplacement du fichier("C:\\"Parce que la pièce s'est échappée"\"Notez qu'il y a deux)
jpg = tf.read_file('C:\\Users\yohei.fukuhara\Pictures\Saved Pictures\Sample Pictures\Koala.jpg')
#Décodage de fichier JPEG(tf.image.decode_png et tf polyvalent.image.decode_Il y a aussi une image)
img_raw = tf.image.decode_jpeg(jpg, channels=3)
#Obtenir la taille de l'image(Peut également être confirmé à partir des propriétés du fichier image)
img_shape = tf.shape(img_raw)
#Image de sortie vers Tensorboard
_ = tf.summary.image('local', tf.reshape(img_raw, [-1, img_shape[0], img_shape[1], img_shape[2]]), 1)
merged = tf.summary.merge_all()
#Courir
summary = sess.run(merged)
#Traitement de l'écrivain
summary_writer = tf.summary.FileWriter(log_dir, sess.graph)
summary_writer.add_summary(summary)
summary_writer.close()
Le résultat sortira.
C'est finalement le sujet principal. Nous examinerons le processus de pliage et de mise en commun dans le tutoriel expert. Le code est ci-dessous.
import tensorflow as tf
sess = tf.InteractiveSession()
#Lire les données MNIST
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
#Répertoire de sortie des informations TensorBoard
log_dir = '/tmp/tensorflow/mnist/logs/mnist_expert_images'
#Supprimez le répertoire spécifié s'il existe et recréez-le
if tf.gfile.Exists(log_dir):
tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)
# Input placeholders &Conversion d'image
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')
#Convertir l'image en 28x28
x_image = tf.reshape(x, [-1, 28, 28, 1])
tf.summary.image('preprocess', x_image, 10)
#Fonction qui traite les variables et produit TensorBoard
def variable_summaries(var):
#Résumé des variables
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var) #Sortie scalaire(moyenne)
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) #Sortie scalaire(écart-type)
tf.summary.scalar('max', tf.reduce_max(var)) #Sortie scalaire(Valeur maximum)
tf.summary.scalar('min', tf.reduce_min(var)) #Sortie scalaire(valeur minimum)
tf.summary.histogram('histogram', var) #Sortie d'histogramme
#Valeur pondérée
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1) #Écart type 0.Distribution normale, nombre aléatoire de 1
return tf.Variable(initial)
#Valeur de biais
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape) #Valeur initiale 0.1 constante
return tf.Variable(initial)
#Processus de pliage
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ère couche
with tf.name_scope('1st_layer'):
#1ère couche de convolution
with tf.name_scope('conv1_layer'):
with tf.name_scope('weight'):
W_conv1 = weight_variable([5, 5, 1, 32])
variable_summaries(W_conv1)
#Tenseur[5,5,1,32]De[32,5,5,1]Et sortie d'image
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)
#Tenseur[-1,28,28,32]De[-1,32,28,28]Et la conversion de commande,[-1]Quand[-32]Fusionner et afficher l'image
tf.summary.image('convolved', tf.reshape(tf.transpose(h_conv1,perm=[0,3,1,2]),[-1,28,28,1]), 10)
#1ère couche de mise en commun
with tf.name_scope('pool1_layer'):
h_pool1 = max_pool_2x2(h_conv1)
#Tenseur[-1,14,14,32]De[-1,32,14,14]Et la conversion de commande,[-1]Quand[32]Fusionner et afficher l'image
tf.summary.image('pooled', tf.reshape(tf.transpose(h_pool1,perm=[0,3,1,2]),[-1,14,14,1]), 10)
#2ème couche
with tf.name_scope('2nd_layer'):
#2ème couche de convolution
with tf.name_scope('conv2_layer'):
with tf.name_scope('weight'):
W_conv2 = weight_variable([5, 5, 32, 64])
variable_summaries(W_conv2)
#Tenseur[5,5,32,64]De[32*64,5,5,1]Et sortie d'image
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)
#Tenseur[-1,14,14,64]De[-1,64,14,14]Et la conversion de commande,[-1]Quand[64]Fusionner et afficher l'image
tf.summary.image('convolved', tf.reshape(tf.transpose(h_conv2,perm=[0,3,1,2]),[-1,14,14,1]), 10)
#2ème couche de pooling
with tf.name_scope('pool2_layer'):
h_pool2 = max_pool_2x2(h_conv2)
#Tenseur[-1,7,7,64]De[-1,64,7,7]Et la conversion de commande,[-1]Quand[64]Fusionner et afficher l'image
tf.summary.image('pooled', tf.reshape(tf.transpose(h_pool2,perm=[0,3,1,2]),[-1,7,7,1]), 10)
#Couche étroitement couplée
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)
#Abandonner
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)
#Lire la couche
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)
#Entropie croisée(Entropie croisée)Calcul
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)
#Entraînement
with tf.name_scope('train'):
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
#Calcul du taux de réponse correct
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)
#Afficher tout le résumé
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph) #Données d'entraînement
test_writer = tf.summary.FileWriter(log_dir + '/test') #données de test
#Initialisation
tf.global_variables_initializer().run()
#Répéter l'entraînement / le test
for i in range(3000):
batch = mnist.train.next_batch(50)
#Détails de la trace d'entraînement toutes les 100 fois
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))
#Tester toutes les 100 fois
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)
#Rédaction des résultats de formation
summary, _ = sess.run([merged, train_step], feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
train_writer.add_summary(summary, i)
#Sortie du résultat final du test
print('test accuracy %g' % accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
#Rédacteur fermé
train_writer.close()
test_writer.close()
résultat Il est regroupé par nom (entrée, 1er_couche, 2e_couche). Voir aussi l'article "[Explication for Beginners] TensorFlow Tutorial Deep MNIST".
Il est bon de pouvoir produire des images selon les étapes de la formation.
Recommended Posts