官方介紹:https://tensorflow.google.cn/guide/summaries_and_tensorboardgit
經過pip安裝tensorflow的時候會自動安裝tensorboard,若是後續出現版本不對的狀況,須要根據安裝的tensorflow的版原本安裝對應的tensorboard。windows
TensorBoard 經過讀取 TensorFlow 的事件文件來運行,事件文件能夠經過tf.summary.FileWrite類來建立,TensorFlow 的事件文件包含運行 TensorFlow 時生成的總結數據,總結數據能夠用tf.summary模塊中的方法來建立。瀏覽器
在事件文件建立好以後,要在終端模式中啓動tensorbaord,例如windows系統中在cmd中用命令:tensorboard --logdir=path ,其中path爲事件文件所在的目錄的地址,具體以下圖:網絡
而後經過返回的網址http://DESKTOP-4K4SA9I:6006,在瀏覽器中輸入對應的網址便可,建議用google瀏覽器,最後退出可視化的時候須要關閉終端的tensorboard運行。ide
來看一下tf.summary.FileWriter的構造函數:函數
tf.summary.FileWriter.__init__(self,logdir,graph=None,max_queue=10,flush_secs=120,graph_def=None):
Creates a `FileWriter` and an event file.
Args:
logdir: A string. Directory where event file will be written.(指定事件文件的地址)
graph: A `Graph` object, such as `sess.graph`.(指定是那個圖的的事件)
max_queue: Integer. Size of the queue for pending events and summaries.
flush_secs: Number. How often, in seconds, to flush the pending events and summaries to disk.
graph_def: DEPRECATED: Use the `graph` argument instead.
學習
tf.summary.FileWriter有一個方法FileWriter.add_summary,能夠將訓練過程數據保存在filewriter指定的文件中。測試
爲使用命名空間的可視化效果會比較亂,這裏先來看一下,這裏只在正常代碼中加入了writer=tf.summary.FileWriter(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\tf_board',sess.graph)。優化
代碼:ui
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #讀取手寫字數據 mnist=input_data.read_data_sets(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\MNIST_data',one_hot=True) #設定每次迭代的數據大小 batch_size=100 n_batch=mnist.train.num_examples//batch_size #站位符號 x=tf.placeholder(tf.float32) y=tf.placeholder(tf.float32) #第一層輸入784輸出爲10 w1=tf.Variable(tf.truncated_normal([784,10]),name='w1') b1=tf.Variable(tf.zeros([1,10])+0.001) z1=tf.matmul(x,w1)+b1 input1=tf.nn.softmax(z1) #代價函數 loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=input1)) #Adam梯度降低優化訓練loss train=tf.train.AdamOptimizer(0.001,0.9,0.999).minimize(loss) #初始化 init=tf.global_variables_initializer() #結果存放在bool型列表彙總 correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(input1,1)) #計算準確度 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) with tf.Session() as sess: sess.run(init) #儲存事件文件到指定位置 writer=tf.summary.FileWriter(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\tf_board',sess.graph) #訓練10代 for epoch in range(10): # 每代對數據進行一輪minibatch for batch in range(n_batch): batch_x, batch_y = mnist.train.next_batch(batch_size) # 每一個循環讀取batch_size大小批次的數據 sess.run(train, feed_dict={x: batch_x, y: batch_y}) acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}) # 用測試數據計算準確度 if batch%99==0: print('第%d代%d批次,準確率爲%.6f' % (epoch + 1, batch + 1, acc))
啓動tensorboard:
在瀏覽器中打開:
能夠看到雖然每一個節點的詳細內容都有展示,可是很是的亂,這就是沒有使用命名空間的缺陷。
代碼:
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #讀取手寫字數據 mnist_data=input_data.read_data_sets(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\MNIST_data',one_hot=True) #設定每次迭代的數據大小 batch_size=100 n_batch=mnist_data.train.num_examples//batch_size #站位符號 x=tf.placeholder(tf.float32) y=tf.placeholder(tf.float32) #第一層輸入784輸出爲10 with tf.name_scope(name='layer1'): w1=tf.Variable(tf.truncated_normal([784,10]),name='w1') b1=tf.Variable(tf.zeros([1,10])+0.001) z1=tf.matmul(x,w1)+b1 input1=tf.nn.softmax(z1) #代價函數 with tf.name_scope(name='loss'): loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=input1)) #Adam梯度降低優化訓練loss train=tf.train.AdamOptimizer(0.001,0.9,0.999).minimize(loss) #初始化 init=tf.global_variables_initializer() #結果存放在bool型列表彙總 correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(input1,1)) #計算準確度 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) with tf.Session() as sess: sess.run(init) #儲存事件文件到指定位置 writer=tf.summary.FileWriter(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\tf_board',sess.graph) #訓練10代 for epoch in range(10): # 每代對數據進行一輪minibatch for batch in range(n_batch): batch_x, batch_y = mnist_data.train.next_batch(batch_size) # 每一個循環讀取batch_size大小批次的數據 sess.run(train, feed_dict={x: batch_x, y: batch_y}) acc = sess.run(accuracy, feed_dict={x: mnist_data.test.images, y: mnist_data.test.labels}) # 用測試數據計算準確度 if batch%99==0: print('第%d代%d批次,準確率爲%.6f' % (epoch + 1, batch + 1, acc))
啓動tensorboard:
在瀏覽器中打開:
可見在在配合命名空間使用以後,整個圖層變得更加的簡潔,由於命名空間把分散的節點組合在一塊兒,同時點擊組合起來的部分也能看到裏面的細節。
第二節講了若是用tensorboard來可視化網絡圖,若是咱們正在訓練一個卷積神經網絡,用於識別 MNIST 數據,咱們可能但願記錄隨着時間的推移,學習速度如何變化,以及目標函數如何變化,這就須要用到tensorflow的總結指令了,咱們這裏主要使用總結指令中的tf.summary.scaclar、tf.summary.histogram函數。
tf.summary.scaclar(name,values,collections=None,family=None)
做用:將記錄的標量數據用來構建折線圖。
tf.summary.histogram(name,values,collections=None,family=None)
做用:將記錄的tensor數據用來構建分佈直方圖。
當建立好總結指令後,若是咱們要運行這些指令才能得到對應總結節點總結數據,若是咱們的總結節點多,要一個一個運行會很麻煩,因此通常用tf.summary.merge_all函數將全部的節點合併成一個節點,而後只要運行一次該節點便可。
注意,節點每次只能記錄或添加一個數據,當咱們要畫出準確度折線圖的時候,咱們須要在不一樣的迭代步數中都運行一次總結指令,這樣才能夠記錄不一樣迭代步數的總結數據,而後才能畫出對應的圖。
代碼說明:
這裏只在loss和accuracy中添加了總結指令,用tf.summary.merge_all合併,最後用FileWriter.add_summary添加到指定的時間文件中。
代碼:
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 讀取手寫字數據 mnist_data = input_data.read_data_sets(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\MNIST_data', one_hot=True) # 設定每次迭代的數據大小 batch_size = 100 n_batch = mnist_data.train.num_examples // batch_size # 站位符號 x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) # 建立總結函數,用來記錄總結數據 def variable_summaries(var): mean = tf.reduce_mean(var) tf.summary.scalar('mean', mean) # 總結平均值 tf.summary.scalar('stddev', tf.sqrt(tf.reduce_mean(tf.square(var - mean)))) # 總結方差 tf.summary.histogram('histogram', var) # 總結分佈直方圖數據 # 第一層輸入784輸出爲10 with tf.name_scope(name='layer1'): w1 = tf.Variable(tf.truncated_normal([784, 10]), name='w1') b1 = tf.Variable(tf.zeros([1, 10]) + 0.001) z1 = tf.matmul(x, w1) + b1 input1 = tf.nn.softmax(z1) # 代價函數,並加入總結總結指令 with tf.name_scope(name='loss'): loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=input1)) variable_summaries(loss) # 加入總結中 # Adam梯度降低優化訓練loss with tf.name_scope(name='train'): train = tf.train.AdamOptimizer(0.001, 0.9, 0.999).minimize(loss) # 初始化 init = tf.global_variables_initializer() # 結果存放在bool型列表彙總 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(input1, 1)) # 計算準確度,並加入到總結指令 with tf.name_scope(name='accuracy'): accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) variable_summaries(accuracy) merge_all = tf.summary.merge_all() with tf.Session() as sess: sess.run(init) # 儲存事件文件到指定位置 writer = tf.summary.FileWriter(r'C:\Users\EDZ\.PyCharm2019.1\config\scratches\tf_board', sess.graph) # 訓練20代 for epoch in range(20): # 每代對數據進行一輪minibatch for batch in range(n_batch): batch_x, batch_y = mnist_data.train.next_batch(batch_size) # 每一個循環讀取batch_size大小批次的數據 # 每次迭代中同時執行merge_all與train,表示每一步迭代訓練都進行總結, # 由於run有兩個節點,因此會返回對應兩個節點的結果值,而咱們只要merge_all的值因此另外一個用佔位符_代替 summaries, _ = sess.run([merge_all, train], feed_dict={x: batch_x, y: batch_y}) # acc = sess.run(accuracy, feed_dict={x: mnist_data.test.images, y: mnist_data.test.labels}) # 用測試數據計算準確度 # if batch % 99 == 0: # print('第%d代%d批次,準確率爲%.6f' % (epoch + 1, batch + 1, acc)) # 每一個epoch迭代完以後將總結數據加入到事件文件中 writer.add_summary(summaries, epoch)
啓動tensorboard:
在瀏覽器中打開:
scalar圖是總計記錄的標量畫出來的折線圖,實線爲平滑以後的曲線,虛線爲真實曲線,平滑程度能夠經過左側的Smoothing來調節。注意:若是loss數據波動較大,多是學習率過大形成的。
DISTRIBUTIONS
主要用來展現網絡中各參數隨訓練步數的增長的變化狀況,能夠說是 多分位數折線圖 的堆疊。通常是用來觀測權重weight與偏置biase的。
histogram是分佈直方圖,用來觀測數據的分佈變化的。