je le code Théano simple suivant que je veux reproduire tensorflow:Comment assigner séparément une valeur à un graphique de variable et de calcul dans TensorFlow?
import theano as th
import theano.tensor as T
import numpy as np
x = T.vector()
c = th.shared(np.array([1.0, 2.0]))
y1 = x + c
c.set_value(np.array([10.0, 20.0]))
y2 = x + c
c.set_value(np.array([100.0, 200.0]))
print 'Y1:', th.function([x],y1)([0.0, 0.0])
print 'Y2:', th.function([x],y2)([0.0, 0.0])
Dans le code ci-dessus je définis deux variables symboliques (y1
et y2
) qui dépendent de x
et c
de la même manière (x + c
). La variable partagée c
à chaque instant a une valeur. Chaque fois que j'évalue y1
et y2
je reçois toujours des valeurs identiques correspondant à la valeur actuelle de c
.
Maintenant, voilà comment j'essaie de le reproduire dans tensorflow:
import tensorflow as tf
s = tf.Session()
x = tf.placeholder(tf.float32)
c = tf.Variable([1.0, 2.0])
y1 = x + c
c = tf.assign(c, [10.0, 20.0])
s.run(c)
y2 = x + c
c = tf.assign(c, [100.0, 200.0])
s.run(c)
print 'Y1:', s.run(y1, feed_dict = {x : [0.0, 0.0]})
print 'Y2:', s.run(y2, feed_dict = {x : [0.0, 0.0]})
Du premier point de vue de la structure du code est identique (syntaxe juste différent). Cependant, le comportement est différent. Comme la sortie de ce code, je reçois:
Y1: [ 100. 200.]
Y2: [ 10. 20.]
La raison pour les différentes valeurs de y1
et y2
est clair pour moi: la première affectation à la c
(c = tf.assign(c, [10.0, 20.0])
) se fait avant la définition de y2
et par conséquent, ce affectation devient une partie du graphique de calcul pour y2
. Donc, maintenant ma question est de savoir s'il est possible dans TensorFlow de définir une valeur à Variable
sans faire de l'affectation une partie des graphiques de calcul de toutes les variables symboliques que je définirai plus tard.
En d'autres termes, je veux construire un graphique de calcul (dans le cas ci-dessus l'un pour y2
) qui prendra la valeur actuelle de la c
variable et ignorer toutes les affectations qui ont été faites à c
avant y2
a été défini.