【TensorFlow篇】--Tensorflow框架視覺化之Tensorboard

LHBlog發表於2018-03-29

一、前述

TensorBoard是tensorFlow中的視覺化介面,可以清楚的看到資料的流向以及各種引數的變化,本文基於一個案例講解TensorBoard的用法。

二、程式碼

設計一個MLP多層神經網路來訓練資料
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


max_steps = 1000#最大迭代次數
learning_rate = 0.001#學習率
dropout = 0.9# 保留的資料
data_dir = './MNIST_data_bak'
log_dir = './logs/mnist_with_summaries'

mnist = input_data.read_data_sets(data_dir, one_hot=True)#把y這一列變成one_hot編碼
sess = tf.InteractiveSession()

with tf.name_scope('input'):#with塊中名字才是最重要的 一個塊
    x = tf.placeholder(tf.float32, [None, 784], name='x-input')
    y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')

with tf.name_scope('input_reshape'):
    # 784維度變形為圖片保持到節點
    image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])#-1代維度表不管有多少個  1代表1個通道 28*28個
    tf.summary.image('input', image_shaped_input, 10)#當做一個圖片存起來


# 定義神經網路的初始化方法
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)#截斷的正態分佈 這裡可以用he_initinelize
    return tf.Variable(initial)#建立一個變數


def bias_variable(shape):#截距
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)


# 以下程式碼是關於畫圖的
# 定義Variable變數的資料彙總函式,我們計算出變數的mean、stddev、max、min
# 對這些標量資料使用tf.summary.scalar進行記錄和彙總
# 使用tf.summary.histogram直接記錄變數var的直方圖資料
def variable_summaries(var):
    with tf.name_scope('summaries'):
        mean = tf.reduce_mean(var)
        tf.summary.scalar('mean', mean)
        with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
        tf.summary.scalar('stddev', stddev)
        tf.summary.scalar('max', tf.reduce_max(var))
        tf.summary.scalar('min', tf.reduce_min(var))
        tf.summary.histogram('histogram', var)


# 設計一個MLP多層神經網路來訓練資料
# 在每一層中都對模型資料進行彙總
def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):#定義一個隱藏層 input_dim上一層  output_dim本層輸出
    with tf.name_scope(layer_name):
        with tf.name_scope('weights'):
            weights = weight_variable([input_dim, output_dim])#shape傳進來是上一層輸入,本層輸出 如果是MLP,就是全連線可以知道引數個數
            variable_summaries(weights)#把權重的各個指標(方差,平均值)進行總結
        with tf.name_scope('biases'):
            biases = bias_variable([output_dim])
            variable_summaries(biases)
        with tf.name_scope('Wx_plus_b'):
            preactivate = tf.matmul(input_tensor, weights) + biases#帶到啟用函式之前的公式
            tf.summary.histogram('pre_activations', preactivate)
        activations = act(preactivate, name='activation')#運用啟用函式 函式裡面傳函式 高階函式
        tf.summary.histogram('activations', activations)
        return activations


# 我們使用剛剛定義的函式建立一層神經網路,輸入維度是圖片的尺寸784=28*28
# 輸出的維度是隱藏節點數500,再建立一個Dropout層,並使用tf.summary.scalar記錄keep_prob

hidden1 = nn_layer(x, 784, 500, 'layer1')#建立第一層 隱藏層

with tf.name_scope('dropout'):
    keep_prob = tf.placeholder(tf.float32)
    tf.summary.scalar('dropout_keep_probability', keep_prob)
    dropped = tf.nn.dropout(hidden1, keep_prob)#應用drop_out函式 保留下來的資料

# 然後使用nn_layer定義神經網路輸出層,其輸入維度為上一層隱含節點數500,輸出維度為類別數10
# 同時啟用函式為全等對映identity,暫時不使用softmax
y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)#建立第二層 輸出層

