2017-08-26 3 views
1

私はこのようなネットワークを構築する機能を持っています。tf.contrib.graph_editorを使用したネットワークのクローニング

def build_network(inputs): 
    # Some arbitrary set of variables and ops here. For example... 
    out = tf.contrib.layers.fully_connected(inputs, 123) 
    (...) 
    return out 

次に、このようなネットワークを構築するために使用します。私は同じ構造が、独立変数とのより多くのネットワークを構築したい場合

inputs = tf.placeholder(...) 
outputs = build_network(inputs) 

私はいくつかの他の変数のスコープと、必要に応じて、他の入力で再度build_networkを呼び出す必要があるだろう。

私の質問は:build_networkはもはや利用できませんが、元のネットワークの入力と出力は何ですか?言い換えれば、サブグラフ全体をの出力からの入力まで、どのようにして独自の変数セットを持つ別の変数スコープにクローンすることができますか?

一般的にtf.contrib.graph_editorと特にgraph_editor.copyは、私がこれらの種類のことを行うために必要なツールです。しかし、私は彼らの使用の良い例を見つけることができませんでした。助言がありますか?

答えて

1

私自身、私はサブグラフをコピーする方法のように見えました。

from tensorflow.contrib import graph_editor as ge 

# From the example above. 
inputs = [tf.placeholder(...), ...] 
outputs = build_network(inputs) 

sgv = ge.make_view(ge.get_within_boundary_ops(
    tf.get_default_graph(), 
    [t.op for t in outputs], 
    [t.op for t in inputs])) 

# This could be any new inputs. In this example I build new identical placeholders. 
new_inputs = {p: tf.placeholder(dtype=p.dtype, shape=p.shape) for p in inputs} 
new_sgv, info = ge.copy_with_input_replacements(sgv, new_inputs, dst_scope='copy') 

new_inputs = [info.transformed(t) for t in inputs] 
new_outputs = [info.transformed(t) for t in outputs] 

ただし、ネットワークコピーを使用しようとすると、新しい問題に直面しています。コピー内の新しい変数は初期化されておらず、tf.global_variables_initializer()を実行しようとしても役立たない。

なぜなら、これらのtf.Variableは作成されていないため、それらはGlobalKeys.GLOBAL_VARIABLESコレクションの一部ではないからです。私は簡単にこれらの変数に対応する操作と元とコピーの間のマッピングを見つけることができますが、私はそこからtf.Variableを構築することはできません。

私は、初期化を行うためのハックのある回避策のビットを見つけましたが、コレクション内のvarsでのみ動作します。

init_ops = [] 
for v in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES): 
    if v.op in sgv.ops: 
    init_ops.append(info.transformed(v.initializer)) 

... 

session.run([tf.global_variables_initializer()] + init_ops) 

これを実行する方法はありますか?理想的には、コピーした変数のtf.Variablesを作成して、それらをグローバル変数コレクションに追加することができます。または、それが不可能であった場合、元のネットワークのtf.Variableオブジェクトを見つけることなくイニシャライザ操作を取得するための信頼できる方法です。

関連する問題