运行 在tensorflow中多次训练op

Run train op multiple times in tensorflow

我有一些相当大的批量大小,我想对其进行多个梯度步骤。虽然我可以使用 python for 循环轻松地做到这一点,但我想可能有一种更有效的方法,它不涉及在每次迭代时将数据传输到 gpu。我已经多次尝试将 train op 放入获取列表中,但我不确定它实际上是 运行 不止一次(运行 时间完全相同)。

如果你这样做 sess.run([myop,myop]) 那只会 运行 myop 一次。

如果您想 运行 操作,但不想将其结果提取到 Python 运行 时间,您可以使用控件依赖项。一种简单的方法是使用 group 操作,即

sess.run(tf.group(myop))
sess.run(tf.group(myop))

如果你的图很大,你可能会通过在 运行 调用之间构造 group 操作来获得额外的开销(对于 >10k 节点图可能需要 10-100 毫秒),因此你可以提前构造它时间

myop_nooutput = tf.group(myop)
sess.run(myop_nooutput)
sess.run(myop_nooutput)

如果您有可变大小的批处理,那么变量不适合保存它,您可以改为使用持久张量在 run 调用之间保留此数据。这是一个玩具示例

t = tf.int32
params = tf.Variable(tf.ones_initializer((), dtype=dt))
data_batches = [[1], [2, 3], [4, 5, 6]]

# op that uploads data to TF and saves it as a persistent Tensor
data_saver_placeholder = tf.placeholder(dt)
tensor_handle_op = tf.get_session_handle(data_saver_placeholder)

data_placeholder, data = tf.get_session_tensor(dt)
train_op = tf.assign_add(params, tf.reduce_prod(data)) 
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)

for batch in data_batches:
    # upload tensor to TF runtime and save its handle
    tensor_handle = sess.run(tensor_handle_op, feed_dict={data_saver_placeholder: batch})
    # run train op several times reusing same data
    for i in range(3):
        sess.run(train_op, feed_dict={data_placeholder: tensor_handle.handle})


assert sess.run(params) == 382