1.1基礎之可視化TensorFlow

可視化是認知程序的最直觀方式。

基本概念

  TensorBoard是TensorFlow自帶的一個強大的可視化工具,也是一個web應用程序套件。TensorBoard目前只支持7種可視化,即SCALARS、 IMAGES、AUDIO、GRAPHS、DISTRIBUTIONS、HISTOGRAMS和EMBEDDINGS。

  • SCALARS:展示訓練過程中的準確率、損失值、權重/偏置的變化情況
  • IMAGES:展示訓練過程中記錄的圖像
  • AUDIO:展示訓練過程中記錄的音頻
  • GRAPHS:展示模型的數據流圖,以及訓練在各個設備上消耗的內存和時間
  • DISTRIBUTIONS:展示訓練過程中記錄的數據的分佈圖
  • HISTOGRAMS:展示訓練過程中記錄的數據的柱狀圖
  • EMBEDDINGS:展示詞向量(如Word2vec)後的投影分佈

  TensorBoard通過運行一個本地服務器,來監聽6006端口。但是如何寫可視化的程序呢?可視化時,需要在程序中給必要的節點添加摘要(summary),摘要會收集該節點的數據,並標記上第幾步、時間戳等標識,寫入事件文件(event file)中。tf.summary.FileWriter類用於在目錄中創建事件文件,並且向文件中添加摘要和事件,用來在TensorBoard中展示。比如下面代碼創建FIleWirter和事件文件,會在當前目錄創建一個叫log的文件夾,並把事件文件寫在該目錄裏。

writer = tf.summary.FileWriter("./log", tf.get_default_graph())

示例演示

  我們在程序中添加summary,並一步步展示如何利用Anaconda和TensorBoard實現可視化。

import tensorflow as tf
from numpy.random import RandomState

#定義訓練數據batch的大小
batch_size = 8
#定義神經網絡的參數,隨機初始化
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
#在shape上的一個維度上使用None可以方便使用不同的batch大小
x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
#定義神經網絡前向傳播的過程
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
y = tf.sigmoid(y)
#定義損失函數:交叉熵
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))
     +(1-y_) * tf.log(tf.clip_by_value(1 - y, 1e-10, 1.0)))
#反向傳播算法應用
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

#通過隨機數生成一個數據集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
#認爲x1+x2<1的樣本都認爲是正樣本,用0表示負樣本,1來表示正樣本
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]

loss = tf.placeholder(tf.float32, shape=(1))
loss_summary = tf.summary.scalar("loss", tf.squeeze(loss))

with tf.Session() as sess:
    #初始化變量
    init = tf.global_variables_initializer()
    sess.run(init)
    print("Before training:")
    print(sess.run(w1))
    print(sess.run(w2))

    writer = tf.summary.FileWriter("./log", tf.get_default_graph())

    #設定訓練的次數
    STEPS = 5000
    for i in range(STEPS):
        #每次選取batch_size個樣本進行訓練
        start = (i * batch_size) % dataset_size
        end = min(start + batch_size, dataset_size)
        #通過選取的樣本訓練神經網絡並更新參數
        _, cur_loss = sess.run([train_step, cross_entropy], feed_dict={x: X[start:end], y_: Y[start:end]})

        summary = sess.run(loss_summary, feed_dict={loss: [cur_loss]})

        writer.add_summary(summary, i)

    print("After training:")
    print(sess.run(w1))
    print(sess.run(w2))
    result = sess.run(y, feed_dict={x: [[0.5, 0.3]]})
    print(result)

  程序運行成功後,會在log目錄下寫入一個新的事件文件。
在這裏插入圖片描述
   下面說明如何可視化。打開Anaconda Prompt,激活你用的環境。然後進入事件文件所在的磁盤,並進入事件文件所在目錄的上一級目錄。最後輸入

TensorBoard --logdir=log

完整過程如下圖
在這裏插入圖片描述
  我們在瀏覽器裏輸入 http://localhost:6006,就可以看見我們想看的Tensorboard 可視化頁面
在這裏插入圖片描述

參考資料

  • TensorFlow技術解析與實踐[M]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章