Потеря валидации ›› Потеря поезда, те же данные, двоичный классификатор

Я реализовал нейронную сеть этой статьи с некоторыми отличиями (изображение ниже) для классификации ЭЭГ; train_on_batch производительность отличная, с очень низкими потерями, но test_on_batch производительность, хотя и для одних и тех же данных, оставляет желать лучшего: кажется, что сеть всегда предсказывает '1', большую часть времени:

       TRAIN (loss,acc)   VAL (loss,acc)
'0' -- (0.06269842,1)     (3.7652588,0)
'1' -- (0.04473557,1)     (0.3251827,1)

Данные передаются в виде 30-секундных сегментов (12000 временных шагов) (10 минут на набор данных) из 32 (= batch_size) наборов данных одновременно (изображение ниже)

Любое средство?


Попытка устранения неполадок:

  1. Отключение отсева
  2. Отключение всех регуляризаторов (кроме пакетной нормы)
  3. Случайным образом val_acc ('0', '1') = (~ .90, ~ .12) - затем обратно к (0,1)

Дополнительная информация:

  • Keras 2.2.4 (бэкэнд TensorFlow), Python 3.6, Spyder 3.3.4 через Anaconda
  • CuDNN LSTM с отслеживанием состояния
  • CNN предварительно обучены, LSTM добавлены впоследствии (и оба обучены)
  • BatchNormalization после каждого уровня CNN и LSTM
  • reset_states() применяется между разными наборами данных
  • squeeze_excite_block вставляется после каждого но последний блок CNN


ОБНОВЛЕНИЕ: достигнут прогресс; batch_normalization и dropout - главные виновники. Значительные перемены:

  • Удалены блоки LSTM, GaussianNoise, SqueezeExcite (изображение ниже)
  • Реализован патч batch_norm
  • Добавлено sample_weights для отражения дисбаланса классов - варьировалось от 0,75 до 2.
  • Обучен различным схемам разминки как для MaxPool, так и для выпадения входов

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

Кроме того, BatchNormalization выходы во время обучения и времени тестирования значительно различаются (изображение ниже)


ОБНОВЛЕНИЕ 2: Все другие подозрения были исключены: виновата BatchNormalization. Использование самонормализующихся сетей (SNN) с SELU и AlphaDropout вместо BatchNormalization дает стабильные и последовательные результаты.


person OverLordGoldDragon    schedule 22.05.2019    source источник
comment
Я бы порекомендовал 1) построить график точности обучения и потери обучения по эпохам. Если точность достигает 100% на раннем этапе или потери в обучении падают слишком быстро, увеличьте регуляризацию 2) при переобучении (более вероятно) - увеличьте скорость обучения, при недостаточном уровне - уменьшите обучение   -  person y.selivonchyk    schedule 22.05.2019
comment
Цитированная статистика сохраняется для всех наборов данных; наборы для обучения и проверки одинаковы   -  person OverLordGoldDragon    schedule 23.05.2019


Ответы (1)


Я случайно оставил один нестандартный образец (в пакете из 32 штук) с sigma=52 - что серьезно нарушило BN слои; после стандартизации я больше не наблюдаю сильного несоответствия между режимами обучения и вывода - во всяком случае, какие-либо различия трудно заметить.

Кроме того, вся предварительная обработка была очень ошибочной - после правильного повторения проблема больше не возникает. В качестве совета по отладке попробуйте определить, не влияет ли какой-либо конкретный набор данных поезда резко на активацию слоев во время логического вывода.

person OverLordGoldDragon    schedule 07.07.2019