Я реализовал нейронную сеть этой статьи с некоторыми отличиями (изображение ниже) для классификации ЭЭГ; 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) наборов данных одновременно (изображение ниже)
Любое средство?
Попытка устранения неполадок:
- Отключение отсева
- Отключение всех регуляризаторов (кроме пакетной нормы)
- Случайным образом 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 и LSTMreset_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 дает стабильные и последовательные результаты.