我试图在TensorFlow中建立一个优化图,避免使用
feed_dict
用一个
tf.FIFOQueue
-至少对于时间序列数据来说,这似乎是正确的方向。
我将首先使用
馈送口述
然后我要把它带到哪里。
假设我的时间序列存储在一个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
是我的张量流优化器,它的经典工作方式如下:
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_
我可以简单地使用
tf.constant
并摆脱
馈送口述
. 所以这是不可能的。
所以进来了
tf.先进先出队列
:
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
. 有没有办法
enqueue
或
QueueRunner
选择正确的帧?
更好的是,是否有专门的TensorFlowAPI以这种方式处理时间序列数据?
解决方案的一个重要约束要求我将所有内容保存在同一个会话中,并且变量不会重新初始化,因为帧的优化解决方案接近上一帧的优化解决方案。
不完整的建议
我想喝几杯
nq_op
定义如下:
nq_op = []
for k in range(data_wnd.shape[0]):
nq_op = np.append(nq_op, q.enqueue(data_wnd[0]))
但这仍然需要
隧道工
正确选择右侧
排队
.
另一个建议
显然TensorFlow现在有一个
tf.data
API,但是我不知道从哪里开始——或者就此而言,结束——使用这个API。