Mam w Keras model splotowy + LSTM, podobny do tego (ref 1), którego używam do konkursu Kaggle. Architektura jest pokazana poniżej. Przeszkoliłem go na moim oznaczonym zestawie 11000 próbek (dwie klasy, początkowa częstość wynosi ~ 9: 1, więc zwiększyłem próbkę 1 do około 1/1) dla 50 epok z 20% podziałem walidacji. przez jakiś czas, ale myślałem, że to opanowało hałas i warstwy odpadające.
Model wyglądał, jakby trenował cudownie, na koniec uzyskał 91% na całym zestawie treningowym, ale po przetestowaniu na zestawie danych testowych absolutne śmieci.
Uwaga: dokładność walidacji jest wyższa niż dokładność szkolenia. Jest to przeciwieństwo „typowego” nadmiernego dopasowania.
Moją intuicją jest to, że biorąc pod uwagę niewielki podział sprawdzania poprawności, model nadal zbyt dobrze dopasowuje się do zestawu danych wejściowych i traci uogólnienie. Inną wskazówką jest to, że val_acc jest większy niż acc, co wydaje się podejrzane. Czy to najbardziej prawdopodobny scenariusz?
Jeśli to się nie zgadza, czy zwiększenie podziału sprawdzania poprawności w ogóle to złagodzi, czy też mam do czynienia z tym samym problemem, ponieważ przeciętnie każda próbka nadal widzi połowę wszystkich epok?
Model:
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
Oto wezwanie do dopasowania modelu (waga klasy wynosi zwykle około 1: 1, ponieważ zwiększyłem próbkę danych wejściowych):
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 ma głupią zasadę, że mogę opublikować nie więcej niż 2 linki, dopóki mój wynik nie będzie wyższy, więc oto przykład, jeśli jesteś zainteresowany: Ref 1: machinelearningmastery DOT com SLASH sekwencja-klasyfikacja-lstm-rekurencyjna-sieci neuronowe- python-keras