MNIST: Tratando de obtener una alta precisión

MNIST: Tratando de obtener una alta precisión

Actualmente estoy trabajando en el problema de reconocimiento de dígitos escritos a mano.

Para empezar, probé dígitos escritos a mano de muestra con el conjunto de datos MNIST.

Obtengo una precisión del 53 % y necesito una precisión superior al 90 %.

Las siguientes son las cosas que he probado hasta ahora para aumentar la precisión.

  1. Creé mi propio conjunto de datos

    • He creado 41.000 ejemplos. Para comenzar, hice un pequeño conjunto de datos, que tiene 10000 ejemplos (1000 para cada dígito).

    • El conjunto de datos se creó en las líneas del formato mnist (probablemente pensé en unir mi conjunto de datos y mi conjunto de datos mnist en la etapa posterior). La precisión del modelo construido sobre esto fue cercana al 65 %.

  2. Enfoque

    • He estado probando mis datos de entrada usando softmax, pero no ayudó mucho en la parte de precisión. Así que comencé a probar la forma cnn.

Entonces mi pregunta es:

  1. ¿Existe otro enfoque/algoritmo que pueda detectar los dígitos con mayor precisión?

  2. ¿Necesito entrenar más al modelo?

  3. ¿Necesito limpiar las imágenes?

  4. Estoy trabajando para combinar el conjunto de datos mnist y mi conjunto de datos (datos de 41 000 dígitos) para ver si aumenta la precisión.

Código

Para probar mis imágenes contra mnist (Ejecute mnist antes de este código)

Puedes encontrar los cuadernos de Ipyhton para:

  1. Probando mis dígitos de muestra contra MNIST ( Script - 1 )

  2. Probando mis dígitos de muestra contra mi conjunto de datos (Script - 2)

Los guiones y las imágenes están disponibles en este enlace

Mostrar la mejor respuesta

He usado modelos de CNN, Ensemble, etc., pero nunca obtuve una puntuación del 65%. Incluso un modelo simple de Random Forest ofrece una precisión del 96 %.

@pissall, usé softmax usando mi conjunto de datos (no los datos de mnist) y obtuve una puntuación del 65%. Estoy trabajando en CNN con mi conjunto de datos, pero la precisión sigue siendo baja.

@shahaf, gracias por compartir el enlace, le echaré un vistazo.

Primero algunas notas:

  • cnn y softmax no se excluyen mutuamente. Puede tener su cnn para los niveles inferiores. Debe tener softmax para la predicción (tiende a funcionar mejor porque solo hay una respuesta).
  • Es difícil decir algo sobre tu entrenamiento. Considere publicar un gráfico de pérdida en el conjunto de datos de entrenamiento y en un conjunto de evaluación. Normalmente deberíamos ver las dos líneas descendiendo y aplanándose hacia. Si no se aplanan, deberías entrenar más tiempo. Si las dos líneas comienzan a divergir, necesita más regularización o detenerse antes.
  • Siempre debe probar varios parámetros (número de capas, número de funciones de activación de neuronas, etc.). Esto se denomina ajuste de hiperparámetros, existen herramientas para ayudarlo y, por lo general, mejoran mucho.
  • También debería probar una red neuronal profunda, además de cnn. He visto buenos resultados con el DNNClassifier enlatado.

Suponiendo que haga todo esto y no vea mejoras, podría implicar que hay un problema con sus datos. Consulte una matriz de confusión para ver dónde está teniendo problemas el modelo. Mira algunos ejemplos que están mal clasificados. Según mi experiencia, he visto 1 y 7 en el conjunto de datos que son casi indistinguibles. Esto no es exactamente una solución, pero debería orientarlo en la dirección correcta sobre lo que necesita corregir.

Puede intentar monocromáticamente la imagen (como en Mnist, cada valor de píxel está entre 0 y 255) y usar una prueba de "es un píxel i> 0". Esto aumentó nuestro algoritmo al 80%. Además, puede intentar dividir la imagen en fotogramas (pruebe con 4 u 8). Además, puede crear pruebas basadas en líneas, curvas, etc.

puede echar un vistazo a mi implementación que me dio hasta un 91 %: https://github.com/orlevy08/Análisis de datos