2015-12-12 72 views
15

API討論了Graph Collections,從code判斷是通用密鑰/數據存儲。這些藏品的目的是什麼?TensorFlow中圖集的目的是什麼?

+2

搜索「GraphKeys」。對於集合的一些示例:即TrainableVariables:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/variables.py#L113,TableInitializers:https://tensorflow.googlesource.com/tensorflow /+/0.5.0/tensorflow/python/ops/data_flow_ops.py#521,總結:https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/python/ops/summary_ops.py#48 –

+0

嗨@YaroslavBulatov可以請你重新發布你的鏈接?最後兩個都壞了。永遠感謝! – Aaron

回答

13

請記住,在引擎蓋下,Tensorflow是用於指定並執行計算數據流圖的系統。圖形集合用作跟蹤構建的圖形以及它們必須如何執行的一部分。例如,當您創建某些類型的操作(如tf.train.batch_join)時,添加該操作的代碼還會將一些隊列運行器添加到QUEUE_RUNNERS圖形集合中。稍後,當您撥打start_queue_runners()時,默認情況下,它會查看QUEUE_RUNNERS集合以瞭解要啓動哪些參賽者。

+4

我仍然對收藏概念感到困惑。通過將不同的操作添加到不同的集合中,它是否會使查找效率更高? 看來,這個集合只適用於將ops組合在一起,而不會給計算帶來任何「真正的」好處,對嗎?在這裏,對於「真實」,我的意思是,如果我從張量流系統中移除收集的概念,它不會傷害計算。 – ZijunLost

+0

不,收藏的重點不是效率,重點是記賬。集合用於知道應該訓練哪些變量。或者必須要求哪些運動員進行訓練。集合是從字符串到圖集位的映射。幾個已知字符串存儲在GraphKeys中。這些涉及到重要的圖形位集(即操作數,變量等) – BlessedKey

2

我認爲對我來說至少有兩個好處到目前爲止:

  1. 當你在多GPU或機器程序分佈是很方便的收集哪些是相同的集合中的不同設備的損失。使用tf.add_n來添加它們以累積損失。
  2. 以我自己的方式更新一組特定的變量,如權重和偏差。

例如:

import tensorflow as tf  
w = tf.Variable([1,2,3], collections=[tf.GraphKeys.WEIGHTS], dtype=tf.float32)  
w2 = tf.Variable([11,22,32], collections=[tf.GraphKeys.WEIGHTS], dtype=tf.float32) 
weight_init_op = tf.variables_initializer(tf.get_collection_ref(tf.GraphKeys.WEIGHTS)) 
sess = tf.InteractiveSession() 
sess.run(weight_init_op) 
for vari in tf.get_collection_ref(tf.GraphKeys.WEIGHTS): 
    tf.add_to_collection(tf.GraphKeys.UPDATE_OPS, vari.assign(0.2 * vari)) 
weight_update_ops = tf.get_collection_ref(tf.GraphKeys.UPDATE_OPS) 
sess.run(weight_update_ops) 

輸出:

[陣列([0.2,0.40000001,0.60000002],D型細胞= FLOAT32) 陣列([2.20000005,4.4000001,6.4000001] dtype = float32)]

+0

關於代碼的小記事......當您啓動一個tf.InteractiveSession()時,爲什麼不從中受益呢? 正如...使用weight_init_op.run()和weight_update_ops.eval() – zwep

+0

@zwep是的,你是對的。也許我在寫這篇文章的時候並不知道那個訣竅。無論如何,我的代碼工程。 – lerner

相關問題