複数の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操作を実行することができます不明な数の特定のもののそれぞれのケース?
もう少しありがとう! – MathiasOrtner