Al fin luego de tanto luchar hemos dado con la respuesta de esta cuestión que tantos lectores de nuestra web han presentado. Si tienes algún detalle que compartir no dejes de aportar tu conocimiento.
Solución:
Primero veamos cómo se calcula la cantidad de parámetros que se pueden aprender para cada tipo individual de capa que tenga y luego calculemos la cantidad de parámetros en su ejemplo.
- Capa de entrada: Todo lo que hace la capa de entrada es leer la imagen de entrada, por lo que no hay parámetros que pueda aprender aquí.
-
Capas convolucionales: Considere una capa convolucional que toma
l
mapas de características en la entrada, y tienek
mapas de características como salida. El tamaño del filtro esn
Xm
. Por ejemplo, esto se verá así:Aquí, la entrada tiene
l=32
mapas de características como entrada,k=64
mapas de características como salida, y el tamaño del filtro esn=3
Xm=3
. Es importante comprender que no tenemos simplemente un filtro de 3×3, sino un filtro de 3x3x32, ya que nuestra entrada tiene 32 dimensiones. Y aprendemos 64 filtros 3x3x32 diferentes. Por lo tanto, el número total de pesos esn*m*k*l
. Luego, también hay un término de sesgo para cada mapa de características, por lo que tenemos un número total de parámetros de(n*m*l+1)*k
. - Agrupación de capas: Las capas de agrupación, por ejemplo, hacen lo siguiente: “reemplazar un vecindario de 2×2 por su valor máximo”. Por lo tanto, no hay ningún parámetro que pueda aprender en una capa de agrupación.
- Capas totalmente conectadas: En una capa totalmente conectada, todas las unidades de entrada tienen un peso independiente para cada unidad de salida. Para
n
entradas ym
salidas, el número de pesos esn*m
. Además, tiene un sesgo para cada nodo de salida, por lo que está en(n+1)*m
parámetros - Capa de salida: La capa de salida es una capa normal totalmente conectada, por lo que
(n+1)*m
parámetros, donden
es el número de entradas ym
es el número de salidas.
La dificultad final es la primera capa completamente conectada: no conocemos la dimensionalidad de la entrada a esa capa, ya que es una capa convolucional. Para calcularlo, debemos comenzar con el tamaño de la imagen de entrada y calcular el tamaño de cada capa convolucional. En su caso, Lasagne ya calcula esto por usted e informa los tamaños, lo que nos lo pone fácil. Si tienes que calcular tú mismo el tamaño de cada capa, es un poco más complicado:
- En el caso más simple (como su ejemplo), el tamaño de la salida de una capa convolucional es
input_size - (filter_size - 1)
, en su caso: 28 – 4 = 24. Esto se debe a la naturaleza de la convolución: usamos, por ejemplo, un vecindario de 5×5 para calcular un punto, pero las dos filas y columnas más externas no tienen un vecindario de 5×5, por lo que podemos No calcule ninguna salida para esos puntos. Es por eso que nuestra salida es 2*2=4 filas/columnas más pequeñas que la entrada. - Si uno no quiere que la salida sea más pequeña que la entrada, puede rellenar con ceros la imagen (con el
pad
parámetro de la capa convolucional en Lasaña). Por ejemplo, si agrega 2 filas/columnas de ceros alrededor de la imagen, el tamaño de salida será (28+4)-4=28. Entonces, en caso de relleno, el tamaño de salida esinput_size + 2*padding - (filter_size -1)
. - Si desea explícitamente reducir la resolución de su imagen durante la convolución, puede definir un paso, por ejemplo
stride=2
, lo que significa que mueves el filtro en pasos de 2 píxeles. Entonces, la expresión se convierte en((input_size + 2*padding - filter_size)/stride) +1
.
En tu caso, los cálculos completos son:
# name size parameters
--- -------- ------------------------- ------------------------
0 input 1x28x28 0
1 conv2d1 (28-(5-1))=24 -> 32x24x24 (5*5*1+1)*32 = 832
2 maxpool1 32x12x12 0
3 conv2d2 (12-(3-1))=10 -> 32x10x10 (3*3*32+1)*32 = 9'248
4 maxpool2 32x5x5 0
5 dense 256 (32*5*5+1)*256 = 205'056
6 output 10 (256+1)*10 = 2'570
Entonces, en su red, tiene un total de 832 + 9’248 + 205’056 + 2’570 = 217’706 parámetros que se pueden aprender, que es exactamente lo que informa Lasagne.
construyendo sobre la excelente respuesta de @hbaderts, se me ocurrió una fórmula para una red ICPCPHO (ya que estaba trabajando en un problema similar), compartirla en la figura a continuación, puede ser útil.
Además, (1) capa de convolución con zancada de 2×2 y (2) capa de convolución con zancada de 1×1 + agrupación (máx./promedio) con zancada de 2×2, cada una aporta la misma cantidad de parámetros con el mismo relleno, como se puede ver a continuación: