2016-04-14 8 views
28

テンソルを名前で回復するのに問題がありますが、可能かどうかわかりません。Tensorflow:テンソルを名前で取得するには?

私は私のグラフを作成する機能を持っている:

def create_structure(tf, x, input_size,dropout):  
with tf.variable_scope("scale_1") as scope: 
    W_S1_conv1 = deep_dive.weight_variable_scaling([7,7,3,64], name='W_S1_conv1') 
    b_S1_conv1 = deep_dive.bias_variable([64]) 
    S1_conv1 = tf.nn.relu(deep_dive.conv2d(x_image, W_S1_conv1,strides=[1, 2, 2, 1], padding='SAME') + b_S1_conv1, name="Scale1_first_relu") 
. 
. 
. 
return S3_conv1,regularizer 

は、私は、この関数の外変数S1_conv1にアクセスしたいです。私が試した:

with tf.variable_scope('scale_1') as scope_conv: 
tf.get_variable_scope().reuse_variables() 
ft=tf.get_variable('Scale1_first_relu') 

しかし、それは私にエラーを与えている:

とValueError:アンダー共有:可変scale_1/Scale1_first_reluは、許可されていない、存在しません。 VarScopeでreuse = Noneを設定することを意味しましたか?

しかし、これは動作します:

with tf.variable_scope('scale_1') as scope_conv: 
tf.get_variable_scope().reuse_variables() 
ft=tf.get_variable('W_S1_conv1') 

私は

return S3_conv1,regularizer, S1_conv1 

でこの問題を回避することができますが、私はそれを行うにはしたくありません。

私の問題は、S1_conv1は実際には変数ではなく、単なるテンソルだと思います。私がしたいことをする方法はありますか?

答えて

37

関数tf.Graph.get_tensor_by_name()があります。たとえば:

import tensorflow as tf 

c = tf.constant([[1.0, 2.0], [3.0, 4.0]]) 
d = tf.constant([[1.0, 1.0], [0.0, 1.0]]) 
e = tf.matmul(c, d, name='example') 

with tf.Session() as sess: 
    test = sess.run(e) 
    print e.name #example:0 
    test = tf.get_default_graph().get_tensor_by_name("example:0") 
    print test #Tensor("example:0", shape=(2, 2), dtype=float32) 
+1

参照のために、テンソルの代わりにOPを取得する必要がある場合:http://stackoverflow.com/questions/42685994/how-to-get-a-tensorflow-op-by-name –

+0

@apfalz到着の仕方テンソル名は "example:0"ですか? – Bosen

+0

あなたの質問があるかどうかわかりませんが、上記の例で 'e.name'を印刷すると、その名前は' example:0'です。 Tensorflowは指定した名前に ':0'を追加します。 – apfalz

21

すべてのテンソルは、例えば

[tensor.name for tensor in tf.get_default_graph().as_graph_def().node] 

あなたが名前を知ったらあなたは<name>:0を使ってテンソルを取得することができますが、次のようにあなたが見ることができる文字列名(0はやや冗長であるエンドポイントを指し)

を持っていますあなたはこの

tf.constant(1)+tf.constant(2) 

を行う場合は、次のテンソル名を持つ

[u'Const', u'Const_1', u'add'] 

ですから、

sess.run('add:0') 

注として追加の出力を取り出すことができ、これは一部ではなく、パブリックAPIの一部です。自動的に生成される文字列テンソル名は実装の詳細であり、変更される可能性があります。

+0

本当に私の問題ではありません。私のテンソルは明示的に "" Scale1_first_relu "と命名されていますが、宣言されている関数の外では参照できませんが、変数" W_S1_conv1 "への参照を取得できます。彼らが作成されている関数の外に存在するのですか? – protas

+0

デフォルトグラフを使用すると、同じスレッド内のすべての関数間で共有されます。グラフ内の真の名前の名前は、スコープ内で作成された場合は接頭辞を持つかもしれないし、自動的に追加される接尾辞を持つかもしれない。上記のレシピを使ってテンソルの名前をグラフに表示し、 Scale1_first_relu' string –

+0

これを試しましたが、完全な名前は "scale_1 \ Scale1_first_relu:0"です。それでも検索するとエラーになりますが、 'scale_1 \ W_S1_conv1'の検索は機能しません。 – protas

関連する問題