2017-10-04 3 views
0

Ich definiere ein einfaches Rechendiagramm mit einer Variablen. Wenn ich einen Wert der Variablen ändern hat es einen erwarteten Einfluss auf den Ausgang des Berechnungsgraphen (so, alles funktioniert gut, wie erwartet):Ist es erlaubt, einer Variablen einen Wert zuzuordnen, bevor sie in ein Berechnungsdiagramm eintritt?

s = tf.Session() 

x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 1.0, 1.0], tf.float32) 

y = x + c 

c = tf.assign(c, [3.0, 3.0, 3.0]) 
s.run(c) 
print 'Y1:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

c = tf.assign(c, [2.0, 2.0, 2.0]) 
s.run(c) 
print 'Y2:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

Wenn ich diesen Code aufrufen, erhalte ich:

Y1: [ 13. 23. 33.] 
Y2: [ 12. 22. 32.] 

Also, die Werte nach Y1 und Y2 sind anders als erwartet, weil sie mit unterschiedlichen Werten von c berechnet werden.

Die Probleme starten, wenn ich der Variablen c einen Wert zuweisen, bevor ich definiere, wie es in die Berechnung von y involviert ist. In diesem Fall kann ich keinen neuen Wert von c zuweisen.

s = tf.Session() 

x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 1.0, 1.0], tf.float32) 

c = tf.assign(c, [4.0, 4.0, 4.0]) # this is the line that causes problems 
y = x + c 

c = tf.assign(c, [3.0, 3.0, 3.0]) 
s.run(c) 
print 'Y1:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

c = tf.assign(c, [2.0, 2.0, 2.0]) 
s.run(c) 
print 'Y2:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

Als Ausgabe erhalte ich:

Y1: [ 14. 24. 34.] 
Y2: [ 14. 24. 34.] 

Wie Sie sehen können, jedes Mal, wenn ich berechnen y, ich Ergebnisse zu erhalten, die alten Werte von c beteiligt sind. Warum das?

Antwort

1

Bedenken Sie bei TensorFlow, dass Sie eine computation graph erstellen. In Ihrem ersten Code-Snippet definieren Sie grundsätzlich y = tf.placeholder(tf.float32) + tf.Variable([1.0, 1.0, 1.0], tf.float32). In Ihrem zweiten Beispiel definieren Sie y = tf.placeholder(tf.float32) + tf.assign(tf.Variable([1.0, 1.0, 1.0], tf.float32), [4.0, 4.0, 4.0]).

Also, egal, die Sie c zuweisen Wert, enthält die Berechnung grafische Darstellung der Betrieb zuweisen und wird immer [4.0, 4.0, 4.0] ihm zuweisen, bevor die Summe zu berechnen.

1

Ich denke, das liegt daran, dass Sie die die Addierungsoperation y = x + c direkt nach c = tf.assign(c, [4.0, 4.0, 4.0]) definieren, so dass jedes Mal, wenn Sie laufen y aus, c = tf.assign(c, [4.0, 4.0, 4.0]) diese op immer excuted werden und obwohl andere assign Operationen werden auch excuted werden aber nicht beeinflussen das Endergebnis.

Verwandte Themen