2017-07-13 4 views
3

複数のTensorflowモデルを別々のグラフに1つのグラフに結合しようとしています(標準的なシナリオを凍結する必要がある転送学習モデル、アンサンブルなど)。結合されたテンソルフローグラフの変数の初期化

私はtf.import_graph_defを使って2つのグラフを接続することができます。しかし、元のグラフの1つに変数が含まれていると、新しいグラフに値を挿入できません。割り当て操作はグラフの一部としてコピーされます。これらを手動で実行すると、期待される結果が得られます。利回りであるとして、このスニペットを実行する

import tensorflow as tf 

graph1 = tf.Graph() 
with graph1.as_default(): 
    with tf.Session(graph=graph1) as sess: 
     var1 = tf.Variable([1, 1, 1], name='var1') 
     tensor1 = tf.multiply(var1, 2, name='tensor1') 

graph2 = tf.Graph() 
with graph2.as_default(): 
    with tf.Session(graph=graph2) as sess: 
     placeholder = tf.placeholder(tf.int32, [3], name='placeholder') 
     tensor2 = tf.multiply(placeholder, 2, name='tensor2') 

graph3 = tf.Graph() 
with graph3.as_default(): 
    with tf.Session(graph=graph3) as sess: 
     graph1out, = tf.import_graph_def(graph1.as_graph_def(), name='graph1', return_elements=['tensor1:0']) 
     tf.import_graph_def(graph2.as_graph_def(), name='graph2', input_map={'placeholder:0': graph1out}) 

with graph3.as_default(): 
    with tf.Session(graph=graph3) as sess: 
     sess.run(tf.global_variables_initializer()) 
     #sess.run(graph3.get_tensor_by_name('graph1/var1/Assign:0')) 
     tensor = graph3.get_tensor_by_name('graph2/tensor2:0') 
     result = sess.run(tensor) 

(第四with graph... - ブロックでsess.run -callをコメント解除):

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value graph1/var1 

手動割り当て-OPSになります非常に少ない一般的なアプローチをされ実行されています一般的な関数の一部として書くのが面倒です。また、グラフを使ってセッションを再初期化するたびに、これらの代入呼び出しを行う必要があります。

もっと一般的なやり方はありますか?たとえば、古い変数を基に新しい変数を作成し、それを既存の構造にラッチするなどして、

もしそうでなければ、assign-callsをラップする方法はありますか?だから、少なくとも私は1つの一般的なinit操作を実行することができます不明な数の特定のもののそれぞれのケース?

答えて

0

これを修正するには、init-wrapperを作成します。 'Apply:(int)'で終わる名前のすべてのテンソルについて、(tf.reduce_sumを使ってその形状を標準化して)tf.stackに詰めます。このinit操作は内部的にはnoopとして扱われますが、渡されたすべてのテンソルが確実に実行されます(したがって対応する変数も初期化されます)。意味的には、tf.global_variables_initializer()として扱うことができます。

最も洗練された解決策ではありませんが、私の使用事例ではまだ動作していません。

+0

もう少しありがとう! – MathiasOrtner

関連する問題