代码之家  ›  专栏  ›  技术社区  ›  AOK

使用TensorFlow在不使用dict_馈送的情况下优化移动时间序列数据窗口上的图形

  •  0
  • AOK  · 技术社区  · 6 年前

    我试图在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。

    1 回复  |  直到 6 年前
        1
  •  0
  •   AOK    6 年前

    我发现先进先出是不对的。

    相反, this page 提供正确的方法 预加载数据 .

    我们可以使用占位符和变量的组合来代替简单地使用占位符。 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 但只有当我们把窗户往前移的时候。