tensorboard可視化詳細
2019-09-06
1.tensorboard可視化的用途
首要的目的是記錄tensorflow的Graph,tensorflow的Graph其實就是具象化的算法模型;可以認為tensorflow用Graph來替代我們平時自己寫的流程化的模型程序,具體區別就是我們自己寫的程序需要自己進行流程化規范,而tensorflow的Graph設計好后,具體執行流程由tensorflow的Session控制,不需要我們人為去控制流程。
圖的可視化效果可以參考:tensorflow圖可視化
tensorboard還可以記錄和查看模型的過程數據,例如迭代過程中的損失值,准確率,過程中的圖片,學習速率等等過程數據;以前這些數據的可視化之前大多是由開發者自己在模型訓練中記錄數據然后使用matplotlib庫圖像化。
總的可以認為tensorboard可視化的用途:為了更方便 TensorFlow 程序的理解、調試與優化,發布了一套名為 TensorBoard 的可視化工具。您可以用 TensorBoard 來展現 TensorFlow 圖,繪制圖像生成的定量指標圖以及顯示附加數據(如其中傳遞的圖像)。
2.tensorboard可視化的實現過程
tensorboard是一個用來畫圖的工具,但是自己不生產數據,它只是數據的搬運工。數據是來自於tensorflow模型的訓練過程,所以可視化的過程按照時間順序可以分為2個部分:
(1)使用tensorflow訓練算法模型,生成tesorflow的Graph和過程數據,並保存到磁盤中的Events文件中去;
(2)使用tensorboard讀取Graph和這些過程數據,並將它們繪制出來。
2.1 可視化過程圖
具體的實現過程大致如下圖所示:

2.2 如何生成Events文件
(1)創建tensorflow圖;
tensorflow系統會自動維護一個默認的計算圖,所以這里暫不用管;關於計算圖管理可以參照該文章。
(2)在想要的節點下標注總結指令;例如記錄標量:
loss = tf.reduce_mean(loss_list) tf.summary.scalar("loss_value",loss)
(3)將所有的想要的節點信息通過tf.summary.merge_all()打包為一個節點,這里命名為summary__merge_op,隨后創建一個寫入器,為后續的寫入磁盤創建接口;
summary_merge_op = tf.summary.merge_all()
writer = tf.summary.FileWriter("filedir",tf.get_default_graph())
其中“filedir”是保存Events文件的路徑。
(4)在訓練過程中運行打包后的節點,並獲取序列化的節點信息;
sess = tf.Session()
summary_info = sess.run(summary_merge_op)
(5)將序列化的節點信息寫入磁盤中的Events文件,這個操作通過寫入器writer實現;
writer.add_summary(summary_info,step)
3.summary中常用對象和方法的詳解
3.1 summary.op
常見的幾個操作,scalar是用來記錄標量信息,image用來記錄圖片信息,audio用來記錄聲音信息,histogram用來記錄直方圖,以前兩個為例講解。
(1)scalar
summary.scalar( name, tensor, collections=None family=None, )
name:即你給此節點信息賦予的稱呼,str類型,比如損失值可以為“loss_value”,准確率可以為“accuracy”等;無強制要求;
tensor:就是你需要記錄的那個節點;用scalar記錄的只能是標量(一個值的實數);
collections:圖的集合鍵值的可選列表,新的求和op被添加到這個集合中,缺省為[GraphKeys.SUMMARIES];
family:可選項;設置時用作求和標簽名稱的前綴,這影響着TensorBoard所顯示的標簽名;
真正用時一般使用前兩個變量即可。
a = tf.Variable(0,tf.int32,name="a") tf.summary.scalar("parameter",a)
(2)image
tf.summary.image( name, tensor, max_outputs=3, collections=None, family=None )
name:同上
tensor:這里的tensor必須是一個4維的張量,維度分布是[batch_zize, height, width, channels],其中第四維度channels必須是1,3,或4中的一個;
max_output:圖上顯示的批次圖片的最大個數;
3.2 summary.merge_all()
作用是將所有的summary.op操作打包為一個節點,在Session中執行一次打包后的節點操作即等同於將所有的summary.op執行一次;merge_all()會主動尋找所有的summary_op操作。
此操作必須放在所有的summary.op后面。
3.3 summary.FileWriter()
創建一個寫入器,可以通過寫入器將數據信息寫入到磁盤的Events文件中去,
__init__( logdir, graph=None, max_queue=10, flush_secs=120, graph_def=None, filename_suffix=None, session=None )
logdir:Events文件存放路徑,用str表示;
graph:計算圖對象,比如sess.graph;
max_queen:int類型;緩存隊列的大小;
flush_secs:周期,int類型;指的是寫入器將緩存數據寫入磁盤的周期;
graph_def:此值已經棄用,不用管
filename_suffix:
session:
平時工作中,一般僅用前兩個參數
...create a graph... # Launch the graph in a session. sess = tf.Session() # Create a summary writer, add the 'graph' to the event file. writer = tf.summary.FileWriter(<some-directory>, sess.graph)
3.4 writer.add_summary()
writer對象有很多中方法,這里只介紹其中的add_summary方法。
add_summary( summary, global_step=None )
summary:即執行記錄操作后返回的序列化信息,例如summary_info;
global_step:迭代過程在事件上的標號,如果此參數不賦值,那么所有數據將會在一條直線上;
for epoch in range(epochs): summary_info = sess.run(summary_merge_op) writer.add(summary_info,epoch)
add_summary操作並不會將節點信息立馬寫入磁盤,它只是先將節點信息放入寫入器對象的緩存中,最終由寫入器統一寫入磁盤。
4.啟用tensorboard
打開終端cmd;找到存放Events文件的文件夾路徑;輸入
tensorboard --logdir="./log"
其中“./log”是我存放文件的路徑,你需要指定到自己的路徑上去。
如果前面的都沒問題,那么會出現以下的內容:

將途中紅圈框主的內容復制下來,然后在瀏覽器中打開即可:

5.簡單的示例
import tensorflow as tf x = tf.compat.v1.Variable(-5.0,"float",name="x") y = tf.multiply(x,x) #將節點信息加入summary tf.summary.scalar("x_label",x) tf.summary.scalar("pingfang",y) #合並summary.op summary_merge_op = tf.summary.merge_all() #開始繪會話 with tf.Session() as sess: init = tf.global_variables_initializer() #創建寫入器 writer = tf.summary.FileWriter("./log",sess.graph) #變量初始化 sess.run(init) for epoch in range(11): summary_info = sess.run(summary_merge_op) writer.add_summary(summary_info,epoch) #給變量x加1 temp = sess.run(tf.add(x,1.0)) sess.run(tf.assign(x,temp))
