CNN arquitecturas para la regresión?

32

He estado trabajando en un problema de regresión donde la entrada es una imagen, y la etiqueta es un valor continuo entre 80 y 350. Las imágenes son de algunos químicos después de que ocurre una reacción. El color que resulta indica la concentración de otro químico que queda, y eso es lo que el modelo debe generar: la concentración de ese químico. Las imágenes se pueden rotar, voltear, reflejar y la salida esperada debería ser la misma. Este tipo de análisis se realiza en laboratorios reales (máquinas muy especializadas generan la concentración de los químicos usando análisis de color, tal como estoy entrenando este modelo).

Hasta ahora solo he experimentado con modelos basados ​​aproximadamente en VGG (múltiples secuencias de bloques conv-conv-conv-pool). Antes de experimentar con arquitecturas más recientes (Inception, ResNets, etc.), pensé en investigar si hay otras arquitecturas más comúnmente utilizadas para la regresión utilizando imágenes.

El conjunto de datos se ve así:

ingrese la descripción de la imagen aquí

El conjunto de datos contiene alrededor de 5,000 muestras de 250x250, que cambié de tamaño a 64x64 para que la capacitación sea más fácil. Una vez que encuentre una arquitectura prometedora, experimentaré con imágenes de mayor resolución.

Hasta ahora, mis mejores modelos tienen un error cuadrático medio en los conjuntos de entrenamiento y validación de aproximadamente 0.3, lo que está lejos de ser aceptable en mi caso de uso.

Mi mejor modelo hasta ahora se ve así:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Pregunta

¿Cuál es una arquitectura apropiada para la salida de regresión de una entrada de imagen?

Editar

He reformulado mi explicación y eliminado las menciones de precisión.

Editar 2

He reestructurado mi pregunta, así que espero que quede claro lo que busco

rodrigo-silveira
fuente
44
La precisión no es una medida que se pueda aplicar directamente a los problemas de regresión. ¿Qué quieres decir cuando dices que tu precisión es del 30%? La precisión realmente solo se aplica a las tareas de clasificación, no a la regresión.
Nuclear Wang
1
¿Qué quiere decir con "predice correctamente el 30% del tiempo" ? ¿Realmente estás haciendo regresión?
Firebug
1
¿Por qué llamas a este problema regresión? ¿No estás tratando de clasificar en etiquetas? son las etiquetas cardinales?
Aksakal
2
No quiero exactamente lo mismo que vgg. Estoy haciendo algo parecido a vgg, lo que significa una serie de convs seguidos de una agrupación máxima, seguidos de una conexión total. Parece un enfoque genérico para trabajar con imágenes. Pero, de nuevo, ese es el punto central de mi pregunta original. Parece que todos estos comentarios, aunque son perspicaces para mí, pierden completamente el punto de lo que estoy preguntando en primer lugar.
rodrigo-silveira
1
Además, podríamos brindarle una mejor ayuda si brinda una mejor descripción del problema. 1) ¿Cuáles son las imágenes? ¿Cuál es su resolución? ¿Qué relación hay entre las imágenes y su respuesta, ? Es esta relación la rotación invariante, es decir, si puedo rotar la imagen circular por un ángulo arbitrario , lo que espero al cambio? 2) ¿Sabe que 5000 imágenes para entrenar una arquitectura VGG-net son una miseria? ¿Has calculado el número de parámetros de tu arquitectura? ¿Hay alguna forma de obtener más imágenes? Si no puede, entonces tal vez necesite ...y[80,350]θy
DeltaIV

Respuestas:

42

En primer lugar, una sugerencia general: haga una búsqueda de literatura antes de comenzar a hacer experimentos sobre un tema con el que no está familiarizado. Te ahorrarás mucho tiempo.

