AI, curso práctico. Configurar el modelo y los hiperparámetros para reconocer las emociones en las imágenes.



En los artículos anteriores de esta serie de tutoriales, se describieron las posibles opciones para preparar datos : preprocesamiento y adición de datos con imágenes ; en estos artículos, también se construyó el modelo Base para reconocer las emociones basadas en imágenes de una red neuronal convolucional.
En este artículo, crearemos un modelo de red neuronal convolucional mejorado para reconocer las emociones en las imágenes utilizando una técnica llamada aprendizaje inductivo .

Primero debe familiarizarse con el artículo sobre el Modelo básico para reconocer emociones en imágenes , y también puede consultarlo mientras lee, ya que algunas secciones, que incluyen el estudio de los datos de origen y la descripción de los indicadores de red, no se detallarán aquí.

Datos


El conjunto de datos contiene 1630 imágenes con emociones de dos clases: Negativo (clase 0) y Positivo (clase 1). Algunos ejemplos de tales imágenes se dan a continuación.

Negativo






Positivo






Algunos de los ejemplos contienen obvias emociones positivas o negativas, mientras que otros pueden no clasificarse, incluso con la participación humana. Sobre la base de una inspección visual de tales casos, estimamos que la máxima precisión posible debería ser de alrededor del 80 por ciento. Tenga en cuenta que un clasificador aleatorio proporciona aproximadamente un 53 por ciento de precisión debido a un pequeño desequilibrio en las clases.

Para entrenar el modelo, utilizamos la técnica de retener parte de las muestras y dividimos el conjunto de datos inicial en dos partes, una de las cuales (20 por ciento del conjunto inicial) la usaremos para la verificación. El particionamiento se realiza mediante estratificación : esto significa que el equilibrio entre las clases se mantiene en los conjuntos de entrenamiento y prueba.

Resolviendo la insuficiencia de datos


El modelo básico mostró resultados, solo ligeramente mejores que las predicciones aleatorias de la clase de imágenes. Puede haber muchas razones posibles para este comportamiento. Creemos que la razón principal es que la cantidad de datos disponibles es decididamente insuficiente para tal entrenamiento de la parte convolucional de la red que permitiría obtener características características basadas en la imagen de entrada.
Hay muchas formas diferentes de resolver el problema de la insuficiencia de datos. Aquí hay algunos de ellos:

  • Vuelve a buscar . La idea del método es evaluar la distribución de datos y seleccionar nuevos ejemplos de esta distribución.
  • Aprendizaje sin profesor . Todos pueden encontrar grandes cantidades de datos de la misma naturaleza que los ejemplos marcados en un conjunto de datos dado. Por ejemplo, pueden ser películas para reconocimiento de video o audiolibros para reconocimiento de voz. El siguiente paso en el camino es usar estos datos para entrenar previamente el modelo (por ejemplo, usando codificadores automáticos).
  • Aumento de datos . Durante este proceso, los datos de muestra se modifican aleatoriamente utilizando un conjunto dado de transformaciones.
  • Aprendizaje inductivo . Este tema es de gran interés para nosotros, así que vamos a familiarizarnos con más detalle.

Aprendizaje inductivo


El término entrenamiento inductivo se refiere a un conjunto de técnicas que utilizan modelos (a menudo muy grandes) entrenados en diferentes conjuntos de datos de aproximadamente la misma naturaleza.





