【发布时间】:2016-03-16 12:54:15
【问题描述】:
我正在尝试使用 Python 线程通过 TensorFlow 实现异步梯度下降。在主代码中,我定义了图形,包括一个训练操作,它获取一个变量来保持global_step 的计数:
with tf.variable_scope("scope_global_step") as scope_global_step:
global_step = tf.get_variable('global_step', [], initializer=tf.constant_initializer(0), trainable=False)
optimizer = tf.train.GradientDescentOptimizer(FLAGS.learning_rate)
train_op = optimizer.minimize(loss, global_step=global_step)
如果我打印global_step 的名字,我会得到:
scope_global_step/global_step:0
主代码还启动了几个线程来执行training方法:
threads = [threading.Thread(target=training, args=(sess, train_op, loss, scope_global_step)) for i in xrange(NUM_TRAINING_THREADS)]
for t in threads: t.start()
如果global_step 的值大于或等于FLAGS.max_steps,我希望每个线程停止执行。为此,我构建了training 方法,如下所示:
def training(sess, train_op, loss, scope_global_step):
while (True):
_, loss_value = sess.run([train_op, loss])
with tf.variable_scope(scope_global_step, reuse=True):
global_step = tf.get_variable('global_step', [], initializer=tf.constant_initializer(0), trainable=False)
global_step = global_step.eval(session=sess)
if global_step >= FLAGS.max_steps: break
失败并显示以下消息:
ValueError:共享不足:变量 scope_global_step/global_step 不存在,不允许。您的意思是在 VarScope 中设置 reuse=None 吗?
我可以看到 :0 在第一次创建时添加到变量的名称中,当我尝试检索它时,没有使用该后缀。为什么是这样?
如果我在尝试检索变量时手动将后缀添加到变量的名称中,它仍然声称该变量不存在。为什么 TensorFlow 找不到变量?变量不应该在线程之间自动共享吗?我的意思是,所有线程都在同一个会话中运行,对吗?
还有一个与我的training 方法相关的问题:global_step.eval(session=sess) 会再次执行图表,还是会在执行train_op 和loss 操作后获取分配给gloabl_step 的值?一般来说,从要在 Python 代码中使用的变量中获取值的推荐方法是什么?
【问题讨论】:
标签: python multithreading tensorflow