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)
的张量
我想实现一个能够学习线性运动模型的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)