Моя модель LSTM перекрывает данные проверки - PullRequest
1 голос
/ 07 марта 2020

Вот моя модель LSTM для классификации жестов рук. Изначально у меня было 1960 тренировочных данных формы (num_sequence, num_joints, 3), которые я изменяю в форму (num_sequence, num_joints * 3).

Вот моя модель:

input_shape = (trainx.shape[1], trainx.shape[2])
print("Build LSTM RNN model ...")
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(171, 66)))

model.add(Bidirectional(LSTM(units=256,  activation='tanh', return_sequences=True, input_shape=input_shape)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Bidirectional(LSTM(units=128,  activation='tanh',    return_sequences=True)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Bidirectional(LSTM(units=128,  activation='tanh',    return_sequences=False)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Dense(units=trainy.shape[1], activation="softmax"))

print("Compiling ...")
# Keras optimizer defaults:
# Adam   : lr=0.001, beta_1=0.9,  beta_2=0.999, epsilon=1e-8, decay=0.
# RMSprop: lr=0.001, rho=0.9,                   epsilon=1e-8, decay=0.
# SGD    : lr=0.01,  momentum=0.,                             decay=0.
opt = Adam()
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])

Я получаю точность 90% в поезде и 50% в тесте

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Откуда вы знаете, что сеть перегружена по сравнению с какой-то ошибкой в ​​вашем наборе данных? Потеря проверки достоверности улучшается первоначально до некоторой эпохи, затем плато или начинает увеличиваться? Тогда это более уместно. Если он начинается с 50% и остается там, это не является проблемой чрезмерной подгонки. С количеством выпадения у вас не слишком похоже. Как вы выбрали свой набор проверки? Это было случайно выбрано из общего набора данных, или вы сделали выбор? Всегда лучше случайным образом выбирать данные, чтобы их распределение вероятностей совпадало с распределением обучающих данных. Как сказано в комментариях, пожалуйста, покажите свой код для model.fit, там может быть проблема. Как вы вводите данные? Вы использовали генераторы? Точность проверки 50% заставляет меня заподозрить некоторую ошибку в том, как ваши данные проверки передаются в сеть, или некоторую ошибку в маркировке данных проверки. Я бы также порекомендовал вам рассмотреть вопрос об использовании динамической настройки скорости обучения на основе мониторинга потерь при валидации. Керас имеет обратный вызов для этого называется ReduceLROnPlateau. Документация здесь . Настройте его для мониторинга потери проверки. Я установил параметры терпение = 3 и фактор = .5, который, кажется, работает хорошо. Вы можете думать о тренировках как о спуске в долину. Когда вы спускаетесь, долина становится уже. Если скорость обучения слишком велика и остается фиксированной, вы не сможете достичь минимума. Это должно повысить точность обучения, что должно привести к повышению точности проверки. Как я уже говорил с уровнем отсева, я не думаю, что он подходит, но если это так, вы также можете использовать регуляризацию Keras, чтобы избежать переучивания. Документация здесь .

0 голосов
/ 07 марта 2020

Переоснащение довольно распространено в глубоком обучении. Чтобы обойти соответствие вашей архитектуре LSTM, попробуйте выполнить следующие действия в следующем порядке:

  1. Уменьшите скорость обучения с 0,1 или 0,01 до 0,001,0,0001,0,00001.
  2. Уменьшите число эпохи. Вы можете попытаться изобразить точность обучения и проверки как функцию количества эпох и посмотреть, когда точность обучения станет больше, чем точность проверки. Это количество эпох, которые вы должны использовать. Объедините это с 1-м шагом, уменьшающим скорость обучения.
  3. Затем вы можете попытаться изменить архитектуру LSTM, здесь вы уже добавили отсев (максимальное значение 0,5), я бы предложил попробовать 0,2, 0,3. У вас есть 3 ячейки, что лучше, чем 2, размер узлов выглядит разумно. Какое измерение встраивания вы используете в настоящее время? Поскольку вы переоснащаете, стоит попытаться уменьшить количество ячеек с 3 до 2 и сохранить одинаковое количество узлов.
  4. Размер пакета может быть важен, как и распределение подклассов в вашем наборе данных. Является ли набор данных равномерно распределенным и одинаково сбалансированным между обучающими и проверочными наборами? Под этим я подразумеваю, что если в обучающем наборе будет представлен один жест рукой по сравнению с проверочным набором, это может быть проблемой. Хорошей стратегией для преодоления этого является сохранение некоторой части данных в качестве тестового набора. Затем проведите перекрестную валидацию с помощью склеарна (5 раз). Затем тренируйте свою архитектуру на каждой модели поезда / сплит отдельно (5 раз) и сравнивайте точность обучения и валидации. Если в разделении или среди наборов есть большой уклон, вы сможете идентифицировать его таким образом.
  5. В заключение вы можете попробовать увеличение, в частности вращение и горизонтальное / вертикальное отражение. Эта библиотека может помочь https://github.com/aleju/imgaug

Надеюсь, это поможет!

...