我已经开发了一个模型,该模型要求我具有模型的两个版本,一个版本在训练步骤之前,一个版本在训练步骤之后。我以为我可以使用tf.assign()方法调用来简单地完成此操作,但是看来这大大降低了培训速度。
Why does tf.assign() slow the execution time?
这篇文章提出了类似的问题,但是作者只是试图更新学习率,并且可以通过添加feed_dict来做到这一点。但是,就我而言,真的无法避免调用tf.assign吗?另一个解决方案涉及将图形定义和图形运行分开,但是由于我要求两者都在会话中,因为它们需要访问其他模型的参数,所以我不确定该怎么做。
感谢您的帮助。
代码很简单:
tf.assign(var[0], var[2])
tf.assign(var[1], var[3])
Q_agent.train(...)
和var[0]
和var[1]
是Q_agent的参数。
在这种情况下,培训时间很长。我调整了代码以尝试使用tf.placeholder。代码如下:
var = tf.trainable_variables()
params = [var[4], var[5]]
update_hidden = tf.placeholder(params[0].dtype, shape=params[0].get_shape())
update_value = tf.placeholder(params[1].dtype, shape=params[1].get_shape())
for loop:
var = tf.trainable_variables()
old_hidden = var[0]
old_value = var[1]
new_hidden = var[2]
new_value = var[3]
update_h = old_hidden.assign(update_hidden)
update_v = old_value.assign(update_value)
sess.run([update_h, update_v], feed_dict={update_hidden: new_hidden.eval(), update_value: new_value.eval()})
尽管训练功能现在可以快速运行,但这并没有提高代码的效率,因为在运行update_h
和update_v
时性能会持续下降。有什么想法吗?
答案 0 :(得分:0)
已解决。关键是定义tf.assign(),以便仅在训练循环中调用一次,而不是调用它。否则,如果您每次都调用它,则会在图上添加一个新节点,这意味着您必须在每次迭代后进行其他计算。
var = tf.trainable_variables()
old_hidden = var[0]
old_value = var[1]
update_h = old_hidden.assign(update_hidden)
update_v = old_value.assign(update_value)
for loop:
# overwrite old_hidden and old_value here.
var = tf.trainable_variables()
old_hidden = var[0]
old_value = var[1]
new_hidden = var[2]
new_value = var[3]
# update_h = old_hidden.assign(update_hidden)
# update_v = old_value.assign(update_value)
sess.run([update_h, update_v], feed_dict={update_hidden: new_hidden.eval(), update_value: new_value.eval()})
我100%肯定有一种更简洁的方法,但这就是我所拥有的!