Tensorflow:Tensorboard使用

Tensorflow:Tensorboard使用

目錄

前言

TensorFlow是以流動的張量為名的神經網路開發庫,所以Google為了讓人們更直觀的瞭解流動的張量的含義,他們做了個TensorBoard讓我們直觀的看到我們寫的框架是怎麼個流動法的(純屬YY)。好了玩笑話不說,Google是怎麼定義TensorBoard的呢?

The computations you'll use TensorFlow for - 
like training a massive deep neural network - 
can be complex and confusing. 
To make it easier to understand, debug, 
and optimize TensorFlow programs, 
we've included a suite of visualization tools called TensorBoard. 
You can use TensorBoard to visualize your TensorFlow graph,
plot quantitative metrics about the execution of your graph,
and show additional data like images that pass through it.

大意其實就是我剛剛說的,我們使用TensorFlow寫的神經網路直接看上去會顯得十分的複雜和混亂,為了更加直觀的去除錯、優化我們的神經網路,他們開發了TensorBoard–一套視覺化工具,深度學習的視覺化對於理解它究竟學到了什麼有很大的幫助。

Tips:TensorBoard官方支援的瀏覽器是Chrome和Firefox,所以最好使用這兩個瀏覽器去開TensorBoard吧。

視覺化第一步

效果圖

這裡寫圖片描述

我們可以對其進行展開,比如我們展開一個first_layer

WX20170113-152056@2x.png

可以看出來一個layer裡面是多麼複雜的運算過程,其實我們程式碼裡也就幾行程式碼,TensorFlow幫我們完成了很多事情。

看了效果之後有沒有非常想實現它?那麼接下來我們就來學習下怎麼去用TensorBoard去畫出這麼一幅圖~

實現graphs

我們這裡用的程式碼是之前講TensorFlow入門裡最後的擬合曲線的程式碼,程式碼如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
def add_layer(layoutname,inputs,in_size,out_size,activatuib_funaction=None):
Weights=tf.Variable(tf.random_normal([in_size,out_size]))
biases=tf.Variable(tf.zeros([1,out_size])) 0.1
Wx_plus_b=tf.matmul(inputs,Weights) biases
if activatuib_funaction is None:
outputs=Wx_plus_b
else :
outputs=activatuib_funaction(Wx_plus_b)
return outputs
x_data=np.linspace(-1,1,300)[:,np.newaxis]
noise=np.random.normal(0,0.05,x_data.shape)
y_data=np.square(x_data)-0.5 noise
xs=tf.placeholder(tf.float32,[None,1])
ys=tf.placeholder(tf.float32,[None,1])
l1=add_layer('first_layer',xs,1,10,activatuib_funaction=tf.nn.relu)
prediction =add_layer('secend_layer',l1,10,1,activatuib_funaction=None)
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init=tf.global_variables_initializer()
with tf.Session() as sess:
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.show(block=False)
sess.run(init)
for train in range(1000):
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
if train%50==0:
try:
ax.lines.remove(lines[0])
except Exception:
pass
print train,sess.run(loss,feed_dict={xs:x_data,ys:y_data})
prediction_value=sess.run(prediction,feed_dict={xs:x_data})
lines=ax.plot(x_data, prediction_value,'r-',lw=5)
plt.pause(0.1)

我們需要對程式碼進行寫改動,讓其生成Graphs。

從最開始的縮圖,我們可以看到我們有input、兩個layer、一個loss、一個train,那我們第一步先來構建這幾個東西。

我們想要構建這些大的框架,只需要我們在想要顯示的地方加上這句話with tf.name_scope(‘顯示的名字’):然後縮排想要放在裡面的程式碼。如input

我們想要顯示的效果如下圖

這裡寫圖片描述

我們需要用with tf.name_scope(‘input’):把兩個輸入值縮排進去:

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

x_input、y_input這兩個顯示值我們只需要在宣告的時候在最後加一個name=’顯示名’就可以顯示出上面的效果了。

