2017-07-11 3 views
1

Ich möchte ein Tensorflow-Diagramm in einer separaten Funktion get_graph() erstellen, und eine einfache ops a in der Hauptfunktion ausdrucken. Es stellt sich heraus, dass ich den Wert a ausdrucken kann, wenn ich a von get_graph() zurückgebe. Wenn ich jedoch get_operation_by_name() verwende, um a abzurufen, wird None ausgedruckt. Ich frage mich, was ich hier falsch gemacht habe? Irgendwelche Vorschläge, um es zu beheben? Vielen Dank!Wie verwendet man get_operation_by_name() in Tensorflow, aus einem Graphen, der aus einer anderen Funktion aufgebaut ist?

import tensorflow as tf 

def get_graph(): 
    graph = tf.Graph() 
    with graph.as_default(): 
    a = tf.constant(5.0, name='a') 
    return graph, a 

if __name__ == '__main__': 
    graph, a = get_graph() 
    with tf.Session(graph=graph) as sess: 
    print(sess.run(a)) 
    a = sess.graph.get_operation_by_name('a') 
    print(sess.run(a)) 

es ausdruckt

5.0 
None 

P. S. Ich benutze Python 3.4 und Tensorflow 1.2.

Antwort

3

Namenskonventionen in Tensorflow sind subtil und ein wenig Offset zuerst.

Die Sache ist, wenn Sie

a = tf.constant(5.0, name='a') 

a ist nicht die constant op schreiben, aber seine Ausgang. Names of op outputs derive from the op name by adding a number corresponding to its rank. Hier hat constant nur einen Ausgang, so sein Name

print(a.name) 
# `a:0` 

ist Wenn Sie sess.graph.get_operation_by_name('a') laufen Sie tun die constant op zu bekommen. Aber was Sie eigentlich wollten, ist 'a:0', der Tensor, der die Ausgabe dieser Operation ist, und dessen Auswertung ein Array zurückgibt.

a = sess.graph.get_tensor_by_name('a:0') 
print(sess.run(a)) 
# 5 
+1

vielen Dank für die Klarstellung! Ich habe auch gelernt, dass ich dasselbe mit a = sess.graph.get_operation_by_name ('a') 'und' sess.run (a.outputs.pop()) 'ausdrucken kann – pohe

Verwandte Themen