Изучение нелинейного отображения с использованием модулей LSTM: столкновение с переоснащением - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь использовать рекуррентную нейронную сеть для выполнения слияния датчиков для инерциальной единицы измерения. IMU обычно используются в сочетании с фильтром Калмана (KF), который выполняет объединение данных акселерометра и гироскопа вместе с «сглаживанием», что приводит к отфильтрованному окончательному выводу ориентации (и позиции, если это необходимо). Из любопытства я пытаюсь воспроизвести эту функциональность, используя нейронную сеть, содержащую единицы LSTM: то есть получить сеть для вычисления скрытого представления, которое фильтры Калмана оценивают с использованием обучающих данных. Чтобы заставить сеть реплицировать работу алгоритма слияния фильтров Калмана, мой первый шаг состоял в том, чтобы обучить его вводам необработанных данных датчиков и выводам, полученным из наземной истины.

Пример необработанных данных датчика :

enter image description here

Пример выходной ориентации :

enter image description here

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 / количества эпох, для которых обучается модель, я сталкиваюсь с очень странной проблемой переоснащения. Модель хорошо соответствует обучающим данным, но очень плохо ведет себя с данными валидации: что я считаю странным, потому что в моем первом тесте данные валидации являются просто расширением тех же «движений», которые имеют данные тренировки, так что это не похоже на данные валидации взяты из совершенно другого распределения: поэтому, если вы в состоянии уместить данные обучения, вы также должны уметь соответствовать валидации.

Фактические данные: (только одна ось для ясности)

enter image description here

Прогнозные данные (синий - обучение, оранжевый - проверка:

enter image description here

Почему моя модель перекрывает данные, даже если данные обучения и проверки имеют очень похожее отображение ввода-вывода?

...