作者:譚東
時間:2017年6月10日
環(huán)境:Windows 7
TensorBoard是TensorFlow自帶的可視化結(jié)構(gòu)管理和調(diào)試優(yōu)化網(wǎng)絡(luò)的工具。在我們學(xué)習(xí)深度學(xué)習(xí)網(wǎng)絡(luò)框架時,我們需要更直觀的看到各層網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù),也可以更好的進(jìn)行調(diào)試優(yōu)化網(wǎng)絡(luò)。TensorBoard可以實(shí)現(xiàn)網(wǎng)絡(luò)結(jié)構(gòu)的顯示,也可以進(jìn)行顯示訓(xùn)練及測試過程中各層參數(shù)的變化情況。
我們先看下TensorBoard的大致界面。
我們可以看到頂部有幾個功能分類:SCALARS、IMAGES、AUDIO、GRAPHS等。
SCALARS是訓(xùn)練參數(shù)統(tǒng)計(jì)顯示,可以看到整個訓(xùn)練過程中,各個參數(shù)的變換情況。
官方英文翻譯:
TensorBoard的標(biāo)量儀表板可視化隨時間變化的標(biāo)量統(tǒng)計(jì); 例如,您可能需要跟蹤模型的損失或?qū)W習(xí)率。 如關(guān)鍵概念所述,您可以比較多個運(yùn)行,數(shù)據(jù)按標(biāo)簽組織。 折線圖具有以下交互作用:
此外,您可以通過在儀表板左上角的框中編寫正則表達(dá)式來創(chuàng)建新的文件夾來組織標(biāo)簽。
IMAGES輸入和輸出標(biāo)簽。
官方翻譯:
圖像儀表板可以顯示通過tf.image_summary保存的png。 設(shè)置儀表板,使每行對應(yīng)一個不同的標(biāo)簽,每列對應(yīng)一個運(yùn)行。 由于圖像顯示板支持任意的png,您可以使用它將自定義可視化(例如,matplotlib散點(diǎn)圖)嵌入到TensorBoard中。 此儀表板總是顯示每個標(biāo)簽的最新圖像。
AUDIO官方英文翻譯:
音頻儀表板可以嵌入通過tf.audio_summary保存的音頻的可播放音頻小部件。 設(shè)置儀表板,使每行對應(yīng)一個不同的標(biāo)簽,每列對應(yīng)一個運(yùn)行。 此儀表板將為每個標(biāo)簽嵌入最新的音頻。
GRAPH是網(wǎng)絡(luò)結(jié)構(gòu)顯示。
官方英文翻譯:
圖形瀏覽器可以顯示TensorBoard圖形,從而可以檢查TensorFlow模型。 為了最好地利用圖形可視化程序,您應(yīng)該使用名稱范圍來對圖形中的op進(jìn)行分層分組,否則圖形可能難以破譯。 有關(guān)更多信息,包括示例,請參閱圖形可視化程序教程。
HISTOGRAM是訓(xùn)練過程參數(shù)分布情況顯示。
官方英文翻譯:
直方圖儀表板用于可視化Tensor的統(tǒng)計(jì)分布隨時間變化。它可視化通過tf.histogram_summary記錄的數(shù)據(jù)?,F(xiàn)在,它的名字有點(diǎn)不正確,因?yàn)樗伙@示直方圖;相反,它顯示了一些關(guān)于分配的高級統(tǒng)計(jì)數(shù)據(jù)。圖表上的每一行表示數(shù)據(jù)分布中的百分位數(shù):例如,底線顯示了最小值隨時間變化的方式,中間的行顯示了中位數(shù)的變化。從上到下,行具有以下含義:[最大,93%,84%,69%,50%,31%,16%,7%,最低]。這些百分位數(shù)也可以視為正態(tài)分布的標(biāo)準(zhǔn)偏差邊界:[最大值,μ+1.5σ,μ+σ,μ+0.5σ,μ,μ-0.5σ,μ-σ,μ-1.5σ,最小值]使得從內(nèi)到外讀取的著色區(qū)域分別具有寬度[σ,2σ,3σ]。這種直方圖可視化有點(diǎn)奇怪,不能有意義地表示多模態(tài)分布。我們正在研究一個真正的直方圖替換。
官方英文介紹地址:https://github.com/tensorflow/tensorflow/tree/r0.9/tensorflow/tensorboard
注意,本文是在Windows下運(yùn)行的。
首先我們先寫一個Python代碼,用來運(yùn)行顯示圖形層級結(jié)構(gòu)。
"""
Please note, this code is only for python 3+. If you are using python 2+, please modify the code accordingly.
"""
from __future__ import print_function
import tensorflow as tf
def add_layer(inputs, in_size, out_size, activation_function=None):
# add one more layer and return the output of this layer
with tf.name_scope('layer'):
with tf.name_scope('weights'):
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('Wx_plus_b'):
Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases)
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b, )
return outputs
# define placeholder for inputs to network
with tf.name_scope('inputs'):
xs = tf.placeholder(tf.float32, [None, 1], name='x_input')
ys = tf.placeholder(tf.float32, [None, 1], name='y_input')
# add hidden layer
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer
prediction = add_layer(l1, 10, 1, activation_function=None)
# the error between prediciton and real data
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
reduction_indices=[1]))
with tf.name_scope('train'):
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
sess = tf.Session()
# tf.train.SummaryWriter soon be deprecated, use following
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1: # tensorflow version < 0.12
writer = tf.train.SummaryWriter('C:/logs/', sess.graph)
else: # tensorflow version >= 0.12
writer = tf.summary.FileWriter("C:/logs/", sess.graph)
# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
init = tf.initialize_all_variables()
else:
init = tf.global_variables_initializer()
sess.run(init)
# direct to the local dir and run this in terminal:
# $ tensorboard --logdir=logs
然后點(diǎn)擊Run運(yùn)行Python代碼。
然后CMD打開命令行終端輸入:
tensorboard --logdir=C:/logs
一切正常的話,我們用chrome瀏覽器打開這個地址:
http://localhost:6006/
因?yàn)槲覀兇a只是展示了網(wǎng)絡(luò)層結(jié)構(gòu),并沒有數(shù)據(jù)。所以我們點(diǎn)擊GRAPHS進(jìn)行查看網(wǎng)絡(luò)層結(jié)構(gòu)就可以了。
我們的C盤logs下也有相應(yīng)的日志文件。
更多建議: