2017-10-03 3 views
0

Es gibt eine Funktion, die tf.get_variable('name') passieren Parameter in Funktion wie „implizit“ ermöglicht:TensorFlow: get_variable() aber für Platzhalter?

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 

Was aber, wenn man eine tf.placeholder in Funktion übergeben wollen? Gibt es gleiche Mechanismus für Platzhalter, das heißt so etwas wie tf.get_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)  

Oder es nicht allzu viel Sinn, es zu tun machen und besser, nur Platzhalter zu konstruieren innerhalb der Funktion?

Antwort

1

Platzhalter sind nur ... Platzhalter. Es ist sinnlos, einen Platzhalter zu "bekommen", als ob er irgendeine Art von Zustand hätte (das ist, was Variable holt, gibt eine Variable in ihrem aktuellen Zustand zurück).

Verwenden Sie einfach die gleiche Python-Variable überall.

Wenn Sie eine Python-Variable nicht übergeben möchten, weil Ihre Methode signaturl hässlich wird, können Sie die Tatsache ausnutzen, dass Sie ein Diagramm erstellen und das Diagramm selbst die Informationen zu den deklarierten Platzhaltern enthält.

Sie können wie etwas tun:

#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, bekam es. Platzhalter sind also quasi "zustandslos" und neue zu erstellen bringt keinen Overhead mit sich, oder? – devforfu

+0

Ja. Der Aufwand wird nur eingeführt, wenn Sie es verwenden, wegen der Datenübertragung von Python zu Tensorflow – nessuno

1

Neben der Tatsache, dass, wenn Sie im selben Skript arbeiten Sie diese nicht benötigen, können Sie das tun, indem Sie den Tensor mit Namen bekommen, wie in Tensorflow: How to get a tensor by name?

Zum Beispiel

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

assert p == p2 
+0

Ich sehe, groß, danke. Übrigens, wissen Sie, warum die Variable Name wie 'Verlust/Verlust: 0' nur von' Verlust' installiert ist? – devforfu

+0

das erklärt es irgendwie: https://stackoverflow.com/questions/36150834/how-does-tensorflow-name-stensors –

Verwandte Themen