Tensorboard使用

參考網站: https://www.jb51.net/article/134956.htm    較好

背景
在複雜的問題中,網絡往往都是很複雜的。爲了方便調試參數以及調整網絡結構,我們需要將計算圖可視化出來,以便能夠更好的進行下一步的決策。Tensorflow提供了一個TensorBoard工具,可以滿足上面的需求。

介紹
TensorBoard是一個可視化工具,能夠有效地展示Tensorflow在運行過程中的計算圖、各種指標隨着時間的變化趨勢以及訓練中使用到的數據信息。可以查看TensorBoard Github ReadMe 詳細閱讀適應方法。

簡單的例子
下面通過一個簡單的例子來顯示一下使用方式,下面的圖是一個向量加法的圖結構。

import tensorflow as tf
a = tf.constant([1.0,2.0,3.0],name='input1')
b = tf.Variable(tf.random_uniform([3]),name='input2')
add = tf.add_n([a,b],name='addOP')
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    writer = tf.summary.FileWriter("E://TensorBoard//test",sess.graph)
    print(sess.run(add))
writer.close()

運行完程序後,圖結構將以日誌文件的形式保存到給定的路徑下。 
然後在命令行啓動Tensorboard。Tensorboard作爲本地的一個服務已經啓動,端口號是6006,我們只需要在瀏覽器下輸入127.0.0.1:6006就可以進入TensorBoard。下圖分別是Tensorboard的界面,以及上面代碼對用的圖結構。

tensorboard --logdir=E://TensorBoard//test

我們可以簡單對下面的圖結構進行解讀。圖中的橢圓代表操作,陰影代表明明空間,小圓圈代表常量。虛線箭頭代表依賴,實線箭頭代表數據流。 
我們的程序想要完成一個加法操作,首先需要利用random_uniform生成一個3元的向量,輸入到input2變量節點中,然後input2變量節點需要依賴init操作來完成變量初始化。input2節點將結果輸入到addOP操作節點中,同時常量節點input1也將數據輸入到addOP中,最終addOP完成計算。 


添加命名空間
前面的程序,只是一個簡單的加法,但是圖結構卻十分凌亂,而且整個程序的核心add沒有在圖結構中突出,反而是一些初始化的操作佔據了計算圖的主要部分。這樣不利於對計算圖進行分析。因此,我們需要利用一種方式,將計算圖的細節部分隱藏,保留關鍵部分。 命名空間給我們提供了這種機會。 
上面的計算圖中,核心部分是兩個輸入傳遞給加法操作完成計算,因此,我們需要將其他部分隱藏,只保留核心部分。

import tensorflow as tf
with tf.variable_scope('input1'):
    input1 = tf.constant([1.0,2.0,3.0],name='input1')
with tf.variable_scope('input2'):
    input2 = tf.Variable(tf.random_uniform([3]),name='input2')
add = tf.add_n([input1,input2],name='addOP')
with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    writer = tf.summary.FileWriter("E://TensorBoard//test",sess.graph)
    print(sess.run(add))
writer.close()

 
利用同樣的方式,我們可以將MNIST神經網絡代碼重新進行組織(不知道組織的邏輯結構是否正確)

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

batch_size = 100
hidden1_nodes = 200
with tf.name_scope('Input'):
    x = tf.placeholder(tf.float32,shape=(None,784))
    y = tf.placeholder(tf.float32,shape=(None,10))
with tf.name_scope('Inference'):
    w1 = tf.Variable(tf.random_normal([784,hidden1_nodes],stddev=0.1))
    w2 = tf.Variable(tf.random_normal([hidden1_nodes,10],stddev=0.1))
    b1 = tf.Variable(tf.random_normal([hidden1_nodes],stddev=0.1))
    b2 = tf.Variable(tf.random_normal([10],stddev=0.1))
    hidden = tf.nn.relu(tf.matmul(x,w1)+b1)
    y_predict = tf.nn.relu(tf.matmul(hidden,w2)+b2)

with tf.name_scope('Loss'):
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_predict))
with tf.name_scope('Train'):
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
with tf.name_scope('Accuracy'):
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_predict, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(10000):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys})
        if i%1000==0:
            print ('Phase'+str(i/1000+1)+':',sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}))
writer = tf.summary.FileWriter("./mnist_nn_log",sess.graph)
writer.close()

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