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