tensorflowのチュートリアルにあるMNISTの手書き数字の学習をやってみたいと思います
見える化させたいので、tensorboardで下記の2つを実施します
- 入力に使われている画像を10個出力
- 学習過程での正解率と損失関数の値をグラフ化
ソースコード
参考サイトを見ながら書きました。tensorboardに出力するためのmerge単位を分けています
- merged_scalar(正解率と損失関数)
- merged_image(入力画像)
#!/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の表示
入力画像


計算モデル

こっちは勾配下降アルゴリズムのモデルです

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

参考サイト
- TensorFlow : ML 初心者向けの MNIST (コード解説)
- tensorflow MNIST for Beginners 超初心者向け用
- 【TensorBoard入門:image編】TensorFlow画像処理を見える化して理解を深める
- TensorFlow MNIST For ML Beginners チュートリアルの実施
コメント