1. 程式人生 > >TensorFlow深度學習筆記 Tensorboard入門

TensorFlow深度學習筆記 Tensorboard入門

TensorFlow自帶的一個強大的視覺化工具

功能

這是TensorFlow在MNIST實驗資料上得到Tensorboard結果

  • Event: 展示訓練過程中的統計資料(最值,均值等)變化情況
  • Image: 展示訓練過程中記錄的影象
  • Audio: 展示訓練過程中記錄的音訊
  • Histogram: 展示訓練過程中記錄的資料的分佈圖

原理

  • 在執行過程中,記錄結構化的資料
  • 執行一個本地伺服器,監聽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必須是前面建立兩個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一個分支

修改前:

多分支graph

修改後:

單分支graph

  • 多用with,進行包裹,這樣才好看,正如官網說的,你的summary程式碼決定了你的圖結構
  • 不是所有的tensor都有必要記錄,但是Variable和placeholder最好都用summary記錄一下,也是為了好看
  • 由於有了gradient的計算,所以與gradient計算相關的都會被拎出來,下次試一下用其他optimizer

我的CNN TensorBoard程式碼:cnn_board.py

參考資料

覺得我的文章對您有幫助的話,不妨點個star

土豪可以打賞支援,一分也是愛:

圖片名稱