如何在Win下使用Tensorboard 視覺化工具
Tensorboard視覺化工具是訓練過程中很重要的工具。可以實時的檢測模型,主要有兩個方面的應用,首先是可以檢測每一層的偏向 b 和 權重 w的更新過程,另一個作用就是在訓練過程中,使用驗證集去檢測模型的、準確率還有“loss”的實時變化。
1. Tensorboard介紹
1.1 Tensorboard的資料形式
Tensorboard可以記錄與展示以下資料形式:
(1)標量Scalars
(2)圖片Images
(3)音訊Audio
(4)計算圖Graph
(5)資料分佈Distribution
(6)直方圖Histograms
(7)嵌入向量Embeddings
1.2 Tensorboard的視覺化過程
(1)首先肯定是先建立一個graph,你想從這個graph中獲取某些資料的資訊
(2)確定要在graph中的哪些節點放置summary operations以記錄資訊
使用tf.summary.scalar記錄標量
使用tf.summary.histogram記錄資料的直方圖
使用tf.summary.distribution記錄資料的分佈圖
使用tf.summary.image記錄影象資料
….
(3)operations並不會去真的執行計算,除非你告訴他們需要去run,或者它被其他的需要run的operation所依賴。而我們上一步建立的這些summary operations其實並不被其他節點依賴,因此,我們需要特地去執行所有的summary節點。但是呢,一份程式下來可能有超多這樣的summary 節點,要手動一個一個去啟動自然是及其繁瑣的,因此我們可以使用tf.summary.merge_all去將所有summary節點合併成一個節點,只要執行這個節點,就能產生所有我們之前設定的summary data。
(4)使用tf.summary.FileWriter將執行後輸出的資料都儲存到本地磁碟中
(5)執行整個程式,並在命令列輸入執行tensorboard的指令,之後開啟web端可檢視視覺化的結果
2.具體例項 (使用經典的Mnist資料集為例)
2.1 程式實現
mnist_ff.py
import tensorflow as tf input_node=784 #輸入節點 layer1_node=500 #隱藏神經元的個數 output_node=10 #輸出節點 def get_weight (shape,regularizer): #採用get_variable 可以在其他函式內直接獲取變數值,不用再傳引數 '''獲取weights函式,可以通過名字獲取值 變數名稱必填 ''' weights=tf.get_variable("weights",shape,initializer=tf.truncated_normal_initializer(stddev=0.1)) if (regularizer!= None): tf.add_to_collection("losses",regularizer(weights)) #採用正則化方法 放入損失函式中 return weights def ff(input_tensor,regularizer): #生成一個上下文管理器,並指明需求的變數在這個上下文管理器中,就可以直接通過tf.get_variable獲取已經生成的變數。 with tf.variable_scope('layer1',reuse =tf.AUTO_REUSE): #layer1 名稱空間 reuse 重複使用 #宣告第一層神經網路 weights=get_weight([input_node, layer1_node],regularizer)#共享變數 可以直接使用 biases=tf.get_variable("biases1",[layer1_node],initializer=tf.constant_initializer(0.0)) layer1=tf.nn.relu(tf.matmul(input_tensor,weights)+biases) with tf.variable_scope('layer2',reuse =tf.AUTO_REUSE): #layer2 名稱空間 #宣告第一層神經網路 weights=get_weight([layer1_node,output_node],regularizer) biases=tf.get_variable("biases2",[output_node],initializer=tf.constant_initializer(0.0)) layer2=tf.matmul(layer1,weights)+biases return layer2
mnist_train.py
import tensorflow as tf
import mnist_ff
import time
import os #用來儲存訓練的模型
from tensorflow.examples.tutorials.mnist import input_data
batch_size=100 #一次訓練的個數
learning_rate_base=0.8 #學習率
learning_rate_decay=0.99#學習的衰減率
move_average_rate=0.99 #滑動平均律的衰減率
regularaztion=0.0001 #regularizer 所佔的比重
steps=30000 #設定訓練輪數
model_save_path="E:\TensorFlow\Project_TF\mnist_network\log"#設定儲存模型的路徑
model_name="model_minist.ckpt"#設定模型的的名稱
event_path="E:\TensorFlow\Project_TF\mnist_network\event" #tensorboard日誌儲存的路徑
def train(mnist):
start = time.clock()
x=tf.placeholder(tf.float32,shape=(None,mnist_ff.input_node),name="x_input")#定義初始資料想x,在具體執行時再代入具體資料
y_=tf.placeholder(tf.float32,shape=(None,mnist_ff.output_node),name="y_input")#定義標籤值
regularizer=tf.contrib.layers.l2_regularizer(regularaztion) #使用L2正則化方法
y=mnist_ff.ff(x,regularizer)#前向傳播過程
'''採用滑動平均模型 調整learning_rate'''
global_step=tf.Variable(0,trainable=False)#定義儲存訓練輪數的變數,定義為不可訓練的引數
variable_averages=tf.train.ExponentialMovingAverage(move_average_rate,global_step)#定義滑動的物件
variables_averages_op=variable_averages.apply(tf.trainable_variables()) #定義執行滑動平均的操作
#設定可變的learning rate
learning_rate=tf.train.exponential_decay(learning_rate_base,global_step,mnist.train.num_examples/batch_size, learning_rate_decay)# 完整的使用一遍資料後,學習率*衰減率
'''定義誤差函式'''
with tf.variable_scope('loss'):
cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
loss= cross_entropy+tf.add_n(tf.get_collection('losses'))
tf.summary.scalar('loss', loss)
'''準確率'''
validation_feed={x: mnist.validation.images,y_: mnist.validation.labels}
y2=mnist_ff.ff(x,None) #測試時不關注正則化損失的值
with tf.name_scope('accuracy'):
correct_prediction = tf.equal(tf.argmax(y2, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) #一組資料上的正確率
tf.summary.scalar('accuracy', accuracy)
'''既要bp更新,又要更新每個引數的滑動平均值'''
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
with tf.control_dependencies([train_step, variables_averages_op]):
train_op=tf.no_op(name='train') #什麼也不做
#初始化 TensorFow持久化類
saver=tf.train.Saver()
with tf.Session() as sess:
tf.initialize_all_variables().run() #啟動所有的變數
'''使用tensorboard視覺化工具'''
summary_op = tf.summary.merge_all() #將所有的summary同時執行
summary_writer = tf.summary.FileWriter(event_path, graph=sess.graph)
#在訓練過程中不在使用驗證集
for i in range(steps):#開始訓練
batch_xs, batch_ys = mnist.train.next_batch(batch_size) #一次取batch_size個數據進行訓練
_,loss_value,step=sess.run([train_op,loss,global_step],feed_dict={x:batch_xs,y_:batch_ys})
#每1000輪儲存一次模型
if (i%1000==0):
print("After %d steps,the loss on model of mnist is %f"%(step,loss_value))
saver.save(
sess,os.path.join(model_save_path,model_name),
global_step=global_step)#放上global_step 可以將模型儲存為第多少次的模型
elif (i % 100 == 0):
'''執行的時候要將placeholder的資料放進去'''
summary_str = sess.run(summary_op,feed_dict= validation_feed)
summary_writer.add_summary(summary_str, i) #橫座標為模型訓練的次數,縱座標為相應的summary
end = time.clock() #計算程式結束時間
print("running time is %g s" % (end-start))
def main (argv=None):#定義主函式 將資料載入進來
mnist=input_data.read_data_sets("E:\TensorFlow\Project_TF\mnist_network\data",one_hot=True)
train(mnist)
if (__name__=="__main__"): # 如果模組是被直接執行的,則程式碼塊被執行,如果模組是被匯入的,則程式碼塊不被執行。
tf.app.run()
2.2 Tensorboard 實現下(這裡以win系統為例)
開啟win下的命令列
在程式所在的磁碟下,輸入以下命令:
tensorboard --logdir=E:\TensorFlow\Project_TF\mnist_network\event(換成你的路徑命)
2.3 Tensorboard結果