Considérez le code suivant :
import tensorflow as tf
global_step = tf.train.create_global_step()
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
train_op = optimizer.minimize(x, global_step=global_step)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
step, _ = sess.run([global_step, train_op])
print(step)
La sortie que j'ai obtenue était '1', mais je pense que rien n'empêche Tensorflow de me donner '0' à la place, c'est-à-dire la valeur de la variable de l'étape globale avant l'opération 'assign' qui l'incrémente dans le train_op
. J'ai en fait un autre programme Tensorflow, plus compliqué, qui présente ce comportement, où la valeur de l'étape globale que j'obtiens de Session.run([global_step, train_op])
diffère d'un à l'autre entre deux machines où je le lance.
Pour la variable de l'étape globale, comment puis-je obtenir définitivement sa valeur avant le train_op
ou définitivement obtenir sa valeur après le train_op
?
Je sais que je peux exécuter un sess.run([global_step])
séparément avant ou après sess.run([train_op])
mais j'aimerais faire autant que possible dans une seule session.run()
si cela ne complique pas trop le code. Je sais que je peux obtenir la valeur pré-incrémentation en affectant global_step
à une autre variable et en créant une dépendance de contrôle entre tf.assign
et train_op
:
import tensorflow as tf
global_step = tf.train.create_global_step()
global_step2 = tf.get_variable('step-mirror', dtype=global_step.dtype,
shape=global_step.shape)
global_step2 = tf.assign(global_step2, global_step)
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
with tf.control_dependencies([global_step2]):
train_op = optimizer.minimize(x, global_step=global_step)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
step, _ = sess.run([global_step2, train_op])
print(step)
Mais je cherche une façon plus simple, peut-être une fonctionnalité de Tensorflow que je ne connais pas pour spécifier l'évaluation d'une variable avant toute affectation.
ÉDIT : En réponse à ce commentaire, cela ne fonctionne pas et affiche '1' au lieu de '0' :
import tensorflow as tf
global_step = tf.train.create_global_step()
x = tf.Variable(100.0)
optimizer = tf.train.AdamOptimizer()
with tf.control_dependencies([global_step]):
train_op = optimizer.minimize(x, global_step=global_step)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
step, _ = sess.run([global_step, train_op])
print(step)