# 使用tf.nn.softmax_cross_entropy_with_logits()對前面的輸出層的結果進行Softmax
# 處理並計算交叉熵損失cross_entropy,計算平均的損失,使用tf.summary.scalar進行統計彙總
with tf.name_scope('cross_entropy'):
    diff = tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_)#輸出層給的結果logits=y #每一行的y是有10個數預測10個值 然後利用這10個值做歸一化 然後具備一個概率的含義 第二步計算交叉熵
    with tf.name_scope('total'):
        cross_entropy = tf.reduce_mean(diff)#平均損失
tf.summary.scalar('cross_entropy', cross_entropy)


# 下面使用Adam優化器對損失進行優化,同時統計預測正確的樣本數並計算正確率accuracy,彙總
with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)#AdamOptimizer比SGD更好一些,下降速度更快,更容易計算區域性最優解 ,當資料量大的時候不如SGD
    #learning_rate雖然是固定的,後面會自適應,根據上一次的結果 所以大資料量的話,不如定義好策略,這樣省時間
with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))#預測值最大的索引 和真實值的索引
    with tf.name_scope('accuracy'):
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))#true 1 false 0 reduce_mean 是一個比例得到的結果

tf.summary.scalar('accuracy', accuracy)

# 因為我們之前定義了太多的tf.summary彙總操作,逐一執行這些操作太麻煩,
# 使用tf.summary.merge_all()直接獲取所有彙總操作,以便後面執行
merged = tf.summary.merge_all()
# 定義兩個tf.summary.FileWriter檔案記錄器再不同的子目錄,分別用來儲存訓練和測試的日誌資料
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')
# 同時,將Session計算圖sess.graph加入訓練過程,這樣再TensorBoard的GRAPHS視窗中就能展示
# 整個計算圖的視覺化效果,最後初始化全部變數
tf.global_variables_initializer().run()


# 定義feed_dict函式,如果是訓練,需要設定dropout,如果是測試,keep_prob設定為1
def feed_dict(train):
    if train:#如果是訓練的話需要Droupout 測試的時候不要Droupout
        xs, ys = mnist.train.next_batch(100)#每一次拿一批次資料去訓練
        k = dropout
    else:
        xs, ys = mnist.test.images, mnist.test.labels#真正測試的話全部測試,不是拿一批次的資料了
        k = 1.0
    return {x: xs, y_: ys, keep_prob: k}


# 執行訓練、測試、日誌記錄操作
# 建立模型的儲存器
saver = tf.train.Saver()
for i in range(max_steps):#max_steps迭代次數
    if i % 10 == 0:#每執行10次的時候彙總一次資訊 然後計算測試集的一次準確率 因為傳的是Flase
        summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
        test_writer.add_summary(summary, i)#然後寫出
        print('Accuracy at step %s: %s' % (i, acc))
    else:
        if i % 100 == 99:#如果到100次
            run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
            run_metadata = tf.RunMetadata()#儲存的是後設資料資訊
            summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))# summary寫的是跑完之後的資料
            train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
            train_writer.add_summary(summary, 1)#寫檔案
            saver.save(sess, log_dir + 'model.ckpt', i)
            print('Adding run metadata for', i)
        else:#不是10次,也不是100次 ,說明其他批次,則訓練資料
            summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))#訓練
            train_writer.add_summary(summary, i)

train_writer.close()
test_writer.close()

 三、TensorBoard的使用

1、找到程式碼中tf.summary.FileWriter檔案記錄器儲存訓練和測試的日誌資料的目錄

在Terninal中輸入tensorboard --logdir="D:\Project\AI_Project\tensforflow_study\logs"

其中Logdir正式上面程式碼中儲存的路徑,這裡注意是絕對路徑,並且使用雙引號引起來。

 2、在瀏覽器中輸入localhost:6006即可

Graph模組是整個資料流向圖

SCALARS可以看到損失函式逐漸減小,w引數也在逐漸減小

 

 剩下的功能自己挖掘吧!!!

相關文章