TensorFlow學習(一)——tensorboard,可視化(如製作loss損失變化圖【重要】)summary/scalar/histogram/FileWriter

TensorFlow開發了一個特別有用的可視化工具包:TensorBoard,既可以顯示網絡結構,又可以顯示訓練和測試過程中各層參數的變化情況,也是現實神經網絡流程圖,分爲四個部分,第一部分介紹步驟,第二部分是完整代碼,第三部分是運行結果。

第一部分:基本步驟

A、神經網絡流程圖

所有流程圖需要添加如下小部件:,網絡層層(layer),輸入(input-x,input-y),權重(weights),偏置(biases),網絡層的輸出(outputs),損失函數(loss),訓練(train),實例如下:只需添加tf.name_scope()函數就行,tf.name_scope(名字),

with tf.name_scope('weight'):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]),name='W')
with tf.name_scope('biases'):
    biases=tf.Variable(tf.zeros([1,out_size])+0.1,name='b')
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')

 完成所有添加小部件以後,最後添加tf.summary.FileWriter("logs/", sess.graph)。#把圖保存到一個路徑,FileWriter從tensorflow獲取summary data,然後保存到指定路徑的日誌文件中。logs/是保存在默認路徑logs文件夾下。如不理解可以看後面的完整代碼,具體代碼如下:

writer=tf.summary.FileWriter("logs/",sess.graph)

B、權重偏置等參數變化情況圖

各層網絡權重,偏置的分佈,用summary.histogram函數

做權重偏置等參數變化圖,只需在權重和偏置下面添加tf.summary.histogram(節點名稱,獲取的數據)函數。 具體d代碼如下:

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)
註釋:layer_name是自定義參數,爲網絡層的數量。具體可以看後面的完整代碼。

其他幾種summary data也是同樣的方式獲取,只是對應的獲取函數名稱換一下。完成添加summary.histogram函數後,就需要合併所有的summary data的函數。

這些獲取summary data函數節點和graph是獨立的,調用的時候也需要運行session。當需要獲取的數據較多的時候,我們一個一個去保存獲取到的數據,以及一個一個去運行會顯得比較麻煩。tensorflow提供了一個簡單的方法,就是合併所有的summary data的獲取函數。採用tf.summary.merge_all()lai來合併所有summary data獲取函數。具體代碼如下:

 
merged=tf.summary.merge_all()#合併所有的summary data的獲取函數,merge_all 可以將所有summary全部保存到磁盤,以便tensorboard顯示。
writer=tf.summary.FileWriter("logs/",sess.graph)#把圖保存到一個路徑,FileWriter從tensorflow獲取summary data,

summary的操作對於整個圖來說相當於是外設,因爲tensorflow是由結果驅動的,而圖的結果並不依賴於summary操作,所以summary操作需要被run,所以添加如下代碼

 rs=sess.run(merged,feed_dict={xs:x_data,ys:y_data})#運行所有合併所有的圖

最後把每一次run的信息和得到的數據加到writer裏面。代碼如下:i代表迭代次數,具體可以看完成代碼。

writer.add_summary(rs,i)#把數據添加到文件中,每一次run的信息和得到的數據加到writer裏面

C:loss損失變化圖

數值如學習率,損失函數用scalar_summary函數。tf.scalar_summary(節點名稱,獲取的數據)

具體的和權重偏置變化圖類似,只是將tf.summary.histogram函數改成tf.summary.scalar().。若只需要單獨要畫loss損失變化圖,需要添加一個histogram類的圖,不然會報錯。

 
    loss=tf.reduce_mean(tf.square(ys-prediction))
    tf.summary.scalar('loss',loss)  #數值如學習率,損失函數用scalar_summary函數

不懂可以看完整代碼。

2、完整代碼

 
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}))

 

3.運行結果

最後在你的terminal(終端)中 ,跳到你的logs文件夾在的路徑下,然後輸入如下命令,

tensorboard --logdir logs

具體情況如下:

同時將終端中輸出的網址複製到Google Chrome瀏覽器中,便可以看到之前定義的視圖框架了。

流程圖:

偏置權重變化圖:

loss變化圖

可能會遇到的問題 

(1) 而且與 tensorboard 兼容的瀏覽器是 “Google Chrome”. 使用其他的瀏覽器不保證所有內容都能正常顯示.

(2) 請確保你的 tensorboard 指令是在你的 logs 文件根目錄執行的. 如果在其他目錄下, 比如 Desktop 等, 可能不會成功看到圖. 比如在下面這個目錄, 你要 cd 到 project 這個地方執行 /project > tensorboard --logdir logs

(3)若是打不開網頁,請把360衛士退出來

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