我想实现能够学习线性运动模型的 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 中实现它。以前有人做过类似的事吗?我仍然对动态和静态轴和前向声明感到困惑。
我的问题的另一个表述是:如何教网络整合或总结。
感谢您的每一条评论或提示。
答案 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)