Ho un modello convoluzionale + LSTM in Keras, simile a questo (rif 1), che sto usando per un contest di Kaggle. L'architettura è mostrata di seguito. L'ho addestrato sul mio set etichettato di 11000 campioni (due classi, la prevalenza iniziale è ~ 9: 1, quindi ho ricampionato gli 1 a circa un rapporto 1/1) per 50 epoche con divisione del 20% di convalida. per un po ', ma ho pensato che fosse sotto controllo con livelli di rumore e dropout.
Il modello sembrava allenarsi meravigliosamente, alla fine ha ottenuto il 91% sull'intero set di addestramento, ma dopo i test sul set di dati di test, immondizia assoluta.
Avviso: l'accuratezza della convalida è superiore all'accuratezza dell'allenamento. Questo è l'opposto del sovradimensionamento "tipico".
La mia intuizione è che, data la suddivisione della convalida piccola, il modello sta ancora riuscendo a adattarsi troppo al set di input e perdere la generalizzazione. L'altro indizio è che val_acc è maggiore di acc, che sembra sospetto. È quello lo scenario più probabile qui?
Se si tratta di un overfitting, l'aumento della suddivisione della convalida lo mitigherebbe affatto, o mi imbatterò nello stesso problema, poiché in media, ogni campione vedrà ancora metà delle epoche totali?
Il modello:
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
Ecco la chiamata per adattarsi al modello (il peso della classe è in genere di 1: 1 poiché ho ricampionato l'input):
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 ha una regola sciocca che non posso pubblicare più di 2 link fino a quando il mio punteggio è più alto, quindi ecco l'esempio nel caso in cui tu sia interessato: Rif 1: machinelearningmastery DOT com SLASH sequenza-classificazione-lstm-recurrent-neural-networks- python-keras