Я пытаюсь использовать рекуррентную нейронную сеть для выполнения слияния датчиков для инерциальной единицы измерения. IMU обычно используются в сочетании с фильтром Калмана (KF), который выполняет объединение данных акселерометра и гироскопа вместе с «сглаживанием», что приводит к отфильтрованному окончательному выводу ориентации (и позиции, если это необходимо). Из любопытства я пытаюсь воспроизвести эту функциональность, используя нейронную сеть, содержащую единицы LSTM: то есть получить сеть для вычисления скрытого представления, которое фильтры Калмана оценивают с использованием обучающих данных. Чтобы заставить сеть реплицировать работу алгоритма слияния фильтров Калмана, мой первый шаг состоял в том, чтобы обучить его вводам необработанных данных датчиков и выводам, полученным из наземной истины.
Пример необработанных данных датчика :
Пример выходной ориентации :
1021 *
Сеть принимает входные данные `6x4 + 6 = 30` (3 скорости от гироскопа, 3 ускорения от акселерометра с настоящего момента наряду с ускорениями за последние 4 момента времени) и направлена на обеспечение 3 выходных сигналов (крен, шаг и рыскания). Структура сети
Ввод -> Единицы LSTM (128) -> Плотный слой (128) -> Плотный слой (64) -> Выход (3)
Мои начальные тренировочные данные состояли из данных датчиков шума от гироскопа и акселерометра во входной и истинной ориентации земли от другого датчика в качестве выходного сигнала, из которого я ожидал, что сеть попытается изучить нелинейное отображение между датчиками и ориентацией , Ядро моей модели (код в Керасе) выглядит так:
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 / количества эпох, для которых обучается модель, я сталкиваюсь с очень странной проблемой переоснащения. Модель хорошо соответствует обучающим данным, но очень плохо ведет себя с данными валидации: что я считаю странным, потому что в моем первом тесте данные валидации являются просто расширением тех же «движений», которые имеют данные тренировки, так что это не похоже на данные валидации взяты из совершенно другого распределения: поэтому, если вы в состоянии уместить данные обучения, вы также должны уметь соответствовать валидации.
Фактические данные: (только одна ось для ясности)
Прогнозные данные (синий - обучение, оранжевый - проверка:
Почему моя модель перекрывает данные, даже если данные обучения и проверки имеют очень похожее отображение ввода-вывода?