En este caso, al observar los documentos existentes puede haber notado que

  1. Las CNN se han usado varias veces para la regresión: este es un clásico pero es antiguo (sí, 3 años es en DL). Un periódico más moderno no habría utilizado AlexNet para esta tarea. Esto es más reciente, pero es para un problema mucho más complicado (rotación 3D), y de todos modos no estoy familiarizado con él.
  2. La regresión con CNN no es un problema trivial. Si observa nuevamente el primer artículo, verá que tienen un problema en el que básicamente pueden generar datos infinitos. Su objetivo es predecir el ángulo de rotación necesario para rectificar imágenes 2D. Esto significa que básicamente puedo tomar mi conjunto de entrenamiento y aumentarlo girando cada imagen en ángulos arbitrarios, y obtendré un conjunto de entrenamiento válido y más grande. Por lo tanto, el problema parece relativamente simple, en lo que respecta a los problemas de Deep Learning. Por cierto, tenga en cuenta los otros trucos de aumento de datos que usan:

    Utilizamos traducciones (hasta el 5% del ancho de la imagen), ajuste de brillo en el rango [−0.2, 0.2], ajuste de gamma con γ ∈ [−0.5, 0.1] y ruido de píxeles gaussianos con una desviación estándar en el rango [0 , 0,02].

    No conozco su problema lo suficientemente bien como para decir si tiene sentido considerar variaciones de posición, brillo y ruido gamma para sus imágenes, cuidadosamente tomadas en un laboratorio. Pero siempre puede intentar eliminarlo si no mejora la pérdida de su conjunto de prueba. En realidad, realmente debería utilizar un conjunto de validación o veces la validación cruzada para este tipo de experimentos, y no se fijan en el equipo de prueba hasta que haya definido su configuración, si desea que la pérdida de equipo de prueba sea representativa de la error de generalizaciónk

    De todos modos, incluso en sus condiciones ideales, el enfoque ingenuo no funcionó tan bien (sección 4.2 ). Quitaron la capa de salida (la capa softmax) y la sustituyeron con una capa con dos unidades que predecirían el seno coseno del ángulo de rotación. El ángulo real se calcularía como . La red neuronal también se entrenó previamente en ImageNet (esto se denomina aprendizaje de transferenciayxα=atan2(y,x)) Por supuesto, el entrenamiento en ImageNet había sido para una tarea diferente (clasificación), pero aún así, entrenar la red neuronal desde cero debe haber dado resultados tan horribles que decidieron no publicarlos. Así que tenía todos los ingredientes para hacer una buena tortilla: datos de entrenamiento potencialmente infinitos, una red preentrenada y un problema de regresión aparentemente simple (pronostique dos números entre -1 y 1). Sin embargo, lo mejor que pudieron obtener con este enfoque fue un error de 21 °. No está claro si se trata de un error RMSE, un error MAD o qué, pero aún así no es genial: dado que el error máximo que puede cometer es 180 °, el error promedio es del error máximo posible. Lo hicieron un poco mejor al usar dos redes en serie: la primera realizaría la clasificación (predecir si el ángulo estaría en el>11%[180°,90°],[90°,0°],[0°,90°] o clase)), luego la imagen, rota por la cantidad predicha por la primera red , se alimentaría a otra red neuronal (para la regresión, esta vez), que predeciría la rotación adicional final en el rango .[90°,180°][45°,45°]

    En un problema mucho más simple (MNIST girado), puede obtener algo mejor , pero aún así no va por debajo de un error RMSE que es del error máximo posible.2.6%

¿Entonces, qué podemos aprender de esto? En primer lugar, esas 5000 imágenes son un pequeño conjunto de datos para su tarea. El primer artículo usó una red que se entrenó previamente en imágenes similares a aquellas para las que querían aprender la tarea de regresión: no solo necesita aprender una tarea diferente de aquella para la que se diseñó la arquitectura (clasificación), sino que su conjunto de entrenamiento no No se parece en nada a los conjuntos de entrenamiento en los que generalmente se entrenan estas redes (CIFAR-10/100 o ImageNet). Por lo tanto, probablemente no obtendrá ningún beneficio del aprendizaje de transferencia. El ejemplo de MATLAB tenía 5000 imágenes, pero eran en blanco y negro y semánticamente todas muy similares (bueno, este podría ser su caso también).

Entonces, ¿qué tan realista es mejor que 0.3? Antes que nada, debemos entender qué quiere decir con una pérdida promedio de 0.3. ¿Quiere decir que el error RMSE es 0.3,

1Ni=1N(h(xi)yi)2

donde es el tamaño de su conjunto de entrenamiento (por lo tanto, ), es la salida de su CNN para la imagen e es la concentración correspondiente de la sustancia química? Dado que , suponiendo que las predicciones de su CNN entre 80 y 350 (o simplemente usa un logit para que encajen en ese intervalo), obtiene menos de error. En serio, ¿qué esperas? No me parece un gran error en absoluto.NN<5000h(xi)xiyiyi[80,350]0.12%

