CNTK输出反馈

时间:2017-07-04 13:25:25

标签: python integration recurrent-neural-network motion cntk

我想实现能够学习线性运动模型 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 中实现它。以前有人做过类似的事吗?我仍然对动态和静态轴和前向声明感到困惑。

我的问题的另一个表述是:如何教网络整合或总结

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

1 个答案:

答案 0 :(得分:0)

由于我不清楚你是否想要对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作为“复发细胞”。如果需要,您可以将其更改为LSTM。要提供数据,只需提供一个形状(time_steps, 3)的数组列表,其中每个数组的time_steps可以不同。如果所有time_steps都相等,您还可以提供形状张量(batch, time_steps, 3)