Comparación del aprendizaje automático tradicional y los métodos de aprendizaje inductivo. Imagen tomada de la entrada del blog de S. Ruder "¿Qué es el aprendizaje inductivo?" .
Hay tres escenarios principales para usar el aprendizaje inductivo:

  • Modelos pre-entrenados . Cualquier usuario puede simplemente tomar un modelo entrenado por otra persona y usarlo para sus tareas. Tal escenario es posible si las tareas son muy similares.
  • Bloquear selección de letreros . En este punto, sabemos que la arquitectura del modelo se puede dividir en dos partes principales: la unidad de extracción de características , que es responsable de extraer las características de los datos de entrada, y el módulo de clasificación , que clasifica los ejemplos en función de las características recibidas. Por lo general, el bloque de extracción de características es la parte principal del modelo. La idea del método es tomar un bloque para distinguir las características de un modelo entrenado en otro problema, fijar sus coeficientes de peso (no entrenarlos) y luego construir sobre su base nuevos módulos de clasificación para el problema en consideración. El módulo de clasificación generalmente no es muy profundo y consta de varias capas completamente conectadas, por lo que este modelo es mucho más fácil de entrenar.
  • Afinación precisa y profunda . Este método es como un escenario que utiliza un bloque de extracción de características. Las mismas acciones se realizan con la excepción de "congelar" el bloque de extracción de características. Por ejemplo, puede tomar la red VGG como un bloque de extracción de características y “congelar” solo los primeros tres (de cuatro) bloques convolucionales. En este caso, la unidad de extracción de características puede adaptarse mejor a la tarea actual. Para obtener más información, consulte la publicación del blog de F. Chollet. Cree modelos potentes de clasificación de imágenes utilizando una cantidad muy pequeña de datos .

Se puede encontrar una descripción detallada de los escenarios para usar el aprendizaje inductivo en el curso CS231n de la Universidad de Stanford redes neuronales convolucionales para reconocimiento visual por Fei-Fei Li y entradas de blog por S. Ruder El aprendizaje inductivo es la próxima frontera en el desarrollo aprendizaje automático (temas discutidos de manera más exhaustiva).

Puede tener preguntas: ¿por qué se necesitan todos estos métodos y por qué pueden funcionar? Intentaremos responderlas.

  • Beneficios del uso de grandes conjuntos de datos. Por ejemplo, podemos tomar el bloque de extracción de características de un modelo entrenado en 14 millones de imágenes contenidas en el conjunto de datos del concurso ImageNet . Estos modelos son lo suficientemente complejos como para permitir la extracción de características de muy alta calidad de los datos de entrada.
  • Consideraciones relacionadas con el tiempo. El entrenamiento de modelos grandes puede llevar semanas o incluso meses. En este caso, todos pueden ahorrar una gran cantidad de tiempo y recursos informáticos .
  • Una suposición importante que explica por qué todo esto puede funcionar es la siguiente: los atributos obtenidos del entrenamiento en una tarea pueden ser útiles y adecuados para otra tarea. En otras palabras, las características tienen la propiedad de invariancia con respecto al problema. Tenga en cuenta que el dominio de la nueva tarea debe ser similar al dominio de la tarea original. De lo contrario, la unidad de extracción de características puede incluso empeorar los resultados.

Arquitectura de modelo mejorada


Ahora estamos familiarizados con el concepto de aprendizaje inductivo. También sabemos que ImageNet es un evento importante, en el que se probaron casi todas las arquitecturas modernas de redes neuronales convolucionales avanzadas. Intentemos tomar el bloque de extracción de características de una de estas redes.

Afortunadamente, la biblioteca de Keras nos proporciona varios modelos previamente entrenados (a través de ImageNet) que se crearon dentro de esta plataforma. Importamos y utilizamos uno de estos modelos.



En este caso, utilizaremos una red con arquitectura VGG. Para seleccionar solo la unidad de extracción de características, eliminamos el módulo de clasificación (las tres capas superiores completamente conectadas) de la red al establecer el parámetro include_top en False . También queremos inicializar nuestra red utilizando los pesos de la red capacitada en ImageNet. El parámetro final es el tamaño de la entrada.

