TensorBoard-可視化工具快速入門

TensorBoard-可視化工具快速入門


訓練GAN太難訓練了,loss數值跳來跳去,跳的我眼花。就想有沒有可視化的工具,看着loss曲線應該會直觀很多。對TensorBoard早有耳聞,用了之後,果然名不虛傳,太方便了。
因爲我暫時對於TensorBoard的需求只限於看loss曲線,所以這篇文章起到的作用只是快速入門上手,要進一步探索TensorBoard的話,可能還需要看看介紹的其他比較全面的文章。

前言

TensorBoard 是 TensorFlow提供的一組可視化工具(a suite of visualization tools),可以幫助開發者方便的理解、調試、優化TensorFlow 程序。TensorBoard可以將模型訓練過程中的各種彙總數據展示出來,包括標量(Scalars)、圖片(Images)、音頻(Audio)、計算圖(Graphs)、數據分佈(Distributions)、直方圖(Histograms)和潛入向量(Embeddigngs)。

可視化流程

tensorflow代碼執行的過程是先構建圖Graph,然後在執行會話Session。
可視化的具體流程如下:

  • 1.先建立一個graph
  • 2.確定要在graph中的哪些節點放置summary operations以記錄信息
    使用tf.summary.scalar記錄標量
    使用tf.summary.histogram記錄數據的直方圖
    使用tf.summary.distribution記錄數據的分佈圖
    使用tf.summary.image記錄圖像數據
  • 3.operations並不會去真的執行計算,除非你告訴他們需要去run,或者它被其他的需要run的operation所依賴。而我們上一步創建的這些summary operations其實並不被其他節點依賴,因此,我們需要特地去運行所有的summary節點。但是呢,一份程序下來可能有超多這樣的summary 節點,要手動一個一個去啓動自然是及其繁瑣的,因此我們可以使用tf.summary.merge_all去將所有summary節點合併成一個節點,只要運行這個節點,就能產生所有我們之前設置的summary data。
  • 4.使用tf.summary.FileWriter將運行後輸出的數據都保存到本地磁盤中
  • 5.運行整個程序,並在命令行輸入運行tensorboard的指令,之後打開web端可查看可視化的結果

具體廢話不說了,這邊用兩個例子說明吧,畢竟代碼這東西要實操過後才能領悟到真諦。.

例子1

這個例子算是最簡單的了,可以嘗試是怎麼打開TensorBoard的
先貼代碼:

import tensorflow as tf
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
c = tf.multiply(a, b, name="mul_c")
d = tf.add(a, b, name="add_d")
e = tf.add(c, d, name="add_e")
sess = tf.Session()
sess.run(e)
writer = tf.summary.FileWriter("logs", tf.get_default_graph())
writer.close()

注意一下:保存FileWriter文件的目錄必須是英文的,不然到時候web端可能報錯說No dashboards are active for the current data set.
No dashboards are active for the current data set.報錯解決全集參考:(最全)No dashboards are active for the current data set. 解決tensorboard無法啓動和顯示問題
代碼運行後可以看到logs 目錄下多了個文件:
在這裏插入圖片描述
然後在logs 目錄下運行終端,輸入命令
tensorboard --logdir="E:\Image_processing_based_on_DL\Panoramic_Reconstruction\demo\logs"
在這裏插入圖片描述
運行之後就會出現一個web地址,打開這個web地址就可以看到TensorBoard的可視化界面了
在這裏插入圖片描述
如上圖所示:我們能通過TensorBoard上看到代碼的網絡結構圖

例子2

這個例子主要是爲了展示TensorBoard可視化訓練過程中loss曲線效果的,要在自己訓練代碼上增加訓練過程可視化的話可以參考這個代碼修改。
代碼如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

def add_layer(inputs, in_size, out_size, n_layer, activation_funtion=None):
    layer_name = 'layer%s' % n_layer
    with tf.name_scope('layer'):
        with tf.name_scope('weight'):
            Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')
            tf.summary.histogram(layer_name + '/Weights', Weights)  # 各層網絡權重,偏置的分佈,用histogram_summary函數
        with tf.name_scope('biases'):
            biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
            tf.summary.histogram(layer_name + '/biases', biases)
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b = tf.matmul(inputs, Weights) + biases  # inputs與weight 順序不能換
        if activation_funtion is None:
            output = Wx_plus_b
        else:
            output = activation_funtion(Wx_plus_b)
        tf.summary.histogram(layer_name + '/output', output)
    return output
x_data = np.linspace(-1, 1, 300, dtype=np.float32)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise
with tf.name_scope('inputs'):
    xs = tf.placeholder(tf.float32, [None, 1], name='x_in')
    ys = tf.placeholder(tf.float32, [None, 1], name='y_in')

l1 = add_layer(xs, 1, 10, n_layer=1, activation_funtion=tf.nn.relu)
prediction = add_layer(l1, 10, 1, n_layer=2, activation_funtion=None)
# loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
#                     reduction_indices=[1]))
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.square(ys - prediction))
    tf.summary.scalar('loss', loss)  # 數值如學習率,損失函數用scalar_summary函數,tf.scalar_summary(節點名稱,獲取的數據)
optimizer = tf.train.GradientDescentOptimizer(0.1)
with tf.name_scope('train'):
    train = optimizer.minimize(loss)
init = tf.global_variables_initializer()  # 替換成這樣就好
sess = tf.Session()
sess.run(init)
# 整個圖經常需要檢測許許多多的值,也就是許多值需要summary operation,一個個去run來啓動太麻煩了,所以就合併所有獲得的值
merged = tf.summary.merge_all()  # 合併所有的summary data的獲取函數,merge_all 可以將所有summary全部保存到磁盤,以便tensorboard顯示。如果沒有特殊要求,一般用這一句就可一顯示訓練時的各種信息了。
writer = tf.summary.FileWriter("logs/", sess.graph)  # 把圖保存到一個路徑,FileWriter從tensorflow獲取summary data,然後保存到指定路徑的日誌文件中
for i in range(1000):
    sess.run(train, feed_dict={xs: x_data, ys: y_data})
    if i % 50 == 0:
        # summary的操作對於整個圖來說相當於是外設,因爲tensorflow是由結果驅動的,而圖的結果並不依賴於summary操作,所以summary操作需要被run
        rs = sess.run(merged,
                      feed_dict={xs: x_data, ys: y_data})  # 運行所有合併所有的圖,獲取summary data函數節點和graph是獨立的,調用的時候也需要運行session
        writer.add_summary(rs, i)  # 把數據添加到文件中,每一次run的信息和得到的數據加到writer裏面,主要是描述數據變化,所以要這樣,若是隻有流圖,就不需要這樣
        # print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))

跟例子1類似,運行後用終端或者命令行打開TensorBoard
可以看到,實時的loss曲線
在這裏插入圖片描述
好了,這樣就暫時是入門了,TensorBoard的功能強大,很多功能就等着大家進一步探索了。

參考

[1] TensorBoard
[2] Tensorboard踩坑記
[3] TensorFlow學習(一)——tensorboard ,可視化(如製作loss損失變化圖【重要】)summary/scalar/histogram/FileWriter
[4] [乾貨|實踐] TensorBoard可視化
[5] (最全)No dashboards are active for the current data set. 解決tensorboard無法啓動和顯示問題
碼字不易,如果您覺得有幫助,麻煩幫我點個贊~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章