En una red neuronal convolucional (CNN), cuando se convoluciona la imagen, ¿se utiliza la operación el producto punto o la suma de la multiplicación por elementos?

12

El siguiente ejemplo está tomado de las conferencias en deeplearning.ai muestra que el resultado es la suma del producto elemento por elemento (o "multiplicación por elementos". Los números rojos representan los pesos en el filtro:

(11)+(10 0)+(11)+(0 00 0)+(11)+(10 0)+(0 01)+(0 00 0)+(11)=1+0 0+1+0 0+1+0 0+0 0+0 0+1=4 4

ingrese la descripción de la imagen aquí

SIN EMBARGO, la mayoría de los recursos dicen que se utiliza el producto punto :

"... podemos reexpresar la salida de la neurona como, donde está el término de sesgo. En otras palabras, podemos calcular la salida por y = f (x * w) donde b es el término de sesgo. En otras palabras, nosotros puede calcular la salida realizando el producto punto de los vectores de entrada y ponderación, agregando el término de sesgo para producir el logit y luego aplicando la función de transformación ".

Buduma, Nikhil; Locascio, Nicholas. Fundamentos del aprendizaje profundo: diseño de algoritmos de inteligencia de máquina de próxima generación (p. 8). O'Reilly Media. Versión Kindle.

"Tomamos el filtro 5 * 5 * 3 y lo deslizamos sobre la imagen completa y en el camino tomamos el producto de punto entre el filtro y los fragmentos de la imagen de entrada. Para cada producto de punto tomado, el resultado es un escalar".

https://medium.com/technologymadeeasy/the-best-explanation-of-convolutional-neural-networks-on-the-internet-fbb8b1ad5df8

"Cada neurona recibe algunas entradas, realiza un producto de puntos y, opcionalmente, lo sigue con una no linealidad".

http://cs231n.github.io/convolutional-networks/

"El resultado de una convolución es ahora equivalente a realizar una matriz grande multiplicar np.dot (W_row, X_col), que evalúa el producto de punto entre cada filtro y cada ubicación de campo receptivo".

http://cs231n.github.io/convolutional-networks/

Sin embargo, cuando investigo cómo calcular el producto de punto de las matrices , parece que el producto de punto no es lo mismo que sumar la multiplicación elemento por elemento. ¿Qué operación se usa realmente (multiplicación elemento por elemento o el producto punto) y cuál es la diferencia principal?

Ryan Chase
fuente
1
El producto de puntos no es exacto. Yo diría que es la suma de Hadamard productentre el área seleccionada y el núcleo de convolución.
JP Zhang
es un producto de puntos, pero en lugar de usar los parches de sumas de matriz completa que se mueven a lo largo, por lo que no podríamos usar la función de producto de puntos porque tendríamos que pasar en bucle diferentes matrices moviendo el parche / ventana alrededor de toda la imagen / matriz
Mr-Programs

Respuestas:

13

Cualquier capa dada en un CNN tiene típicamente 3 dimensiones (las llamaremos altura, ancho, profundidad). La convolución producirá una nueva capa con una nueva (o la misma) altura, anchura y profundidad. Sin embargo, la operación se realiza de manera diferente en la altura / ancho y de manera diferente en la profundidad y esto es lo que creo que causa confusión.

Veamos primero cómo funciona la convolución en la altura y el ancho de la matriz de entrada. Este caso se realiza exactamente como se muestra en su imagen y es sin duda una multiplicación por elementos de las dos matrices .

En teoría :
las convoluciones bidimensionales (discretas) se calculan mediante la siguiente fórmula:

C[metro,norte]=tuυUNA[metro+tu,norte+υ]si[tu,υ]

Como se puede ver cada elemento de se calcula como la suma de los productos de un solo elemento de con un solo elemento de . Esto significa que cada elemento de se calcula a partir de la suma de la multiplicación elemento racional de y .CUNAsiCUNAsi

En la práctica :
podría probar el ejemplo anterior con cualquier cantidad de paquetes ( usaré scipy ):

import numpy as np
from scipy.signal import convolve2d

A = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
B = np.array([[1,0,1],[0,1,0],[1,0,1]])
C = convolve2d(A, B, 'valid')
print(C)

El código anterior producirá:

[[4 3 4]
 [2 4 3]
 [2 3 4]]

Ahora, la operación de convolución en la profundidad de la entrada puede considerarse realmente como un producto de punto, ya que cada elemento de la misma altura / ancho se multiplica por el mismo peso y se suman. Esto es más evidente en el caso de convoluciones 1x1 (generalmente se usa para manipular la profundidad de una capa sin cambiar sus dimensiones). Esto, sin embargo, no es parte de una convolución 2D (desde un punto de vista matemático) sino algo que las capas convolucionales hacen en las CNN.

Notas :
1: Dicho esto, creo que la mayoría de las fuentes que proporcionó tienen explicaciones engañosas para decir lo menos y no son correctas. No sabía que muchas fuentes tienen esta operación (que es la operación más esencial en CNN) mal. Supongo que tiene algo que ver con el hecho de que las convoluciones suman el producto entre escalares y el producto entre dos escalares también se llama producto de punto .
2: Creo que la primera referencia se refiere a una capa totalmente conectada en lugar de una capa convolucional. Si ese es el caso, una capa FC realiza el producto de puntos como se indica. No tengo el resto del contexto para confirmar esto.

tl; dr La imagen que proporcionó es 100% correcta en cómo se realiza la operación, sin embargo, esta no es la imagen completa. Las capas CNN tienen 3 dimensiones, dos de las cuales se manejan como se muestra. Mi sugerencia sería verificar cómo las capas convolucionales manejan la profundidad de la entrada (el caso más simple que puede ver son las convoluciones 1x1).

Djib2011
fuente
gracias por responder. Según su sugerencia sobre la investigación de cómo las capas convolucionales manejan la profundidad de la entrada, vea la sección Demostración de convolución en este enlace: cs231n.github.io/convolutional-networks . Calculé los números en una hoja de cálculo y parece que el número final que va en el volumen de salida es solo la suma de la multiplicación por elementos de cada filtro y campo receptivo (que suma un número por volumen de color), y luego el tres números se suman junto con el sesgo ...
Ryan Chase
55
Sí, lo que quería señalar es que esto es equivalente a un producto de punto entre el vector de píxeles a lo largo de la tercera dimensión (profundidad, los filtros lo llaman lo que quieres) y el peso escalar del núcleo de convolución.
Djib2011
3

La operación se llama convolución, que implica una suma de elemento por multiplicación de elementos, que a su vez es lo mismo que un producto de punto en matrices multidimensionales que la gente de ML llama tensores. Si lo escribe como un bucle, se verá como este pseudo código de Python:

for i in 0:3:
  for j in 0:3:
    s = 0
    for k in 0:3:
      for l in 0:3:
        s += A[i+k,j+l]*C[k,l]
    Z[i,j] = s

Aquí A es su matriz de entrada de 5x5, C es un filtro de 3x3 y Z es una matriz de salida de 3x3.

La sutil diferencia con un producto de puntos es que generalmente un producto de puntos está en todos los vectores, mientras que en convolución usted hace un producto de puntos en el subconjunto móvil (ventana) de la matriz de entrada, podría escribirlo de la siguiente manera para reemplazar los dos anidados más internos bucles en el código anterior:

Z[i,j] = dot(A[i:i+2,j:j+2],C)
Aksakal
fuente
1

Creo que la clave es que cuando el filtro involucra una parte de la imagen (el "campo receptivo") cada número en el filtro (es decir, cada peso) se aplana primero en formato vectorial . Del mismo modo, los píxeles de la imagen también se aplanan en formato vectorial . ENTONCES, se calcula el producto escalar. Lo cual es exactamente lo mismo que encontrar la suma de la multiplicación elemento por elemento (elemento-sabio).

Por supuesto, estos vectores aplanados también se pueden combinar en un formato matricial, como muestra la siguiente imagen. En este caso, se puede usar la multiplicación matricial verdadera, pero es importante tener en cuenta que el aplanamiento de los píxeles de la imagen de cada convolución y también el filtro de pesos es el precursor.

ingrese la descripción de la imagen aquí

Crédito de imagen: TensorFlow y Deep Learning sin un doctorado, Parte 1 (Google Cloud Next '17)

Ryan Chase
fuente
0

Tanto las interpretaciones de los elementos como de los puntos son correctas. Cuando convolucionas dos tensores, X de forma (h, w, d) e Y de forma (h, w, d), estás haciendo una multiplicación por elementos. Sin embargo, es lo mismo que el producto de punto de transposición X e Y. Puede expandir la ecuación matemática, las formas y los subíndices coinciden.

usuario2065639
fuente