tf.TensorArray应该记住多个计算步骤?

时间:2017-06-07 16:20:33

标签: tensorflow

我正在尝试这个:

  ta = tf.TensorArray(tf.int32, size=3)
  index = tf.placeholder(tf.int32)
  value = tf.placeholder(tf.int32)
  flow = tf.placeholder(tf.float32)
  ta_new = tf.TensorArray(dtype=ta.dtype, handle=ta.handle, flow=flow)
  write = ta_new.write(index, value).flow
  read = ta_new.read(index)
  f = 0
  f = session.run(write, feed_dict={index: 0, value: 1, flow: f})
  f = session.run(write, feed_dict={index: 1, value: 2, flow: f})
  assert_equal(session.run(read, feed_dict={index: 0, flow: f}), 1)
  assert_equal(session.run(read, feed_dict={index: 1, flow: f}), 2)

这不起作用。我收到错误:

Could not read from TensorArray index 0 because it has not yet been written to.

有没有办法让它发挥作用?

据我了解,TensorArray.flow用作tf.control_dependencies的替代品,也可能用于获得渐变效果?我猜标量本身没有任何意义。我也猜测使用它作为占位符不会那么有意义。但我原以为它仍然有用。

也许无法在TensorArray的多个计算步骤中存储值?还有其他选择吗?我基本上需要这个。例如。 tf.FIFOQueue不会给我随机索引访问。

1 个答案:

答案 0 :(得分:0)

tf.TensorArray在内部使用每次运行(“每步”)资源管理器。 请参阅TensorArrayCreationOp here。每次运行意味着,资源不会存储在session.run()次调用中。

如果它将使用全局资源管理器,则演示代码应该起作用,因为它应该保持会话中的资源。不幸的是,没有办法改变这种行为。

我试图重载该类并实现一个基本上表现相同但使用全局资源管理器的版本。不幸的是,tensor_array.h不是官方PIP包的一部分(报告为here),因此无法使用PIP包进行编译。