Tengo un modelo convolucional + LSTM en Keras, similar a este (ref. 1), que estoy usando para un concurso de Kaggle. La arquitectura se muestra a continuación. Lo he entrenado en mi conjunto etiquetado de 11000 muestras (dos clases, la prevalencia inicial es ~ 9: 1, así que tomé muestras de 1 a aproximadamente una proporción de 1/1) durante 50 épocas con una división de validación del 20%. por un tiempo, pero pensé que lo tenía bajo control con ruido y capas de deserción.
El modelo parecía que estaba entrenando maravillosamente, al final obtuvo un 91% en la totalidad del conjunto de entrenamiento, pero al probar en el conjunto de datos de prueba, basura absoluta.
Aviso: la precisión de la validación es mayor que la precisión del entrenamiento. Esto es lo opuesto al sobreajuste "típico".
Mi intuición es que, dada la división de validación pequeña, el modelo todavía se las arregla para ajustarse demasiado al conjunto de entrada y pierde la generalización. La otra pista es que val_acc es mayor que acc, eso parece sospechoso. ¿Es ese el escenario más probable aquí?
Si esto es un ajuste excesivo, ¿el aumento de la división de validación mitigaría esto en absoluto, o me voy a encontrar con el mismo problema, ya que, en promedio, cada muestra todavía verá la mitad de las épocas totales?
El modelo:
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
Aquí está la llamada para ajustarse al modelo (el peso de la clase es típicamente alrededor de 1: 1 desde que tomé muestras de la entrada):
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 tiene una regla tonta de que no puedo publicar más de 2 enlaces hasta que mi puntaje sea más alto, así que aquí está el ejemplo en caso de que esté interesado: Ref 1: machinelearningmastery DOT com SLASH secuencia-clasificación-lstm-recurrente-neural-networks- pitón-keras