Además, solo trate de calcular el número de parámetros en su red: tengo prisa y puedo estar cometiendo errores tontos, así que, por supuesto, verifique mis cálculos con alguna summaryfunción de cualquier marco que esté usando. Sin embargo, más o menos diría que tienes

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(tenga en cuenta que omití los parámetros de las capas de normas por lotes, pero son solo 4 parámetros para la capa, por lo que no hacen la diferencia). Tienes medio millón de parámetros y 5000 ejemplos ... ¿qué esperarías? Claro, el número de parámetros no es un buen indicador de la capacidad de una red neuronal (es un modelo no identificable), pero aún así ... No creo que pueda hacerlo mucho mejor que esto, pero puede probar un pocas cosas:

  • normalizar todas las entradas (por ejemplo, reescalar las intensidades RGB de cada píxel entre -1 y 1, o usar la estandarización) y todas las salidas. Esto será especialmente útil si tiene problemas de convergencia.
  • ir a escala de grises: esto reduciría sus canales de entrada de 3 a 1. Todas mis imágenes parecen (para mi ojo altamente inexperto) ser de colores relativamente similares. ¿Estás seguro de que es el color que se necesita para predecir , y no la existencia de áreas más oscuras o más brillantes? Quizás esté seguro (no soy un experto): en este caso, omita esta sugerencia.y
  • El aumento de datos: ya que dijo que mover de un tirón, que gira en un ángulo arbitrario o reflejo de sus imágenes deben dar lugar a la misma salida, se puede aumentar el tamaño de su conjunto de datos mucho . Tenga en cuenta que con un conjunto de datos mayor, el error en el conjunto de entrenamiento aumentará: lo que estamos buscando aquí es una brecha menor entre la pérdida del conjunto de entrenamiento y la pérdida del conjunto de prueba. Además, si la pérdida del conjunto de entrenamiento aumenta mucho, esto podría ser una buena noticia: puede significar que puede entrenar una red más profunda en este conjunto de entrenamiento más grande sin el riesgo de sobreajuste. Intente agregar más capas y vea si ahora obtiene un conjunto de entrenamiento más pequeño y una pérdida del conjunto de prueba. Finalmente, puede probar también los otros trucos de aumento de datos que cité anteriormente, si tienen sentido en el contexto de su aplicación.
  • use el truco de clasificación y regresión: una primera red solo determina si debe estar en uno de, por ejemplo, 10 bins, como , etc. Una segunda red luego calcula una corrección : centrar y normalizar también puede ayudar aquí. No puedo decir sin intentarlo.y[80,97],[97,124][0,27]
  • intente usar una arquitectura moderna (Inception o ResNet) en lugar de una arquitectura antigua. ResNet tiene en realidad menos parámetros que VGG-net. Por supuesto, desea utilizar las ResNets pequeñas aquí; no creo que ResNet-101 pueda ayudar en un conjunto de datos de 5000 imágenes. Sin embargo, puede aumentar mucho el conjunto de datos ...
  • Dado que su salida es invariante a la rotación, otra gran idea sería usar CNN equivalentes de grupo , cuya salida (cuando se usa como clasificadores) es invariante para rotaciones discretas , o CNN dirigiblescuya salida es invariante a rotaciones continuas. La propiedad de invariancia le permitiría obtener buenos resultados con mucho menos aumento de datos, o idealmente ninguno en absoluto (por lo que respecta a las rotaciones: por supuesto, todavía necesita los otros tipos de da). Las CNN equivalentes de grupo son más maduras que las CNN orientables desde el punto de vista de la implementación, por lo que primero probaría las CNN de grupo. Puede probar la clasificación y luego la regresión, utilizando el G-CNN para la parte de clasificación, o puede experimentar con el enfoque de regresión pura. Recuerde cambiar la capa superior en consecuencia.
  • experimentar con el tamaño del lote (sí, sí, sé que el pirateo de hiperparámetros no es bueno, pero esto es lo mejor que pude encontrar en un período de tiempo limitado y gratis :-)
  • Finalmente, hay arquitecturas que se han desarrollado especialmente para hacer predicciones precisas con pequeños conjuntos de datos. La mayoría de ellos usaban convoluciones dilatadas : un ejemplo famoso es la red neuronal convolucional densa de escala mixta . Sin embargo, la implementación no es trivial.
DeltaIV
fuente
3
Gracias por la respuesta detallada. Ya había estado haciendo un aumento significativo de datos. Intenté un par de variantes del modelo de inicio (donde una variación significa que el número de filtros se escala por igual en todo el modelo). Vio mejoras increíbles. Todavía tengo mucho camino por recorrer. Probaré algunas de tus sugerencias. Gracias de nuevo.
rodrigo-silveira
@ rodrigo-silveira de nada, hágame saber cómo va. Tal vez podamos hablar en el chat una vez que tenga resultados.
DeltaIV
1
Gran respuesta, merece más ^
Gilly
1
Muy bien compuesto!
Karthik Thiagarajan
1
Te daría 10k puntos por esto si pudiera. Increíble respuesta
Boppity Bop