我试图使用一个递归神经网络来执行惯性测量单元的传感器融合。imu通常与Kalman滤波器(KF)结合使用,KF同时执行加速度计和陀螺仪数据的融合和“平滑”,这将导致方向(和位置(如果需要)的滤波最终输出。出于好奇,我尝试使用一个包含LSTM单元的神经网络来复制这个功能:即,让网络计算Kalman滤波器使用训练数据估计的隐藏表示。为了使网络能够复制卡尔曼滤波融合算法的工作,我的第一步是训练它对原始传感器数据的输入和来自地面真实的输出。
原始传感器数据样本
:
样本输出方向
:
â
该网络采用“6x4+6=30”输入(来自陀螺仪的3个速度,加速度计的3个加速度从当前时刻开始,以及过去4个时刻的加速度),旨在提供3个输出(横摇、俯仰和偏航)。网络结构是
输入->LSTM单位(128)->密集层(128)->密集层(64)->输出(3)
我的初始训练数据包括来自陀螺和加速度计的噪声传感器数据(输入)和来自另一个传感器的地面真实方位(输出),我期望网络尝试学习传感器和方位之间的非线性映射。我模型的核心(Keras中的代码)如下所示:
model = Sequential()
model.add(LSTM(128, input_shape=(6, look_back)))
model.add(Dense(128))
model.add(Dense(64))
model.add(Dense(3))
adamOpt = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='mean_squared_error', optimizer=adamOpt, metrics=['accuracy'])
model.fit(trainX, trainY, epochs=5000, batch_size=512, verbose=1)
不管模型训练的LSTM单元数/时间段数,我遇到了一个非常奇怪的过度拟合问题。该模型很好地拟合了训练数据,但在验证数据上表现得很糟糕:我觉得这很奇怪,因为在我的第一次测试中,验证数据只是训练数据所具有的相同“运动”的扩展,所以它不像验证数据来自完全不同的分布:所以如果你能够拟合训练数据,您也应该能够适应验证。
实际数据:(仅为清晰的一个轴)
预测数据(蓝色-训练,橙色-验证:
为什么即使培训和验证数据具有非常相似的输入-输出映射,我的模型也会过度拟合数据?