graph在調試,理解tensorflow程序有很大幫助。直觀,看下面這張圖
看不懂不礙事,本blog就是引導大家看懂tensorflow的graph.
怎麼運行graph請看上篇blog。
看幾個關鍵的概念
一,Name scoping and nodes(命名空間和節點)
name scoping:是爲了簡化graph的顯示。將圖表中的節點上定義一個層級。
nodes:每一個圖標,就是一個節點。
例如:
import tensorflow as tf
with tf.name_scope('hidden') as scope:
a = tf.constant(5, name='alpha')
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')
b = tf.Variable(tf.zeros([1]), name='biases')
hidden(命名空間)的節點下,包含三個節點alpha,weights,biases。
hidden/alpha
hidden/weights
hidden/biases
使用這種方式操作節點。
看個圖的例子。
多個節點隱藏
pool_1被展開
記住一條:The better your name scopes, the better your visualization.
越好的命名空間,越好的展示圖形。
其實這個概念很好理解。
1,還要考慮另外一方面
tensorflow有兩種鏈接方式
第一種:data dependencies( 數據依賴)使用solid arrows(實心箭頭)表示兩個張量直接的操作。
第二種:control dependencies(控制依賴)使用 dotted lines(點線(箭頭))。
觀察上圖只有CheckNumerics和control_dependency使用點線鏈接。
2,還有一方面可以簡化圖形
在節點初始化方面,會存在很多控制依賴。減少clutter(複雜),我們使用右邊區域繪製這些節點(high-degree 節點)。
save節點:是一個high-degree 節點。是一個從屬節點。被放在conv_1的右邊。使用… 12 more簡略顯示。
3,第三方面的簡化圖形series collapsing
擁有相同結構並且其名稱結尾的數字不同的節點,會摺疊成一個節點塊(stack)
上圖是展開stack的圖形
列舉一下節點摘要
英文名稱 | 意義 |
---|---|
Name scope | High-level節點代表一個名稱域,雙擊則展開一個高層節點 |
Sequence of unconnected nodes | stack節點 |
Sequence of connected nodes | stack節點 |
Operation node | 獨立的操作節點 |
Constant node | 常量節點 |
Summary node | 摘要節點 |
Data flow edge | 實心箭頭,表示兩個張量數據依賴 |
Control dependency edge | 點線箭頭,表示兩個節點控制依賴 |
Reference edge | 引用雙向箭頭,表示相互影響彼此的tensor |
二,interaction(交互)
右下角的方框視圖:可以平移,縮放,拖動,自動平移到節點位置。
右上角的卡片詳情:包括節點輸入,輸出,參數。如下圖:
展示conv2名稱域
詳情卡DecodeRaw操作節點,輸入,輸出,相關的設備和屬性。
說說配色。
1,結構唯一的節點顏色是灰色。
2,兩個 high-level 節點顏色一樣
3,設備找色,紫色代表GPU,綠色代表CPU。
三,Tensor shape information(張量形狀信息)
當序列化的GraphDef包含張量形狀時,圖形可視化器標記具有張量維度的邊緣,邊緣厚度反映總張量大小。 要在GraphDef中包含張量形狀,在序列化圖形時將實際圖形對象(如sess.graph)傳遞給FileWriter。 下面的圖片顯示了具有張量形狀信息的CIFAR-10模型:
四,Runtime statistics(運行期間的統計量)
爲運行收集運行時元數據通常是非常有用的,例如總內存使用量,總計算時間和節點的張量形狀。 下面的代碼示例是簡單的MNIST教程的修改的訓練和測試部分的一個片段,其中我們記錄了摘要和運行時統計信息。 有關如何記錄摘要的詳細信息,請參閱摘要教程。 完整的源代碼在這裏。
# Train the model, and also write summaries.
# Every 10th step, measure test-set accuracy, and write test summaries
# All other steps, run train_step on training data, & add training summaries
def feed_dict(train):
"""Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
if train or FLAGS.fake_data:
xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
k = FLAGS.dropout
else:
xs, ys = mnist.test.images, mnist.test.labels
k = 1.0
return {x: xs, y_: ys, keep_prob: k}
for i in range(FLAGS.max_steps):
if i % 10 == 0: # Record summaries and test-set accuracy
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: # Record train set summaries, and train
if i % 100 == 99: # Record execution stats
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),
options=run_options,
run_metadata=run_metadata)
train_writer.add_run_metadata(run_metadata, 'step%d' % i)
train_writer.add_summary(summary, i)
print('Adding run metadata for', i)
else: # Record a summary
summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
train_writer.add_summary(summary, i)
此代碼將從步驟99開始每100步發出運行時統計信息。
當啓動tensorboard並轉到圖表選項卡時,您現在將在“會話運行”下看到與添加運行元數據的步驟相對應的選項。 選擇其中一個運行將顯示在該步驟的網絡快照,淡出未使用的節點。 在左側的控件中,您可以通過總內存或總計算時間對節點着色。 此外,單擊節點將顯示確切的總內存,計算時間和張量輸出大小。
本blog結束。