tensorflow框架學習 (七)—— tensorboard可視化工具

 官方介紹:https://tensorflow.google.cn/guide/summaries_and_tensorboardgit

1、關於tensorboard的問題

 

  經過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指定的文件中。測試

  

 


 

 

2、結合命名空間來使用tensorboard構建網絡圖

 

一、未使用命名空間的tensorboard可視化

  爲使用命名空間的可視化效果會比較亂,這裏先來看一下,這裏只在正常代碼中加入了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:

 

在瀏覽器中打開:

 

   能夠看到雖然每一個節點的詳細內容都有展示,可是很是的亂,這就是沒有使用命名空間的缺陷。

 

二、使用命名空間的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:

在瀏覽器中打開:

 

  可見在在配合命名空間使用以後,整個圖層變得更加的簡潔,由於命名空間把分散的節點組合在一塊兒,同時點擊組合起來的部分也能看到裏面的細節。

 


 

 

 

3、tensorflow的總結指令

 

一、總結指令的做用

  第二節講了若是用tensorboard來可視化網絡圖,若是咱們正在訓練一個卷積神經網絡,用於識別 MNIST 數據,咱們可能但願記錄隨着時間的推移,學習速度如何變化,以及目標函數如何變化,這就須要用到tensorflow的總結指令了,咱們這裏主要使用總結指令中的tf.summary.scaclar、tf.summary.histogram函數。

 

二、函數介紹

  tf.summary.scaclar(name,values,collections=None,family=None)

  •   name:名稱。
  •   values:一個數值tensor,用來在直方圖中構建直方圖。

  做用:將記錄的標量數據用來構建折線圖。

 

  tf.summary.histogram(name,values,collections=None,family=None)

  •   name:名稱。
  •   values:一個數值tensor,用來在直方圖中構建分佈直方圖。

  做用:將記錄的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是分佈直方圖,用來觀測數據的分佈變化的。

相關文章
相關標籤/搜索