Tenga en cuenta que el tamaño de las imágenes originales en el concurso ImageNet es (224, 224, 3), mientras que nuestras imágenes son (400, 500, 3) de tamaño. Sin embargo, utilizamos capas convolucionales, esto significa que los pesos de la red son los pesos de los núcleos en movimiento en la operación de convolución. Junto con la propiedad de separación de parámetros (una discusión de esto se encuentra en nuestro artículo teórico Descripción general de las redes neuronales convolucionales para clasificar imágenes ), esto lleva al hecho de que el tamaño de los datos de entrada puede ser casi arbitrario, ya que la convolución se realiza mediante una ventana deslizante, y esta ventana puede deslizarse Imagen de cualquier tamaño. La única limitación es que el tamaño de los datos de entrada debe ser lo suficientemente grande como para que no se contraiga en un punto (mediciones espaciales) en alguna capa intermedia, porque de lo contrario será imposible realizar más cálculos.

Otro truco que usamos es el almacenamiento en caché . VGG es una red muy grande. Un pase directo para todas las imágenes (1630 ejemplos) a través de la unidad de extracción de funciones tarda aproximadamente 50 segundos. Sin embargo, debe recordarse que los pesos de la unidad de extracción de características son fijos, y un pase directo siempre da el mismo resultado para la misma imagen. Podemos utilizar este hecho para realizar un paso directo a través de la unidad de extracción de características solo una vez y luego almacenar en caché los resultados en una matriz intermedia. Para implementar este escenario, primero creamos una instancia de la clase ImageDataGenerator para cargar archivos directamente desde el disco duro (para obtener más información, consulte el artículo básico Modelo básico para reconocer emociones en imágenes ).



En la siguiente etapa, usamos en modo de predicción el bloque de extracción de características creado previamente como parte del modelo para obtener características de imagen.



Tarda unos 50 segundos. Ahora podemos usar los resultados para un entrenamiento muy rápido de la parte de clasificación superior del modelo: una era dura aproximadamente 1 segundo para nosotros. Imagina ahora que cada era dura 50 segundos más. Por lo tanto, esta sencilla técnica de almacenamiento en caché nos permitió acelerar el proceso de capacitación en red en 50 veces. En este escenario, guardamos todos los signos para todos los ejemplos en RAM, ya que su volumen es suficiente para esto. Al usar un conjunto de datos más grande, puede calcular las propiedades, escribirlas en el disco duro y luego leerlas utilizando el mismo enfoque asociado con la clase de generador.

Finalmente, considere la arquitectura de la parte de clasificación del modelo:





Recuerde que a la salida del bloque de extracción de características de la red neuronal convolucional, se emite un tensor tetradimensional (ejemplos, altura, ancho y canales), y una capa completamente conectada para la clasificación toma un tensor bidimensional (ejemplos, características). Una forma de transformar un tensor tetradimensional con características es simplemente alinearlo alrededor de los últimos tres ejes (utilizamos una técnica similar en el modelo base). En este escenario, usamos un enfoque diferente, llamado submuestreo de valor medio global (GAP). En lugar de alinear los vectores de cuatro dimensiones, tomaremos el valor promedio basado en dos dimensiones espaciales. De hecho, tomamos un mapa de atributos y simplemente promediamos todos los valores en él. El método GAP se introdujo por primera vez en el excelente trabajo de Min Lin Network en la red (vale la pena conocer este libro porque discute algunos conceptos importantes, por ejemplo, convoluciones 1 × 1). Una ventaja obvia del enfoque GAP es una reducción significativa en el número de parámetros. Usando GAP, obtenemos solo 512 características para cada ejemplo, mientras alineamos los datos sin procesar, el número de características será 15 × 12 × 512 = 92 160. Esto puede conducir a una sobrecarga seria, ya que en este caso la parte de clasificación del modelo tendrá aproximadamente 50 millones de parámetros! Otros elementos de la parte de clasificación del modelo, como las capas completamente conectadas y las capas que implementan el método de exclusión, se analizan en detalle en el artículo Modelo básico para reconocer las emociones en las imágenes .

Configuraciones y opciones de entrenamiento


Después de que hayamos preparado la arquitectura de nuestro modelo con Keras, debe configurar todo el modelo para el entrenamiento con el método de compilación.



