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í:
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
fuente
Respuestas:
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
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:
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 transferenciay x α=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,
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.N N<5000 h(xi) xi yi yi∈[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
summary
función de cualquier marco que esté usando. Sin embargo, más o menos diría que tienes(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:
fuente