2017-10-03 19 views
0

「暗黙的に」のような関数にパラメータを渡すことができる機能tf.get_variable('name')あり:TensorFlow:プレースホルダのget_variable()ですか?

def function(sess, feed): 
    with tf.variable_scope('training', reuse=True): 
     cost = tf.get_variable('cost') 
    value = sess.run(cost, feed_dict=feed) 
    # other statements 

しかし、一つの関数にtf.placeholderを渡すために何をしたい場合は?

def function(sess, cost, X_train, y_train): 
    # Note this is NOT a valid TF code 
    with tf.variable_scope('training', reuse=True): 
     features = tf.get_placeholder('features') 
     labels = tf.get_placeholder('labels') 
    feed = {features: X_train, labels: y_train} 
    value = sess.run(cost, feed_dict=feed) 
    print('Cost: %s' % value)  

それともそれだけで、関数の内部でプレースホルダを構築するためにそれを行うにはあまりにもあまり意味が、より良いはありません:プレースホルダが同じメカニズム、すなわちtf.get_placeholder()のようなものですか?

答えて

1

プレースホルダはちょうど...プレースホルダです。プレースホルダがある種の状態を持っているかのようにプレースホルダーを「得る」ことは無意味です(変数を取得し、現在の状態で変数を返します)。

どこでも同じPython変数を使用してください。

また、メソッドsignaturlが醜いので、python変数を渡したくない場合は、グラフを作成しているという事実を利用して、グラフ自体に宣言されたプレースホルダに関する情報が含まれます。

あなたのような何かを行うことができます:脇

#define your placeholder 
a = tf.placeholder(tf.float32, name="asd") 

# then, when you need it, fetch if from the graph 
graph = tf.get_default_graph() 
placeholder = graph.get_tensor_by_name("asd:0") 
+0

[OK]を、それを得ました。だから基本的に、プレースホルダは「無国籍」のようなもので、新しいものを作成してもオーバーヘッドは導入されません。 – devforfu

+0

はい。オーバーヘッドは、Pythonからテンソルへのデータ転送のため、使用するときにのみ導入されます – nessuno

1

あなたはあなたがこれを必要はありません同じスクリプト内で作業している場合、あなたはTensorflow: How to get a tensor by name?

のように、名前でテンソルを取得することにより、それを行うことができるという事実を 例えば

p = tf.placeholder(tf.float32) 
p2 = tf.get_default_graph().get_tensor_by_name(p.name) 

assert p == p2 
+0

私は、素晴らしい、ありがとう。ちなみに、変数に 'loss/loss:0'のような名前がついている理由は分かりますか? – devforfu

+0

これは何とか説明しています:https://stackoverflow.com/questions/36150834/how-does-tensorflow-name-tensors –

関連する問題