Estoy jugando un poco con convnets. Específicamente, estoy usando el conjunto de datos kaggle cats-vs-dogs que consta de 25000 imágenes etiquetadas como gato o perro (12500 cada una).
Me las arreglé para lograr una precisión de clasificación de alrededor del 85% en mi conjunto de pruebas, sin embargo, establecí el objetivo de lograr una precisión del 90%.
Mi principal problema es el sobreajuste. De alguna manera, siempre termina sucediendo (normalmente después de la época 8-10). La arquitectura de mi red está ligeramente inspirada en VGG-16, más específicamente, mis imágenes cambian de tamaño a , y luego ejecuto:
Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool 1 64x64x32 (kernel size is 2, strides is 2)
Convolution 3 64x64x64 (kernel size is 3, strides is 1)
Convolution 4 64x64x64 (kernel size is 3, strides is 1)
Max pool 2 32x32x64 (kernel size is 2, strides is 2)
Convolution 5 16x16x128 (kernel size is 3, strides is 1)
Convolution 6 16x16x128 (kernel size is 3, strides is 1)
Max pool 3 8x8x128 (kernel size is 2, strides is 2)
Convolution 7 8x8x256 (kernel size is 3, strides is 1)
Max pool 4 4x4x256 (kernel size is 2, strides is 2)
Convolution 8 4x4x512 (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)
Todas las capas, excepto la última, tienen relus como funciones de activación.
Tenga en cuenta que he probado diferentes combinaciones de convoluciones (comencé con convoluciones más simples).
Además, he aumentado el conjunto de datos al reflejar las imágenes, de modo que en total tengo 50000 imágenes.
Además, estoy normalizando las imágenes usando la normalización mínima máxima, donde X es la imagen
El código está escrito en tensorflow y los tamaños de lote son 128.
Los mini lotes de datos de entrenamiento terminan sobreajustados y tienen una precisión del 100%, mientras que los datos de validación parecen dejar de aprender en torno al 84-85%.
También he tratado de aumentar / disminuir la tasa de abandono escolar.
El optimizador utilizado es AdamOptimizer con una tasa de aprendizaje de 0.0001
En este momento he estado jugando con este problema durante las últimas 3 semanas y el 85% parece haber establecido una barrera frente a mí.
Para el registro, sé que podría usar el aprendizaje de transferencia para lograr resultados mucho más altos, pero estoy interesado en construir esta red como una experiencia de autoaprendizaje.
Actualizar:
Estoy ejecutando la MISMA red con un tamaño de lote diferente, en este caso estoy usando un tamaño de lote mucho más pequeño (16 en lugar de 128) hasta ahora estoy logrando una precisión del 87.5% (en lugar del 85%). Dicho esto, la red termina sobreajustando de todos modos. Aún así, no entiendo cómo un abandono del 50% de las unidades no está ayudando ... obviamente estoy haciendo algo mal aquí. ¿Algunas ideas?
Actualización 2:
Parece que el problema tenía que ver con el tamaño del lote, ya que con un tamaño más pequeño (16 en lugar de 128) ahora estoy logrando una precisión del 92.8% en mi conjunto de prueba, con el tamaño de lote más pequeño que la red aún se adapta (los mini lotes terminan sin embargo, con una precisión del 100%), la pérdida (error) sigue disminuyendo y, en general, es más estable. Las desventajas son un tiempo de ejecución MUCHO más lento, pero vale la pena la espera.