Función de pérdida para segmentación semántica

9

Se disculpa por el mal uso de los términos técnicos. Estoy trabajando en un proyecto de segmentación semántica a través de redes neuronales convolucionales (CNN); tratando de implementar una arquitectura de tipo Encoder-Decoder, por lo tanto, la salida es del mismo tamaño que la entrada.

¿Cómo diseñas las etiquetas? ¿Qué función de pérdida se debe aplicar? Especialmente en la situación de gran desequilibrio de clases (pero la relación entre las clases es variable de una imagen a otra).

El problema trata con dos clases (objetos de interés y antecedentes). Estoy usando Keras con el backend tensorflow.

Hasta ahora, voy a diseñar los resultados esperados para que tengan las mismas dimensiones que las imágenes de entrada, aplicando un etiquetado en píxeles. La capa final del modelo tiene activación softmax (para 2 clases) o activación sigmoidea (para expresar la probabilidad de que los píxeles pertenezcan a la clase de objetos). Tengo problemas para diseñar una función objetivo adecuada para tal tarea, de tipo:

function(y_pred,y_true),

de acuerdo con Keras .

Por favor, trate de ser específico con las dimensiones de los tensores involucrados (entrada / salida del modelo). Cualquier idea y sugerencia es muy apreciada. Gracias !

Florin Lucaciu
fuente
Tiene una lectura de esta arxiv.org/pdf/1511.00561.pdf "Utilizamos la pérdida de entropía cruzada como la función objetivo para el entrenamiento de la red."
Miss Palmer

Respuestas:

5

La entropía cruzada es definitivamente el camino a seguir. No conozco a Keras, pero TF tiene esto: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Aquí hay un documento que implementa esto directamente: Redes totalmente convolucionales para la segmentación semántica por Shelhamer et al.

El documento de U-Net también es una implementación muy exitosa de la idea, utilizando conexiones de omisión para evitar la pérdida de resolución espacial. Puede encontrar muchas implementaciones de esto en la red.

Desde mi experiencia personal, es posible que primero desee comenzar con una red simple de codificador-decodificador, pero no use zancadas (o zancadas = 1), de lo contrario, perderá mucha resolución porque el muestreo ascendente no es perfecto. Ir con pequeños tamaños de grano. No conozco su aplicación específica, pero incluso una red de 2-3 capas ocultas dará muy buenos resultados. Use 32-64 canales en cada capa. Comience simple, 2 capas ocultas, 32 canales cada una, 3x3 núcleos, zancada = 1 y experimente con parámetros de forma aislada para ver su efecto. Mantenga las dimensiones siempre iguales a la dimensión de entrada para empezar para evitar la pérdida de resolución. Luego, puede cambiar los pasos y el muestreo ascendente e implementar ideas como U-Net. U-Net funciona extremadamente bien para la segmentación de imágenes médicas.

αβ


fuente
No soy un experto en este dominio, pero ¿no deberían las clases ser exclusivas en esta configuración? Si es así, ¿no sería la pérdida de softmax la mejor opción? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson
1
@HaraldThomson, la segmentación es un problema binario. Muchas personas usan softmax para problemas binarios, pero es completamente innecesario y excesivo. En lugar de tener dos nodos de salida, tenga un nodo de salida que represente P (y = 1), luego use entropía cruzada.
Ricardo Cruz
2

Utilice la pérdida de dados ponderada y la pérdida de entropía cruzada ponderada. La pérdida de dados es muy buena para la segmentación. Los pesos con los que puede comenzar deben ser las frecuencias de clase invertidas, es decir, tomar una muestra de digamos 50-100, encontrar el número medio de píxeles que pertenecen a cada clase y hacer que esas clases pesen 1 / media. Puede que tenga que implementar dados usted mismo, pero es simple. Además, puede ver la pérdida inversa de dados y la pérdida focal

Rahul Deora
fuente
-1

Permítanme ser más específico al principio, y luego más general. Pido disculpas si te entiendo mal.

Creo que está hablando de necesitar una red neuronal de codificador automático porque mencionó codificar y decodificar, y mencionó el tamaño de entrada igual que el tamaño de salida. Si es así, entonces su función de pérdida se basa en reproducir el vector de entrada, pero también comprime los datos en un vector más corto en la capa oculta del medio. Las opciones serían lograr el mínimo error cuadrático medio (para la regresión) o el logloss o el índice de clasificación errónea (para la clasificación). Sin embargo, las CNN no son algo que he visto usar en un codificador automático, pero creo que sería posible y útil hacerlo en casos en los que la invariancia traslacional es importante, como la detección de bordes y objetos en las imágenes.

En términos más generales, parece que está creando un modelo de aprendizaje automático muy complejo desde que mencionó las CNN. Las CNN y otros modelos de aprendizaje profundo son algunos de los modelos de aprendizaje automático más complejos que existen.

Sin embargo, elegir dimensiones, etiquetas y funciones de pérdida es más parecido al aprendizaje automático elemental. Creo que podrías estar muy loco con el aprendizaje profundo. ¿Primero tomaste una clase de aprendizaje automático simple?

Geoffrey Anderson
fuente
¿Es esto incluso necesario? Por ejemplo, vea el método Pixon .
Carl
es un enfoque válido: arxiv.org/pdf/1511.00561.pdf
Miss Palmer
"Las CNN y otros modelos de aprendizaje profundo son algunos de los modelos de aprendizaje automático más complejos que existen". Tiendo a estar en desacuerdo. El modelo en sí mismo puede ser complejo, pero en realidad es increíblemente simple de usar con muy poca comprensión teórica. Esa es la razón de todo el bombo sobre DL, poca teoría, fácil de modelos de escritura y de muy alta precisión ...