J'ai un modèle convolutionnel + LSTM à Keras, similaire à celui-ci (réf 1), que j'utilise pour un concours Kaggle. L'architecture est illustrée ci-dessous. Je l'ai formé sur mon ensemble étiqueté de 11000 échantillons (deux classes, la prévalence initiale est ~ 9: 1, j'ai donc suréchantillonné les 1 à environ un rapport 1/1) pour 50 époques avec une répartition de validation de 20%. pendant un certain temps, mais je pensais qu'il était sous contrôle avec des couches de bruit et d'abandon.
Le modèle avait l'air de s'entraîner à merveille, à la fin, il a obtenu 91% sur l'ensemble de l'ensemble de formation, mais lors des tests sur l'ensemble de données de test, des déchets absolus.
Remarque: la précision de validation est supérieure à la précision de la formation. C'est l'opposé du sur-ajustement "typique".
Mon intuition est que, compte tenu de la petite validation de validation, le modèle parvient toujours à s'adapter trop fortement à l'ensemble d'entrée et perd la généralisation. L'autre indice est que val_acc est supérieur à acc, cela semble louche. Est-ce le scénario le plus probable ici?
Si cela est trop adapté, l'augmentation du fractionnement de validation atténuerait-elle cela, ou vais-je rencontrer le même problème, car en moyenne, chaque échantillon verra toujours la moitié du total des époques?
Le modèle:
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
Voici l'appel à adapter le modèle (le poids de la classe est généralement autour de 1: 1 depuis que j'ai suréchantillonné l'entrée):
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 a une règle stupide selon laquelle je ne peux pas poster plus de 2 liens jusqu'à ce que mon score soit plus élevé, voici donc l'exemple au cas où vous seriez intéressé: Ref 1: machinelearningmastery DOT com SLASH séquence-classification-lstm-recurrent-neural-networks- python-keras