轉載請注明作者:夢里風林
Github工程地址:https://github.com/ahangchen/GDLnotes
歡迎star位谋,有問題可以到Issue區(qū)討論
官方教程:
https://www.tensorflow.org/versions/master/how_tos/graph_viz/index.html
TensorFlow自帶的一個強大的可視化工具
功能
這是TensorFlow在MNIST實驗數據上得到Tensorboard結果
- Event: 展示訓練過程中的統(tǒng)計數據(最值山析,均值等)變化情況
- Image: 展示訓練過程中記錄的圖像
- Audio: 展示訓練過程中記錄的音頻
- Histogram: 展示訓練過程中記錄的數據的分布圖
原理
- 在運行過程中,記錄結構化的數據
- 運行一個本地服務器掏父,監(jiān)聽6006端口
- 請求時笋轨,分析記錄的數據,繪制
實現
在構建graph的過程中赊淑,記錄你想要追蹤的Tensor
with tf.name_scope('output_act'):
hidden = tf.nn.relu6(tf.matmul(reshape, output_weights[0]) + output_biases)
tf.histogram_summary('output_act', hidden)
其中爵政,
- histogram_summary用于生成分布圖,也可以用scalar_summary記錄存數值
- 使用scalar_summary的時候陶缺,tag和tensor的shape要一致
- name_scope可以不寫钾挟,但是當你需要在Graph中體現tensor之間的包含關系時,就要寫了饱岸,像下面這樣:
with tf.name_scope('input_cnn_filter'):
with tf.name_scope('input_weight'):
input_weights = tf.Variable(tf.truncated_normal(
[patch_size, patch_size, num_channels, depth], stddev=0.1), name='input_weight')
variable_summaries(input_weights, 'input_cnn_filter/input_weight')
with tf.name_scope('input_biases'):
input_biases = tf.Variable(tf.zeros([depth]), name='input_biases')
variable_summaries(input_weights, 'input_cnn_filter/input_biases')
- 在Graph中會體現為一個input_cnn_filter掺出,可以點開徽千,里面有weight和biases
- 用summary系列函數記錄后,Tensorboard會根據graph中的依賴關系在Graph標簽中展示對應的圖結構
- 官網封裝了一個函數汤锨,可以調用來記錄很多跟某個Tensor相關的數據:
def variable_summaries(var, name):
"""Attach a lot of summaries to a Tensor."""
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.scalar_summary('mean/' + name, mean)
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_sum(tf.square(var - mean)))
tf.scalar_summary('sttdev/' + name, stddev)
tf.scalar_summary('max/' + name, tf.reduce_max(var))
tf.scalar_summary('min/' + name, tf.reduce_min(var))
tf.histogram_summary(name, var)
- 只有這樣記錄國max和min的Tensor才會出現在Event里面
- Graph的最后要寫一句這個双抽,給session回調
merged = tf.merge_all_summaries()
Session 中調用
- 構造兩個writer,分別在train和valid的時候寫數據:
train_writer = tf.train.SummaryWriter(summary_dir + '/train',
session.graph)
valid_writer = tf.train.SummaryWriter(summary_dir + '/valid')
- 這里的summary_dir存放了運行過程中記錄的數據闲礼,等下啟動服務器要用到
- 構造run_option和run_meta牍汹,在每個step運行session時進行設置:
summary, _, l, predictions =
session.run([merged, optimizer, loss, train_prediction], options=run_options, feed_dict=feed_dict)
- 注意要把merged拿回來,并且設置options
- 在每次訓練時位仁,記一次:
train_writer.add_summary(summary, step)
- 在每次驗證時,記一次:
valid_writer.add_summary(summary, step)
- 達到一定訓練次數后方椎,記一次meta做一下標記
train_writer.add_run_metadata(run_metadata, 'step%03d' % step)
查看可視化結果
- 啟動TensorBoard服務器:
python安裝路徑/python TensorFlow安裝路徑/tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory
注意這個python必須是安裝了TensorFlow的python聂抢,tensorboard.py必須制定路徑才能被python找到,logdir必須是前面創(chuàng)建兩個writer時使用的路徑
比如我的是:
/home/cwh/anaconda2/envs/tensorflow/bin/python /home/cwh/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/tensorboard/tensorboard.py --logdir=~/coding/python/GDLnotes/src/convnet/summary
使用python
- 然后在瀏覽器輸入 http://127.0.0.1:6006 就可以訪問到tensorboard的結果
強迫癥踩坑后記
- 之前我的cnn代碼里有valid_prediction棠众,所以畫出來的graph有兩條分支琳疏,不太清晰,所以只留了train一個分支
修改前:
修改后:
- 多用with闸拿,進行包裹空盼,這樣才好看,正如官網說的新荤,你的summary代碼決定了你的圖結構
- 不是所有的tensor都有必要記錄揽趾,但是Variable和placeholder最好都用summary記錄一下,也是為了好看
- 由于有了gradient的計算苛骨,所以與gradient計算相關的都會被拎出來篱瞎,下次試一下用其他optimizer
我的CNN TensorBoard代碼:cnn_board.py
參考資料
覺得我的文章對您有幫助的話,不妨點個star痒芝?