tensorboard是一個功能強大的可視化工具,這裏簡單的介紹一下tensorboard的使用,首先給出中文社區的教程:http://www.tensorfly.cn/tfdoc/how_tos/summaries_and_tensorboard.html
tensorboard適應於tensorflow的計算圖結構,我們將收集數據看成是tensorflow計算圖中的一個節點,所以使用tensorboard與構建網絡計算圖沒有任何差別,首先介紹幾種可使用的節點。
1.數據記錄節點 tf.summary.scalar/image/histogram()
等
記錄節點用於記錄需要的數據,其中scalar可用於收集損失函數值、準確率等數據,其餘可以翻閱上面給出的教程瞭解詳細,此節點一般直接跟在需要統計的相應計算之後。
2.記錄彙總節點 merged = tf.summary.merge_all()
當你在計算圖中插入了許多記錄節點,使用這個節點將各記錄節點的數據收集起來,該節點一般放在整個計算圖的最後面,由於tensorflow的計算特訓,該節點也可以理解成爲所有的記錄節點添加依賴。
3.記錄(日誌)書寫器 summary_writer = tf.summary.FileWriter("log",tf.get_default_graph())
tensorboard需要將收集到的數據儲存在磁盤上,書寫器將完成這個工作,第一個參數是書寫路徑,第二個是計算圖。
4.運行彙總 summary = sess.run(merged)
運行彙總節點,獲得收集到的信息。
5.寫入磁盤 summary_writer.add_summary(summary, i)
將記錄通過書寫器寫入磁盤,第一個參數是寫的記錄,第二個是該記錄的序列。
6.關閉書寫器 summary_writer.close()
將實例寫入,否則120s寫入一次,該指令一般放在程序最後。
介紹完之後給出一段例程,用tensorboard收集cnn網絡的loss值的變化情況,是在我上一篇博文的cnn網絡代碼的基礎上改動的,有興趣的可以去翻看我的博文。
import tensorflow as tf
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder("float", [None, 784])
y_ = tf.placeholder("float", [None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])
# layer_one
filter_one = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1))
filter_one_bias = tf.Variable(tf.zeros([32]) + 0.1)
filter_one_h = tf.nn.relu(tf.nn.conv2d(x_image, filter_one, strides=[1, 1, 1, 1], padding="SAME") + filter_one_bias)
filter_one_out = tf.nn.max_pool(filter_one_h, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# layer_two
filter_two = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1))
filter_two_bias = tf.Variable(tf.zeros([64]) + 0.1)
filter_two_h = tf.nn.relu(
tf.nn.conv2d(filter_one_out, filter_two, strides=[1, 1, 1, 1], padding="SAME") + filter_two_bias)
filter_two_out = tf.nn.max_pool(filter_two_h, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# full_connect
full_connect_w = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1024], stddev=0.1))
full_connect_bias = tf.Variable(tf.zeros([1024]) + 0.1)
full_connect_out = tf.nn.relu(
tf.matmul(tf.reshape(filter_two_out, [-1, 7 * 7 * 64]), full_connect_w) + full_connect_bias)
# drop_out
keep_drop = tf.placeholder("float")
drop_out = tf.nn.dropout(full_connect_out, keep_drop)
# softmax_loss
w = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1))
b = tf.Variable(tf.zeros([10]) + 0.1)
loss = tf.nn.softmax(tf.matmul(drop_out, w) + b)
cross_entropy = -tf.reduce_sum(y_ * tf.log(loss)) # 計算交叉熵
tf.summary.scalar("loss_function",cross_entropy)
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # 使用adam優化器來以0.0001的學習率來進行微調
correct_prediction = tf.equal(tf.argmax(loss, 1), tf.argmax(y_, 1)) # 判斷預測標籤和實際標籤是否匹配
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
sess = tf.Session() # 啓動創建的模型
merge = tf.summary.merge_all()
sess.run(tf.global_variables_initializer()) # 初始化變量
summary_writer = tf.summary.FileWriter("log",tf.get_default_graph())
for i in range(5000): # 開始訓練模型,循環訓練5000次
batch = mnist.train.next_batch(50) # batch大小設置爲50
if i % 100 == 0:
summary, train_accuracy= sess.run([merge, accuracy],feed_dict={x: batch[0], y_: batch[1], keep_drop: 1.0})
print("step %d, train_accuracy %g" % (i, train_accuracy))
summary_writer.add_summary(summary, i)
sess.run(train_step, feed_dict={x: batch[0], y_: batch[1], keep_drop: 0.5}) # 神經元輸出保持不變的概率 keep_prob 爲0.5
summary_writer.close()
print("test accuracy %g" % accuracy.eval(session=sess,
feed_dict={x: mnist.test.images, y_: mnist.test.labels,
keep_drop: 1.0})) # 神經元輸出保持不變的概率 keep_prob 爲 1,即不變,一直保持輸出
運行完之後,項目目錄下生成了log文件夾,文件夾內有保存好的日誌
下面是在win10下打開tensorboard並讀取該文件
首先在該目錄下打開Powershell,然後輸入tensorboard --logdir=“該文件所在的路徑”
運行後會獲得一個url,在瀏覽器(google瀏覽器)中輸入便可獲得最後結果