tensorflowのチュートリアルにあるMNISTの手書き数字の学習をやってみたいと思います

見える化させたいので、tensorboardで下記の2つを実施します
  • 入力に使われている画像を10個出力
  • 学習過程での正解率と損失関数の値をグラフ化

ソースコード

参考サイトを見ながら書きました。

tensorboardに出力するためのmerge単位を分けています
  • merged_scalar(正解率と損失関数) 
  • merged_image(入力画像) 
mnist.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf

# MNISTのデータを読み込む
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# tfセッションの作成
sess = tf.InteractiveSession()

# TensorBoardのデータ格納ディレクトリ
log_dir = '/conteiner_share/tool/tensorflow/tensorboard/'

# log_dirがあれば削除し、再作成
if tf.gfile.Exists(log_dir):
    tf.gfile.DeleteRecursively(log_dir)
tf.gfile.MakeDirs(log_dir)

# Model
#  x : 入力画像データを入れるプレースホルダー
#  W : 結合の強さ
#  b : バイアス
#  y : softmax処理結果
x = tf.placeholder(tf.float32, [None, 784],name='x')
W = tf.Variable(tf.zeros([784, 10]),name='W')
b = tf.Variable(tf.zeros([10]),name='b')
y = tf.nn.softmax(tf.matmul(x, W) + b,name='y')

# 損失関数
#  y_ : 正解を入れるプレースホルダー
#  cross_entroyp : 損失関数。ここでは交差エントロピーを使う
y_ = tf.placeholder(dtype=tf.float32, shape=[None, 10], name='y_')
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
#  tensorboradにグラフ表示させる
mnist_cross_entropy = tf.summary.scalar('cross_entropy',cross_entropy)

# 勾配降下アルゴリズム
#  最適パラメータを探すための更新アルゴリズム。ここでは勾配下降アルゴリズム
#  を使って、損失関数である交差エントロピーが最小となるパラメータを探す
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# 訓練モデルの評価関数
#  correct_prediction : 正解とモデルが出した答えがあっているかどうかを、ブール値のリスト
#                      [True,False,True,False,....]で返却する
#     tf.argmax(y,1) はモデルが各入力に対して最も尤もらしい(= 一番ありそう)と考えるラベル
#     tf.argmax(y_,1) は正解のラベル
#  accuracy : correct_prediction の結果を浮動小数点数値にキャストして平均を取る。
#            例えば、[True, False, True, True] は [1,0,1,1] ですから、平均は 0.75
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#  tensorboradにグラフ表示させる
mnist_accuracy = tf.summary.scalar('accuracy',accuracy)

# imageデータとしてtensorbordに表示させる。
# 28*28のデータに変換して10件表示
#image_num_max = tf.constant(10, tf.int32, name='image_num_max')
image_num_max = 10
mnist_image = tf.summary.image('image', tf.reshape(x, [-1, 28, 28, 1]), image_num_max)

# 表示したいデータをマージする
merged_scalar = tf.summary.merge([mnist_cross_entropy,mnist_accuracy])
merged_image  = tf.summary.merge([mnist_image])

# Tensorboard表示のためのWriterを作成
writer = tf.summary.FileWriter(log_dir, sess.graph)

# 変数の初期化
init = tf.global_variables_initializer()
sess.run(init)

# 訓練
#  1000回実行する
#  1回あたり100個のランダムデータと正解データをバッチ取得して
#  プレースホルダー(x,y_)に渡す
#  勾配降下アルゴリズムにより、交差エントロピーを最小にするような
#  最適なパラメータを探す
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    #train_step.run({x: batch_xs, y_: batch_ys})
    # グラフ表示させる
    summary, _ = sess.run([merged_scalar,train_step],{x: batch_xs, y_: batch_ys})
    writer.add_summary(summary,i)

# 訓練モデルのテスト
#
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))

# インプットされている手書きイメージをTensorbordに出力するための処理
#  minst画像の取得
batch = mnist.train.next_batch(image_num_max)
#  画素取得の実行
summary2 = sess.run(merged_image, feed_dict={x: batch[0]})
#  Writer処理
writer.add_summary(summary2)


tensorboardの表示

入力画像

WS2018-06-01_12_51_20000000
WS2018-06-01_12_51_48000000





計算モデル

WS2018-06-01_12_59_28000000
こっちは勾配下降アルゴリズムのモデルです

WS2018-06-01_12_59_41000000





損失関数と正解率のグラフ

正解率(accuracy)は右肩上がりで、正しく答えられるようになっています
損失関数(cross_entropy)は右肩下がりで、正解データとの誤差が少なくなっていま
WS2018-06-01_13_01_57000000







参考サイト