2017-10-06 4 views
0

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.

Répondre

1

Vous ne devez pas remplacer la variable Python c avec l'opération d'affectation. Vous pouvez attribuer une nouvelle valeur à c en exécutant la correspondante assignez opération comme celle-ci:

s = tf.Session() 
x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 2.0]) 
y1 = x + c 
s.run(tf.assign(c, [10.0, 20.0])) 
y2 = x + c 
s.run(tf.assign(c, [100.0, 200.0])) 

print 'Y1:', s.run(y1, feed_dict = {x : [0.0, 0.0]}) # Y1: [ 100. 200.] 
print 'Y2:', s.run(y2, feed_dict = {x : [0.0, 0.0]}) # Y2: [ 100. 200.] 

Si pour une raison quelconque, vous voulez stocker l'opération d'affectation dans une variable, juste lui donner un autre nom:

s = tf.Session() 
x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 2.0]) 
y1 = x + c 
a = tf.assign(c, [10.0, 20.0]) 
s.run(a) 
y2 = x + c 
a = tf.assign(c, [100.0, 200.0]) 
s.run(a) 
print 'Y1:', s.run(y1, feed_dict = {x : [0.0, 0.0]}) # Y1: [ 100. 200.] 
print 'Y2:', s.run(y2, feed_dict = {x : [0.0, 0.0]}) # Y2: [ 100. 200.] 

Notez que dans les deux cas, tf.assign(c, [10.0, 20.0]) est redondant car il sera immédiatement remplacé par la nouvelle valeur - Je ne sais pas si je comprends bien votre question, donc s'il vous plaît ne hésitez pas à développer davantage votre problème.