最近在寫tensorflow的程序,想看看訓練過程中損失函數(shù)等變化,打算用用tensorboard。
tensorboard是tensorflow的可視化工具,可以顯示圖、展示中間結(jié)果。
相關(guān)鏈接:https://tensorflow.google.cn/get_started/summaries_and_tensorboard
代碼如下:
tensorboard是tensorflow默認自帶的模塊,專門用來結(jié)果可視化。主要用的就是tf.summary。
1.定義:
這個模塊我們主要使用的就是tf.sumary.histogram和tf.summary.scalar。這兩個類在代碼里類似tf的變量、占位符等,都在圖中定義。
tf.sumary.histogram:直方圖,只要展示tensor的分布,并不能表示tensor的值。
主要參數(shù)如下,
????tf.sumary.histogram(name, values, collections=None, family=None):
? ? name: string,表示在tensorboard顯示的名稱
????values: tensor,一般是多維tensor
? ? collections: 表示將這個類加入到哪個集合中。
? ? family: 類似命名前綴。一般只要你在定義圖的時候進行了命名空間定義,如name_scope、variable_scope,就不需要這family了。
? ? 展示一下我測試時的結(jié)果(大家看個樣子就行了,不要在意結(jié)果是什么樣子)
tf.summary.scalar:標量,只能展示一個實數(shù)值,也就是一般用來顯示準確度、損失等,而不能用來展示訓練好的權(quán)重矩陣或者向量。
參數(shù)和直方圖類似,只是values/tensor必須滿足是單值實數(shù)。
依舊秀一張丑圖:
多條線是因為我跑了很多次。
2.Writer
????writer = tf.summary.FileWriter('./graph',sess.graph)
? ? 這是一個用來保存圖的類,因為如果上一步,你什么要看的(直方圖、標量)都沒有,也是可以展示你的圖的。
? ? 偷懶了,直接上源碼的解釋,logdir 存儲地址,graph 就是定義的圖
def__init__(self,logdir,graph=None,max_queue=10
????????????????????,flush_secs=120,graph_def=None,filename_suffix=None):? ??
? ??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.
????????filename_suffix: A string. Every event file's name is suffixed with
????????`suffix`.
3.打包
? ??merged = tf.summary.merge_all()
? ? 這里就更加不求甚解了,直接把前面第一步定義的summary節(jié)點,打包,便于下面run。這里就不展示參數(shù)什么的了。
4.run
? ??eval_c,eval_summary = sess.run([c,merged])
5.寫入writer
? ??writer.add_summary(eval_summary,i)
? ? 后面的i就是繪制圖的時間(step)軸,如果沒有后面的參數(shù),只會寫最后一個。
? ? 程序的最后記得writer.close()
6.展示
? ? 跑完之后,要展示需要在命令行運行 tensorboard? --logdir="./graph"
? ? 接著用瀏覽器登入http://127.0.0.1:6006/ 就能看結(jié)果,但是一定要關(guān)掉VPN的全局模式,我就因為這個迷茫了半天,不知道自己錯在哪里。