首页 > 解决方案 > 使用 TensorFlow 在没有 dict_feed 的移动时间序列数据窗口上优化图形

问题描述

我试图在 Tensorflow 中设置一个优化图,避免使用feed_dicta tf.FIFOQueue- 至少这似乎是时间序列数据的正确方向。

我将首先使用 描述我的图表的外观(以最少的术语)feed_dict,然后我试图将它放在哪里。

假设我的时间序列存储在一个 numpy 数组中time_series

wnd = 10 # window size
data_wnd = np.array([time_series[n:n+wnd] for n in range(1,time_series.size()+1)])

现在data_wnd[k]可以表示k时间序列中的窗口。

假设step是我的 Tensorflow 优化器,这将经典地工作如下:

for k in range(data_wnd.shape[0]):
    for n in range(epochs):
        sess.run(step, feed_dict={data_:data_wnd[k]})
    # Do stuff after optimization and proceed to next window frame
    # the optimized variable values for this frame are the initial values for the next frame

如果我没有窗口,那么data_我可以简单地使用 atf.constant并摆脱feed_dict. 所以这是不可能的。

所以进来tf.FIFOQueue

q = tf.FIFOQueue(capacity=5, shapes=(wnd))
nq_op = q.enqueue(data_wnd[0])
qr = tf.train.QueueRunner(q, [nq_op]*1) # nq_op is not right
tf.train.add_queue_runner(qr)
data_ = q.dequeue() # instead of a placeholder

太好了,所以现在我有一个队列,但这显然是错误的。qr需要根据k. 有没有办法获得enqueueQueueRunner选择正确的框架?

更好的是,是否有一些专门的 Tensorflow API 可以以这种方式处理时间序列数据?

解决方案的一个重要约束要求我将所有内容保持在同一个会话中,并且不会重新初始化变量,因为一帧的优化解决方案接近前一帧的优化解决方案。

不完整的提案

我想有几个nq_op定义如下:

nq_op = []
for k in range(data_wnd.shape[0]):
    nq_op = np.append(nq_op, q.enqueue(data_wnd[0]))

但这仍然需要QueueRunner正确选择enqueue

另一个提议

显然 Tensorflow 现在有一个tf.dataAPI,但我不知道从哪里开始 - 或者就此而言,结束 - 使用这个 API。

标签: pythontensorflowtensorflow-datasets

解决方案


我发现 FIFOQueue 不是正确的方向。

相反,此页面在Preloaded Data下提供了正确的方法。

我们可以使用占位符和变量的组合,而不是简单地使用占位符data_

data_init = tf.placeholder(tf.float32, data_wnd.shape[0])
data_ = tf.Variable(data_init, trainable=False, collection=0)

适当定义的位置VarType和位置。TensorShape

然后在我们的循环中:

for k in range(data_wnd.shape[0]):
    sess.run(data_.initializer, feed_dict={data_:data_wnd[k]})
    for n in range(epochs):
        sess.run(step)

请注意,我们不再需要为每个 提供数据n,而只是在我们将窗口向前移动时。


推荐阅读