通常,通过交替训练鉴别器和生成器来训练GAN,即:
for i in range(num_steps):
sess.run(minimize_loss_D)
sess.run(minimize_loss_G)
我很好奇我是否可以使用tf.group
来实现相同的行为,即:
op = tf.group(minimize_loss_D, minimize_loss_G)
for i in range(num_steps):
sess.run(op)
这是否相同,或者运行分组操作是否存在根本不同的事情,而不是连续运行多个单个操作?
答案 0 :(得分:3)
我通常使用tf.control_dependencies。我认为分组也可以工作,但这将是鉴别器和发生器的并行更新。在传统的GAN体系结构中,不是并行地顺序更新。至少从理论的角度来看,每个都是按顺序更新是很重要的。此外,通过使用控件依赖项,您可以显着减少backprop所需的内存量。如果Tensorflow尝试并行执行两个操作,则需要为两个操作存储渐变。同样在实践中,使用控件依赖性相当快,并且应该比执行两次会话运行更快。
我通常像这样构建更新:
with tf.name_scope('optimize'):
g_min = opt.minimize(model.g_loss, var_list=model.g_vars, name='g_op')
with tf.control_dependencies([g_min]):
d_min = opt.minimize(model.d_loss, var_list=model.d_vars, name='d_op')
train_op = d_min
#sess.run(train_op)