2017-02-17 3 views
11

私はDCGANモデルを訓練しました。画像空間最適化によるニューロンの活性化のドライバを視覚化するライブラリにロードしたいと考えています。テンソルフローモデルをメタデータファイルからインポートする際にinput_mapを設定する

次のコードは機能しますが、次の画像解析を行うときには(1、幅、高さ、チャンネル)画像で作業する必要があります。これは痛みです(ネットワーク入力の形状に関するライブラリの仮定)。

graph = tf.Graph() 
sess = tf.InteractiveSession(graph=graph) 

t_input = tf.placeholder(np.float32, name='images') # define the input tensor 
t_preprocessed = tf.expand_dims(t_input, 0) 

new_saver = tf.train.import_meta_graph(model_fn, input_map={'images': t_input}) 
new_saver.restore(sess, './') 

しかし、エラーが発生しました:

# creating TensorFlow session and loading the model 
graph = tf.Graph() 
sess = tf.InteractiveSession(graph=graph) 

new_saver = tf.train.import_meta_graph(model_fn) 
new_saver.restore(sess, './') 

私はinput_mapを変更したいのですが、ソースを読んだ後、私はこのコードが動作するように期待

ValueError: tf.import_graph_def() requires a non-empty name if input_map is used.

するとスタックtf.import_graph_def()になって、名前フィールドがimport_scopeに設定されているので、私は以下を試しました:

私に次 KeyErrorを相殺

10:私は「input_map」を設定するか否か

KeyError: "The name 'gradients/discriminator/minibatch/map/while/TensorArrayWrite/TensorArrayWriteV3_grad/TensorArrayReadV3/RefEnter:0' refers to a Tensor which does not exist. The operation, 'gradients/discriminator/minibatch/map/while/TensorArrayWrite/TensorArrayWriteV3_grad/TensorArrayReadV3/RefEnter', does not exist in the graph."

私は「import_scope」を設定した場合は、私は同じエラーを取得します。

ここからどこに行くのかわかりません。

+0

自立した例がある場合は、それを見てうれしいです。 'input_map'がどのように[test](https://www.github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/meta_graph_test.py#L262)で使われているかを見ることができます。私は可能な限り試験に近づき、それがどこで分かれるのかを見てみよう。 – drpng

+0

@drpng私がオープンしたgithubの問題の完全な例があります(https://github.com/tensorflow/tensorflow/issues/7634)。テストを見ていただきありがとうございます。下位レベルの機能のためのアプローチを試してみます。 – Sevenless

答えて

1

テンソルフロー> = 1.2.0の新しいバージョンでは、次の手順が正常に動作します。

t_input = tf.placeholder(np.float32, shape=[None, width, height, channels], name='new_input') # define the input tensor 

# here you need to give the name of the original model input placeholder name 
# For example if the model has input as; input_original= tf.placeholder(tf.float32, shape=(1, width, height, channels, name='original_placeholder_name')) 
new_saver = tf.train.import_meta_graph(/path/to/checkpoint_file.meta, input_map={'original_placeholder_name:0': t_input}) 
new_saver.restore(sess, '/path/to/checkpointfile') 
0

したがって、主な問題は正しい構文を使用していないことです。 input_maplink)の使用については、tf.import_graph_defのドキュメントを参照してください。

レッツ・内訳このライン:

new_saver = tf.train.import_meta_graph(model_fn, input_map={'images': t_input}, import_scope='import') 

あなたはmodel_fnが何であるかを概説していなかったが、それは、ファイルへのパスである必要があります。次の部分については 、input_mapで、あなたが言っている:nameあるimages私の変数を(現在のグラフ中)元のグラフ(DCGAN)で入力を置き換えるには、t_inputと呼ばれます。問題として、t_inputimagesは、この行ごとに異なる方法で同じオブジェクトを参照している。言い換えれば

t_input = tf.placeholder(np.float32, name='images') 

imagesinput_mapで、実際の変数名は、あなたがDCGANに置き換えるしようとしていることは何でもする必要がありますグラフ。グラフを基本形式(つまり、input_map行なし)にインポートし、リンク先の変数名が何であるか把握する必要があります。グラフをインポートした後、リストにはtf.get_collection('variables')が返されます。ディメンション(1、幅、高さ、チャンネル)を探しますが、変数名の代わりに値を指定します。それがプレースホルダーの場合、のようになります。ここで、scopeは変数のスコープに置き換えられます。注意の

ワード:

Tensorflowは、グラフが見えるように期待するものについて非常に凝り性です。したがって、元のグラフ仕様で幅、高さ、およびチャネルが明示的に指定されている場合は、placeholderを別の次元セットに接続しようとするとTensorflowがエラーをスローします(エラーをスローします)。そして、これは理にかなっています。システムがいくつかの次元の集合で訓練された場合、それらの次元を持つ画像を生成する方法しか知りません。

理論上、あなたはまだそのネットワークの前面にあらゆる種類の奇妙なものを貼り付けることができます。しかし、最初にこれらの次元に合うようにスケールを縮小する必要があります(そして、Tensorflowの文書では、グラフ外のCPU、つまりfeed_dictを入力する前にそれを行うほうが良いと書かれています)。

希望に役立ちます!

関連する問題