然後兩個layer也是類似,由於我們定義了一個方法去新增層,可是如果我們不給他名字,生成graphs的時候layer就是layer、layer_1、layer_2這樣子,有點不好看,所以我們傳入一個layername。

def add_layer(layoutname,inputs,in_size,out_size,activatuib_funaction=None,):
with tf.name_scope(layoutname):
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 activatuib_funaction is None:
outputs=Wx_plus_b
else :
outputs=activatuib_funaction(Wx_plus_b)
return outputs

layer圖層裡面還有weights和biases、Wx_plus_b等,所以他們也是小圖層,所以我們對他們也要單獨定義,另外給weights,biases給個name值。 激勵函式這些會自動生成,我們不需要去管。

loss和train也是類似,寫完tf.name_scope(”):之後,我們還需要寫檔案,寫檔案的程式碼TensorFlow也幫我們封裝好了,我們只需要呼叫writer=tf.summary.FileWriter(“檔案儲存路徑如:logs/”,sess.graph),完整程式碼:

import tensorflow as tf
import numpy as np
def add_layer(layoutname,inputs,in_size,out_size,activatuib_funaction=None,):
with tf.name_scope(layoutname):
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 activatuib_funaction is None:
outputs=Wx_plus_b
else :
outputs=activatuib_funaction(Wx_plus_b)
return outputs
x_data=np.linspace(-1,1,300)[:,np.newaxis]
noise=np.random.normal(0,0.09,x_data.shape)
y_data=np.square(x_data)-0.05 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("first_layer",xs,1,10,activatuib_funaction=tf.nn.relu)
prediction =add_layer('second_layout',l1,10,1,activatuib_funaction=None)
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)
init=tf.global_variables_initializer()
with tf.Session() as sess:
writer=tf.summary.FileWriter("logs/",sess.graph)
sess.run(init)

由於Graphs展示的是整個神經網路的框架,所以我們可以刪去測試資料。

到這裡程式碼已經寫好了,執行程式碼,生成檔案,我們會發現專案的logs目錄下會多一個檔案

這裡寫圖片描述

生成檔案之後,首先是進入cmd,輸入下面的指令來啟動TensorBoard

python tensorflow/tensorboard/tensorboard.py –logdir=path/to/log-directory

這裡的引數 logdir 指向 SummaryWriter 序列化資料的儲存路徑。如果logdir目錄的子目錄中包含另一次執行時的資料,那麼 TensorBoard 會展示所有執行的資料。一旦 TensorBoard 開始執行,你可以通過在瀏覽器中輸入 localhost:6006 來檢視 TensorBoard。

如果你已經通過pip安裝了 TensorBoard,你可以通過執行更為簡單地命令來訪問 TensorBoard

tensorboard –logdir=/path/to/log-directory

進入 TensorBoard 的介面時,你會在右上角看到導航選項卡,每一個選項卡將展現一組視覺化的序列化資料集 。對於你檢視的每一個選項卡,如果 TensorBoard 中沒有資料與這個選項卡相關的話,則會顯示一條提示資訊指示你如何序列化相關資料。
注意命令:tensorboard –logdir=E:/tensorFlow/Mycode/logs/
然後我們就可以訪問127.0.0.1:6006去檢視TensorBoard,如果沒有資料的話就重新整理一下。到此,我們就成功的使用視覺化的方式檢視我們的神經網路框架了。

後記

TensorFlow配合TensorBoard的Graphs來構建我們的框架確實非常好用,牛逼的Google肯定不會只賦予TensorBoard這一個功能,他能監控我們的訓練過程,讓我們視覺化的看到訓練過程中引數的變化,甚至是影象、音訊的變化,還能展示訓練過程的資料分佈圖,所以tensorboard、TensorFlow博大精深,慢慢學習吧!
PS:感謝周莫煩大神出的[機器學習系列]
需要翻牆觀看