У меня есть сверточная модель + LSTM в Керасе, похожая на эту (ссылка 1), которую я использую для конкурса Kaggle. Архитектура показана ниже. Я обучил его на своем маркированном наборе из 11000 образцов (два класса, начальная распространенность ~ 9: 1, поэтому я увеличил выборку с 1 до примерно 1/1) в течение 50 эпох с 20% -ным разделением проверки. Я получал явное переобучение какое-то время, но я думал, что все под контролем с шумом и пропадающими слоями.
Модель выглядела так, как будто она тренируется замечательно, в конце набрала 91% на всей тренировке, но после тестирования на тестовых данных абсолютный мусор.
Примечание: точность проверки выше, чем точность обучения. Это противоположно «типичному» оснащению.
Моя интуиция заключается в том, что с учетом небольшого разбора валидации модель все еще может слишком сильно соответствовать входному набору и теряет обобщение. Другая подсказка в том, что val_acc больше чем acc, что выглядит подозрительно. Это наиболее вероятный сценарий здесь?
Если это переобучение, уменьшит ли это разделение проверки достоверности, или я столкнусь с той же проблемой, так как в среднем каждый образец будет видеть половину всех эпох еще?
Модель:
Layer (type) Output Shape Param # Connected to
====================================================================================================
convolution1d_19 (Convolution1D) (None, None, 64) 8256 convolution1d_input_16[0][0]
____________________________________________________________________________________________________
maxpooling1d_18 (MaxPooling1D) (None, None, 64) 0 convolution1d_19[0][0]
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, None, 64) 128 maxpooling1d_18[0][0]
____________________________________________________________________________________________________
gaussiannoise_5 (GaussianNoise) (None, None, 64) 0 batchnormalization_8[0][0]
____________________________________________________________________________________________________
lstm_16 (LSTM) (None, 64) 33024 gaussiannoise_5[0][0]
____________________________________________________________________________________________________
dropout_9 (Dropout) (None, 64) 0 lstm_16[0][0]
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64) 128 dropout_9[0][0]
____________________________________________________________________________________________________
dense_23 (Dense) (None, 64) 4160 batchnormalization_9[0][0]
____________________________________________________________________________________________________
dropout_10 (Dropout) (None, 64) 0 dense_23[0][0]
____________________________________________________________________________________________________
dense_24 (Dense) (None, 2) 130 dropout_10[0][0]
====================================================================================================
Total params: 45826
Вот вызов для соответствия модели (вес класса обычно составляет около 1: 1, так как я увеличил дискретизацию ввода):
class_weight= {0:1./(1-ones_rate), 1:1./ones_rate} # automatically balance based on class occurence
m2.fit(X_train, y_train, nb_epoch=50, batch_size=64, shuffle=True, class_weight=class_weight, validation_split=0.2 )
В SE есть какое-то глупое правило, согласно которому я могу публиковать не более 2 ссылок, пока моя оценка не станет выше, поэтому вот пример на тот случай, если вы заинтересованы: Ссылка 1: machinelearningmastery DOT com SLASH sequence-классификация-lstm-recurrent-нейронные сети- питон-keras