Entiendo que la capa convolucional de una red neuronal convolucional tiene cuatro dimensiones: input_channels, filter_height, filter_width, number_of_filters. Además, entiendo que cada filtro nuevo se enreda en TODOS los canales de entrada (o mapas de características / activación de la capa anterior).
SIN EMBARGO, el siguiente gráfico de CS231 muestra cada filtro (en rojo) que se aplica a un CANAL ÚNICO, en lugar del mismo filtro que se utiliza en todos los canales. Esto parece indicar que hay un filtro separado para CADA canal (en este caso, supongo que son los tres canales de color de una imagen de entrada, pero lo mismo se aplicaría para todos los canales de entrada).
Esto es confuso: ¿hay un filtro único diferente para cada canal de entrada?
Fuente: http://cs231n.github.io/convolutional-networks/
La imagen de arriba parece contradictoria con un extracto de los "Fundamentos del aprendizaje profundo" de O'reilly :
"... los filtros no solo funcionan en un único mapa de entidades. Funcionan en todo el volumen de mapas de entidades que se han generado en una capa particular ... Como resultado, los mapas de entidades deben poder operar sobre volúmenes, no solo áreas "
... También, entiendo que estas imágenes a continuación indican que EL MISMO filtro está enredado en los tres canales de entrada (contradictorio con lo que se muestra en el gráfico CS231 anterior):
Respuestas:
El primero De hecho, hay un núcleo separado definido para cada combinación de canal de entrada / canal de salida.
Típicamente para una arquitectura CNN, en un solo filtro como se describe en su
number_of_filters
parámetro, hay un núcleo 2D por canal de entrada. Hayinput_channels * number_of_filters
conjuntos de pesos, cada uno de los cuales describe un núcleo de convolución. Por lo tanto, los diagramas que muestran un conjunto de pesos por canal de entrada para cada filtro son correctos. El primer diagrama también muestra claramente que los resultados de la aplicación de esos núcleos se combinan al sumarlos y agregar sesgos para cada canal de salida.Esto también puede verse como el uso de una convolución 3D para cada canal de salida, que tiene la misma profundidad que la entrada. Que es lo que muestra su segundo diagrama, y también lo que muchas bibliotecas harán internamente. Matemáticamente, este es el mismo resultado (siempre que las profundidades coincidan exactamente), aunque el tipo de capa generalmente se etiqueta como "Conv2D" o similar. Del mismo modo, si su tipo de entrada es inherentemente 3D, como voxels o un video, entonces podría usar una capa "Conv3D", pero internamente podría implementarse como una convolución 4D.
fuente
input_channels
versiones con diferentes pesos . ¿Tiene una fuente "oficial" que confirme este entendimiento?La siguiente imagen que usó en su pregunta describe con mucha precisión lo que está sucediendo. Recuerde que cada elemento del filtro 3D (cubo gris) está formado por un valor (
3x3x3=27
valores) diferente. Por lo tanto, se pueden concatenar tres filtros 2D de tamaño diferentes3x3
para formar este filtro de tamaño 3D3x3x3
.El
3x3x3
fragmento RGB de la imagen se multiplica por elementos por un filtro 3D (se muestra en gris). En este caso, el filtro tiene3x3x3=27
pesos. Cuando estos pesos se multiplican por elementos y luego se suman, se obtiene un valor.Entonces, ¿hay un filtro separado para cada canal de entrada?
SÍ , hay tantos filtros 2D como número de canales de entrada en la imagen. Sin embargo , es útil si cree que para las matrices de entrada con más de un canal, solo hay un filtro 3D (como se muestra en la imagen de arriba).
Entonces, ¿por qué esto se llama convolución 2D (si el filtro es 3D y la matriz de entrada es 3D)?
Esta es una convolución 2D porque las zancadas del filtro son solo a lo largo de las dimensiones de altura y anchura ( NO profundidad) y, por lo tanto, la salida producida por esta convolución también es una matriz 2D. El número de direcciones de movimiento del filtro determina las dimensiones de la convolución.
Nota: Si desarrolla su comprensión visualizando un solo filtro 3D en lugar de múltiples filtros 2D (uno para cada capa), tendrá un tiempo fácil para comprender arquitecturas avanzadas de CNN como Resnet, InceptionV3, etc.
fuente
input_channels
versiones con diferentes pesos. Si esto también lo comprende, ¿hay una fuente "oficial" que lo confirme?Estoy siguiendo las respuestas anteriores con un ejemplo concreto con la esperanza de aclarar aún más cómo funciona la convolución con respecto a los canales de entrada y salida y los pesos, respectivamente:
Deje que el ejemplo sea el siguiente (wrt a 1 capa convolucional):
input_channels=5
output_channels=56
Notamos eso:
Esa capa convolucional contiene así:
56 filtros tridimensionales de tamaño 4x4x5 (= 80 pesos diferentes cada uno) para dar cuenta de los 56 canales de salida donde cada uno tiene un valor para la 3ª dimensión de 5 para que coincida con los 5 canales de entrada. En total hay
number_of_filters=input_channel*output_channels=5*56=280
Filtros 2D de tamaño 4x4 (es decir, 280x16 pesos diferentes en total).
fuente
Solo hay restricciones en 2D. ¿Por qué?
Imagina una capa completamente conectada.
Sería terriblemente enorme, cada neurona se conectaría a quizás neuronas de entrada de 1000x1000x3. Pero sabemos que el procesamiento de píxeles cercanos tiene sentido, por lo tanto, nos limitamos a un pequeño vecindario 2D, por lo que cada neurona está conectada a solo 3x3 cerca de las neuronas en 2D. No sabemos tal cosa sobre los canales, por lo que nos conectamos a todos los canales.
Aún así, habría demasiados pesos. Pero debido a la invariancia de la traducción, un filtro que funcione bien en un área probablemente sea útil en un área diferente. Entonces usamos el mismo conjunto de pesos en 2D. Una vez más, no existe tal invariancia de traducción entre canales, por lo que no existe tal restricción allí.
fuente
Consulte la sección "Conectividad local" en http://cs231n.github.io/convolutional-networks/ y diapositiva 7-18.
El hiperparámetro de "campo receptivo" del filtro se define solo por la altura y el ancho, ya que la profundidad se fija por la profundidad de la capa anterior.
TENGA EN CUENTA que "La extensión de la conectividad a lo largo del eje de profundidad es siempre igual a la PROFUNDIDAD del volumen de entrada" -o- PROFUNDIDAD del mapa de activación (en el caso de capas posteriores).
Intuitivamente, esto debe ser debido al hecho de que los datos de los canales de imagen están intercalados, no planos. De esta forma, la aplicación del filtro se puede lograr simplemente mediante la multiplicación de vectores de columna.
Tenga en cuenta que Convolutional Network aprende todos los parámetros de filtro (incluida la dimensión de profundidad) y son "h w input_layer_depth + 1 (sesgo)".
fuente
Recomiendo el capítulo 2.2.1 de mi tesis de maestría como respuesta. Para agregar a las respuestas restantes:
Keras es tu amigo para entender lo que sucede:
da
Intenta formular tus opciones. ¿Qué significaría eso para los parámetros si otra cosa fuera el caso?
Este enfoque también lo ayuda con otros tipos de capas, no solo capas convolucionales.
Tenga en cuenta también que puede implementar diferentes soluciones, que pueden tener otros números de parámetros.
fuente
Solo para dejar dos detalles absolutamente claros:
La forma más fácil de convencerse de esto es imaginar lo que sucede en otros escenarios y ver que la computación se degenera, es decir, si no intercala y recombina los resultados, entonces las diferentes salidas en realidad no harían nada. Tendría el mismo efecto que una salida única con pesos combinados.
fuente
Para cualquiera que intente comprender cómo se calculan las convoluciones, aquí hay un fragmento de código útil en Pytorch:
Ejecutar esto da el siguiente resultado:
Observe cómo cada canal de la convolución suma sobre todas las salidas de canales anteriores.
fuente