2016-09-24 3 views

ответ

12

Довольно простое решение:

global_step = tf.Variable(1, name='global_step', trainable=False, dtype=tf.int32) 
increment_global_step_op = tf.assign(global_step, global_step+1) 

Затем, когда вы хотите, чтобы увеличить его, просто запустить этот цит под текущим tf.Sessionsess.

step = sess.run(increment_global_step_op) 

Результат помещается в step это значение переменной увеличивается на единицу после приращения. В этом случае значение global_step будет увеличиваться. Итак, 2.

Если вы используете это для global_step, как я, запустите его вместе с вашим training_op.

result = sess.run([out, increment_global_step_op], {x: [i]}) 
+1

+1 для размещения trainable = False. Обратите внимание, что метод присваивания может быть заменен на tf.assign_add (global_step, 1) – lmsasu

+0

Что я не понимаю, так это то, как global_step коррелирует с моим оптимизатором? Должен ли я явно указывать оптимизатору, что переменная 'global_step' является моим глобальным шагом или как это работает? – thigi

5

инкремент/декремент значения является обычной операцией, так что TF имеет операции для упрощения создания графика: tf.assign_add() и tf.assign_sub(). Они объединяют две операции (tf.assign() и tf.add/tf.sub).

Вот пример использования:

import tensorflow as tf 

x = tf.Variable(0, name='counter') 
inc = tf.assign_add(x, 1, name='increment') 

with tf.Session() as sess: 
    # writer = tf.summary.FileWriter('logs', sess.graph) 
    sess.run(tf.global_variables_initializer()) 
    for _ in xrange(5): 
     print sess.run(inc) 

если вы будете сравнивать tensorboard график в этом примере и в вашем собственном примере, вы увидите, что график имеет меньшее количество узлов.

Смежные вопросы