2017-02-04 78 views
2

上演訓練不同的從屬圖形我試圖執行兩個任務(A和B),其具有輸入端和inp_Ainp_B對應輸出out_Aout_B兩個在tensorflow

任務A首先通過Graph g_A實現。任務A完成後,我希望使用g_A的權重到新圖g_B這是一個更大的圖(g_A的超集)。

我不確定如何在tensorflow中做到這一點。

回答

1

我使用這種拆分爲訓練和驗證的目的,在這裏我創建專用的輸入和輸出管道,但共享圖形的開始部分,雖然我使用相同(截至tf.Graph())但不同的(不連接的)子圖在其內。

在一個tf.Graph()一般概念是variable sharing您可以通過使用tf.variable_scope(),以便將變量的概念,他們創建和使用tf.get_variable()重新獲取他們(而不是直接使用tf.Variable())實現。第一次調用它會創建變量,第二次它將重用它們 - 只要變量的名稱保持不變即可。

但是我發現它更容易使用tf.make_template()代替,這將包裹創建一個子完全並在每次調用創建圖形的新實例,同時共享所有變量的函數。 該文檔的例子是

def my_op(x, scalar_name): 
    var1 = tf.get_variable(scalar_name, 
         shape=[], 
         initializer=tf.constant_initializer(1)) 
    return x * var1 

create_instance = tf.make_template('scale_by_y', my_op, scalar_name='y') 

z = create_instance(input1) 
w = create_instance(input2) 

在此,每次調用create_instance會創建一個名爲scale_by_y在執行同時共享其內部變量由my_op()定義的操作的圖表新節點。 (在該示例中,參數scalar_name靜態綁定到值y,導致變量scale_by_y/y在圖中創建(並重新使用)。我發現該問題比有用的更困惑。) 它並不關心父項適用範圍,所以

with tf.variable_scope('training'): 
    z1 = create_instance(input1) 

with tf.variable_scope('validation'): 
    z2 = create_instance(input2) 

的作品。它也可能或不可以在不同的tf.Graph()實例中工作,但我對此表示懷疑。