23 votos

En una red neuronal convolucional (CNN), al convolucionar la imagen, ¿la operación utilizada es el producto punto o la suma de multiplicaciones por elementos?

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

$(1*1)+(1*0)+(1*1)+(0*0)+(1*1)+(1*0)+(0*1)+(0*0)+(1*1) = 1+0+1+0+1+0+0+0+1 = 4 $

enter image description here

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

" podemos reexpresar la salida de la neurona término. En otras palabras, podemos calcular la salida mediante y=f(x*w) donde b es el término de sesgo. En otras palabras, podemos calcular la salida mediante realizando el producto punto de los vectores de entrada y peso, añadiendo en el término de sesgo para producir el logit y, a continuación, aplicando la fórmula función de transformación".

Buduma, Nikhil; Locascio, Nicholas. Fundamentos del aprendizaje profundo: Designing Next-Generation Machine Intelligence Algorithms (p. 8). O'Reilly Media. Edición Kindle.

"Tomamos el filtro 5*5*3 y lo deslizamos sobre la imagen completa y por el camino tomamos el producto punto entre el filtro a la imagen de entrada. Por cada producto escalar, el resultado es un escalar".

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

"Cada neurona recibe unas entradas, realiza un producto punto y opcionalmente lo sigue con una no linealidad".

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

"El resultado de una convolución equivale ahora a realizar una gran multiplicación matricial np.dot(W_row, X_col), que evalúa el producto punto entre cada filtro y cada localización del campo receptivo".

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

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

17voto

Djib2011 Puntos 693

Cualquier capa de una CNN tiene normalmente 3 dimensiones (las llamaremos altura, anchura y 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 diferente en la altura/anchura y diferente en la profundidad y esto es lo que creo que causa confusión.

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

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

$$C \left[ m, n \right] = \sum_u \sum_υ A \left[ m + u, n + υ\right] \cdot B \left[ u, υ \right]$$

Como puede ver, cada elemento de $C$ se calcula como la suma de los productos de un solo elemento de $A$ con un único elemento de $B$ . Esto significa que cada elemento de $C$ se calcula a partir de la suma de la multiplicación por elementos de $A$ y $B$ .

En la práctica :
Puede probar el ejemplo anterior con cualquier número de paquetes (yo utilizaré 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 el profundidad de la entrada puede considerarse en realidad producto punto ya que cada elemento de la misma altura/anchura se multiplica por el mismo peso y se suman. Esto es más evidente en el caso de las convoluciones 1x1 (utilizadas normalmente para manipular la profundidad de una capa sin cambiar sus dimensiones). Sin embargo, esto no forma parte de una convolución 2D (desde un punto de vista matemático), sino que es algo que hacen las capas convolucionales en las CNN.

Notas :
1: Dicho esto, creo que la mayoría de las fuentes que has proporcionado tienen explicaciones engañosas como poco y no son correctas. No sabía que tantas fuentes tuvieran mal esta operación (que es la más esencial en las CNN). 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 denomina producto 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 punto como se indica. No tengo el resto del contexto para confirmarlo.

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

12voto

Ryan Chase Puntos 68

Creo que la clave está en que cuando el filtro está convolviendo alguna parte de la imagen (el "campo receptivo") cada número del filtro (es decir, cada peso) es primero aplanado en formato vectorial . Del mismo modo, los píxeles de la imagen también se aplanado en formato vectorial . ENTONCES, se calcula el producto punto. Que es exactamente lo mismo que hallar la suma de la multiplicación elemento a elemento (element-wise).

Por supuesto, estos vectores aplanados también pueden combinarse en un formato matricial, como muestra la imagen siguiente. En este caso, se puede utilizar la multiplicación matricial real, 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.

enter image description here

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

4voto

Aksakal Puntos 11351

La operación se llama convolución, que implica una suma de multiplicaciones elemento a elemento, que a su vez es lo mismo que un producto punto sobre matrices multidimensionales que los amigos de ML llaman tensores. Si lo escribes como un bucle, se parecerá a este código pseudo 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 tu matriz de entrada 5x5, C es el filtro 3x3 y Z es la matriz de salida 3x3.

La sutil diferencia con un producto punto es que normalmente un producto punto es sobre los vectores enteros, mientras que en la convolución haces el producto punto sobre el subconjunto móvil (ventana) de la matriz de entrada, podrías escribirlo de la siguiente manera para reemplazar los dos bucles anidados más internos en el código anterior:

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

0voto

Besykje Puntos 1

Ambas interpretaciones son correctas. Cuando conviertes dos tensores, X de forma (h, w, d) e Y de forma (h, w, d), estás haciendo una multiplicación elemento a elemento. Sin embargo, es lo mismo que el producto punto de X e Y transpuesto. Puedes expandir la ecuación matemática, las formas y los subíndices coinciden.

0voto

Mr_Nizzle Puntos 2414

"¿Qué operación se utiliza realmente (la multiplicación elemento a elemento o el producto punto?) y cuál es la diferencia principal?".

La operación real se denomina convolución y se define como:

$$ J(x,y) = K * I = \sum_{n,m}K(n,m)I(x-n,y-m) $$

Dónde $J$ es la señal convolucionada, $K$ es el núcleo, $I$ es la señal de entrada, y $n,m$ son los índices del núcleo. Vemos por la indexación de la señal de entrada $I(x-n,y-m)$ que ambos ejes de la señal de entrada están "invertidos". Por otra parte, el núcleo (también conocido como filtro) podría invertirse.

Volviendo a su pregunta:

Desde el Documentación sobre Numpy : el producto punto numpy.dot "Devuelve el producto punto de a y b. Si a y b son ambos escalares o ambos matrices 1-D entonces se devuelve un escalar; en caso contrario se devuelve una matriz. (...)"

Mientras que el suma de la multiplicación por elementos devuelve un escalar. Haciendo uso de una respuesta anterior - si nos fijamos en las dos regiones del ejemplo:

import numpy as np
from scipy.signal import convolve2d

A = np.array([[1,1,1],
              [0,1,1],
              [0,0,1]])

B = np.array([[1,0,1],
              [0,1,0],
              [1,0,1]])

Producto punto (devuelve ndarray):

print(np.dot(A,B))

[[2 1 2]
 [1 1 1]
 [1 0 1]]

Suma de la multiplicación por elementos (devuelve escalar);

print(np.sum(np.multiply(A,B)))

4

Y esa es la principal diferencia.

Por si fuera poco, una convolución:

D = convolve2d(A, B, 'valid')
print(D)

[[4]]

que en este caso es igual a la suma de la multiplicación por elementos del parche de imagen y el filtro.

Una convolución puede ser equivalente a una suma de multiplicaciones por elementos si el filtro es simétrico, que es el caso del ejemplo deeplearning.ai. Este no será el caso de los filtros asimétricos:

B2 = np.array([[1,0,0],
               [0,1,0],
               [1,0,1]])

print(np.sum(np.multiply(A,B2)))
print(convolve2d(A, B2, 'valid')) 

3
[[4]]

donde la suma de la multiplicación por elementos devuelve 3 y la convolución devuelve 4, aunque como tipo de datos numpy.ndarray.

Tenga en cuenta que la discusión sobre matrices aplanadas - TensorFlow and Deep Learning without a PhD, Part 1 (Google Cloud Next '17) - se aplica a capas totalmente conectadas, no convolucionales.

2020 ¿sigues leyendo? :D

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X