2 votes

Comment obtenir la valeur déterministe de la variable d'étape globale (strictement après ou strictement avant l'incrémentation)

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)

2voto

BlueSun Points 2810

Vous pouvez utiliser ceci pour lire l'étape globale après train_op:

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.control_dependencies([train_op]):
    global_step_value = global_step.read_value()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    step, _ = sess.run([global_step_value, train_op])
    print(step)

Ici global_step_value n'est plus une variable. C'est un tenseur avec la valeur de global_step après que train_op a été calculé. Cela est décrit ici sous "Utilisation des variables".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X