En este caso, utilizamos configuraciones que son casi similares a las configuraciones del modelo base, con la excepción de la elección del optimizador. Para optimizar el aprendizaje, la entropía cruzada binaria se utilizará como una función de pérdida, y se realizará un seguimiento adicional de una métrica de precisión. Usamos el método Adam como optimizador. Adam es un tipo de algoritmo de descenso de gradiente estocástico con un momento y una velocidad de aprendizaje adaptativa (para más información, vea la entrada del blog de S. Ruder Descripción general de los algoritmos de optimización de descenso de gradiente ).

La velocidad de aprendizaje es un hiperparámetro optimizador que debe configurarse para garantizar que el modelo esté operativo. Recuerde que la fórmula para el descenso de gradiente "vainilla" no contiene funcionalidad adicional:



Θ es el vector de los parámetros del modelo (en nuestro caso, estos son los coeficientes de ponderación de la red neuronal), - es la función objetivo, ∇ es el operador de gradiente (calculado usando el algoritmo de propagación de error de retorno), α es la velocidad de aprendizaje. Por lo tanto, el gradiente de la función objetivo representa la dirección del paso de optimización en el espacio de parámetros, y la velocidad de aprendizaje es su tamaño. Cuando se usa una velocidad de aprendizaje excesivamente alta, existe la posibilidad de un deslizamiento constante del punto óptimo debido al tamaño de paso demasiado grande. Por otro lado, si la velocidad de aprendizaje es demasiado baja, entonces la optimización tomará demasiado tiempo y puede garantizar la convergencia solo a mínimos locales de baja calidad en lugar de un extremo global. Por lo tanto, en cada situación específica, es necesario buscar un compromiso apropiado. Usar la configuración predeterminada para el algoritmo Adam es un buen punto de partida para comenzar.

Sin embargo, en esta tarea, la configuración predeterminada de Adam muestra malos resultados. Necesitamos reducir la tasa de aprendizaje inicial a 0.0001. De lo contrario, la capacitación no podrá garantizar la convergencia.

Finalmente, podemos comenzar a aprender más de 100 eras y luego guardar el modelo en sí y la historia del aprendizaje. El comando % time es un comando mágico Ipython * que le permite medir el tiempo de ejecución del código.



Calificación





Vamos a evaluar la efectividad del modelo durante el entrenamiento. En nuestro caso, la precisión de la verificación es del 73 por ciento (en comparación con el 55 por ciento que usa el modelo base). Este resultado es mucho mejor que el resultado del modelo base.

También veamos la distribución de errores usando la matriz de imprecisiones. Los errores se distribuyen de manera casi uniforme entre las clases con un ligero sesgo hacia ejemplos negativos incorrectamente clasificados (celda superior izquierda de la matriz de imprecisiones). Esto puede explicarse por un pequeño desequilibrio en el conjunto de datos hacia la clase positiva.

Otra métrica que rastreamos es la curva de rendimiento del receptor (curva ROC) y el área bajo esta curva (AUC). Para obtener una descripción detallada de estas métricas, consulte el artículo Modelo básico para reconocer las emociones en las imágenes .



Cuanto más cerca esté la curva ROC del punto superior izquierdo del gráfico y mayor sea el área debajo de ella (métrica AUC), mejor funcionará el clasificador. Esta figura muestra claramente que un modelo mejorado y pre-entrenado muestra mejores resultados en comparación con el modelo base creado desde cero. El valor de AUC para el modelo pre-entrenado es 0.82, que es un buen resultado.



Conclusión


En este artículo, nos encontramos con una técnica poderosa: el aprendizaje inductivo. También construimos un clasificador de red neuronal convolucional utilizando una unidad de extracción de características pre-entrenada basada en la arquitectura VGG. Este clasificador superó en sus características de rendimiento al modelo convolucional básico, entrenado desde cero. El aumento en la precisión fue del 18 por ciento, y el aumento en la métrica de AUC fue de 0.25, lo que demuestra un aumento muy significativo en la calidad del sistema.

Source: https://habr.com/ru/post/es421367/


All Articles