CNTK 输出反馈

CNTK Output Feedback

我想实现一个能够学习线性运动模型CNTK 网络。类似于卡尔曼滤波器任务,网络将从加速度计接收测量数据,并应输出当前位置的变化。

dx = v_0 * dt + 1/2 * a * dt²

              _____                       __________
input:  a -> |     | -> dx          a -> |          | -> dx :output 
        v -> | NN  | -> dv               | v     dv | -> dv
        ^    |_____|     |               | ^      | |
        |                |               | |_LSTM_| |
        |__ cumsum(dv)___|               |__________|

                                        Desired Aproach

dv 和 dx 的训练数据可用。

由于网络应该免费学习模型,所以我不想输入任何运动模型。我的问题是 没有记住上一个时间步的速度 加速度值没有直接链接到位置变化 .

或者我必须这样做:

              _____                               _____
input:  a -> |     | -> dv -> cumsum(dv) -> v -> |     | -> dx
             | NN  |                             | NN  |
             |_____|                             |_____|

遗憾的是,教程和示例不包含类似的任务。我认为它必须与 RNN、Elman 或 Jordan Network 配合使用。但是我无法在 CNTK 的 python 中实现它。有没有人做过类似的事情?我仍然对动态和静态轴以及前向声明感到困惑。

我的问题的另一种表述是:如何教网络积分或求和

感谢您的每一条评论或提示。

由于我不清楚你是否要对 dv 求和,我将描述你想要 v = cumsum(dv) 的情况;您可以轻松地将其替换为可学习的功能。我假设 3-d 加速度数据。

hidden_dim = 100
tradeoff = 0.5

accel = C.sequence.input_variable(3)
dv = C.sequence.input_variable(3)
dx = C.sequence.input_variable(3)

predicted_dv = C.layers.Recurrence(C.layers.LSTM(3, hidden_dim))(accel)
predicted_v = C.layers.Recurrence(C.plus)(predicted_dv)
combined_inputs = C.splice(accel, predicted_v)
predicted_dx = C.layers.Recurrence(C.layers.LSTM(3, hidden_dim))(combined_inputs)

loss = C.squared_error(predicted_dx, dx) + tradeoff * C.squared_error(predicted_dv, dv)

我任意选择 LSTM 具有 100 维的状态内部表示,但输出 3 维输出。我还任意选择 dx 上的错误是 dv 上错误的两倍。累积总和是一个简单的循环,plus 作为你的 "recurrent cell"。如果需要,您可以将其更改为 LSTM。要提供数据,只需提供形状为 (time_steps, 3) 的数组列表,其中每个数组的 time_steps 可以不同。如果所有 time_steps 都相等,您还可以输入形状为 (batch, time_steps, 3)

的张量