张量流中模型之间的传递参数会减慢训练时间

时间:2018-10-18 14:18:43

标签: python tensorflow

我已经开发了一个模型,该模型要求我具有模型的两个版本,一个版本在训练步骤之前,一个版本在训练步骤之后。我以为我可以使用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_hupdate_v时性能会持续下降。有什么想法吗?

1 个答案:

答案 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%肯定有一种更简洁的方法,但这就是我所拥有的!