¿Cuándo debemos utilizar la convolución separable?
Estaba leyendo el "Aprendizaje profundo con Python" de François Chollet. Él mencionó la convolución separable de la siguiente manera
Esto equivale a separar el aprendizaje de características espaciales y el aprendizaje de características por canal, lo que tiene mucho sentido si asume que las ubicaciones espaciales en la entrada están altamente correlacionadas, pero los diferentes canales son bastante independientes.
Pero no pude entender lo que quería decir con "ubicaciones espaciales correlacionadas". ¿Pueden algunos explicar lo que quiere decir o el propósito de las circunvoluciones separables? (excepto la parte relacionada con el rendimiento).
Editar: La convolución separable significa que se aplica la primera convolución en profundidad y luego se aplica la convolución puntual.
Respuestas
Contexto de la pregunta
Este es un enlace al texto citado en la pregunta.
Se refiere al uso de SeparableConv2D (tf, nombre de keras). Una pregunta relacionada en StackOverflow es " ¿Cuál es la diferencia entre las capas SeparableConv2D y Conv2D? ". Esta respuesta apunta a este excelente artículo de Chi-Feng Wang:
Una introducción básica a las convoluciones separables
Respuesta a la pregunta
En el procesamiento de imágenes, una convolución separable convierte una convolución NxM en dos convoluciones con núcleos Nx1 y 1xM. Usando esta idea, en NN un SeparableConv2D convierte una convolución WxHxD (ancho x alto x profundidad, donde profundidad significa número de características entrantes) en dos convoluciones con núcleos WxHx1 y 1x1xD.
Tenga en cuenta que el primer kernel no maneja información entre características, por lo tanto, está "aprendiendo características espaciales". El kernel 1x1xD no maneja diferentes puntos, está "aprendiendo características de canal".
Acerca de la frase "las ubicaciones espaciales en la entrada están altamente correlacionadas", mi comprensión de lo que el autor quiere decir es: Supongamos que tenemos una imagen de canal (característica) en la que cada píxel mide la "distancia al fondo". Cuando pasamos de un píxel a otro vecino, se espera cierta continuidad en el valor (excepto en los píxeles de borde): correlación. En cambio, si tenemos un canal que mide el "brillo" y otro que mide la "distancia al fondo", los dos valores para un píxel específico tienen poca correlación.
Finalmente, sobre la pregunta del título "¿Cuándo deberíamos usar convolución separable?" : si la salida final debe depender de algunas características de un píxel y algunas otras características de los píxeles vecinos de una manera muy impredecible, se debe utilizar una convolución completa WxHxD. Sin embargo, si, como es más habitual, puede manejar las primeras dependencias espaciales (vecindario) para extraer características de píxeles y luego manejar estas características píxel a píxel para obtener la salida, mejor use un WxHx1 seguido de 1x1xD, ahorrando muchos parámetros de red, ahorrando así tiempo de formación.