tutorial redes neuronales neuronal learning imagenes funcionan explicacion convolucionales convolucional como cnn neural-network deep-learning conv-neural-network lasagne nolearn

neural network - redes - ¿Cómo calcular el número de parámetros para la red neuronal convolucional?



redes neuronales convolucionales pdf (2)

Estoy usando Lasagne para crear una CNN para el conjunto de datos MNIST. Estoy siguiendo de cerca este ejemplo: redes neuronales convolucionales y extracción de características con Python .

La arquitectura CNN que tengo en este momento, que no incluye ninguna capa de abandono, es:

NeuralNet( layers=[(''input'', layers.InputLayer), # Input Layer (''conv2d1'', layers.Conv2DLayer), # Convolutional Layer (''maxpool1'', layers.MaxPool2DLayer), # 2D Max Pooling Layer (''conv2d2'', layers.Conv2DLayer), # Convolutional Layer (''maxpool2'', layers.MaxPool2DLayer), # 2D Max Pooling Layer (''dense'', layers.DenseLayer), # Fully connected layer (''output'', layers.DenseLayer), # Output Layer ], # input layer input_shape=(None, 1, 28, 28), # layer conv2d1 conv2d1_num_filters=32, conv2d1_filter_size=(5, 5), conv2d1_nonlinearity=lasagne.nonlinearities.rectify, # layer maxpool1 maxpool1_pool_size=(2, 2), # layer conv2d2 conv2d2_num_filters=32, conv2d2_filter_size=(3, 3), conv2d2_nonlinearity=lasagne.nonlinearities.rectify, # layer maxpool2 maxpool2_pool_size=(2, 2), # Fully Connected Layer dense_num_units=256, dense_nonlinearity=lasagne.nonlinearities.rectify, # output Layer output_nonlinearity=lasagne.nonlinearities.softmax, output_num_units=10, # optimization method params update= momentum, update_learning_rate=0.01, update_momentum=0.9, max_epochs=10, verbose=1, )

Esto genera la siguiente información de capa:

# name size --- -------- -------- 0 input 1x28x28 1 conv2d1 32x24x24 2 maxpool1 32x12x12 3 conv2d2 32x10x10 4 maxpool2 32x5x5 5 dense 256 6 output 10

y genera el número de parámetros que se pueden aprender como 217.706

Me pregunto cómo se calcula este número? He leído una serie de recursos, incluida la question de StackOverflow, pero ninguno generaliza claramente el cálculo.

Si es posible, ¿ se puede generalizar el cálculo de los parámetros aprendibles por capa?

Por ejemplo, capa convolucional: número de filtros x ancho del filtro x altura del filtro.


Primero veamos cómo se calcula la cantidad de parámetros que se pueden aprender para cada tipo de capa individual 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 entidades en la entrada, y tiene k mapas de entidades como salida. El tamaño del filtro es n x m . 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 es n=3 x m=3 . Es importante comprender que no solo tenemos un filtro 3x3, sino un filtro 3x3x32, ya que nuestra entrada tiene 32 dimensiones. Y aprendemos 64 filtros 3x3x32 diferentes. Por lo tanto, el número total de pesos es n*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 una vecindad 2x2 por su valor máximo". Así que no hay ningún parámetro que puedas aprender en una capa de agrupación.
  • Capas totalmente conectadas : en una capa totalmente conectada, todas las unidades de entrada tienen un peso separado para cada unidad de salida. Para n entradas y m salidas, el número de pesos es n*m . Además, tiene un sesgo para cada nodo de salida, por lo que está en (n+1)*m parámetros (n+1)*m .
  • Capa de salida : la capa de salida es una capa completamente conectada normal, por lo que (n+1)*m parámetros, donde n es el número de entradas y m es el número de salidas.

La dificultad final es la primera capa totalmente 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 para usted e informa los tamaños, lo que nos lo pone fácil. Si tienes que calcular el tamaño de cada capa tú mismo, 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, una vecindad de 5x5 para calcular un punto, pero las dos filas y columnas más externas no tienen una vecindad de 5x5, por lo que no podemos calcular ninguna salida para esos puntos. Es por esto 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 cero la imagen (con el parámetro de pad de la capa convolucional en Lasagne). Por ejemplo, si agrega 2 filas / cols de ceros alrededor de la imagen, el tamaño de salida será (28 + 4) -4 = 28. Entonces, en el caso del relleno, el tamaño de salida es input_size + 2*padding - (filter_size -1) .
  • Si desea reducir la muestra de su imagen durante la convolución, puede definir una zancada, por ejemplo, stride=2 , lo que significa que mueve el filtro en pasos de 2 píxeles. Luego, la expresión se convierte en ((input_size + 2*padding - filter_size)/stride) +1 .

En su 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

Por lo tanto, en su red, tiene un total de 832 + 9''248 + 205''056 + 2''570 = 217''706 parámetros aprendibles, que es exactamente lo que informa Lasagne.


Sobre la base de la excelente respuesta de @ hbaderts, solo se me ocurrió una fórmula para una red ICPCPHO (ya que estaba trabajando en un problema similar), compartirlo en la siguiente figura puede ser útil.

Además, (1) capa de convolución con 2x2 zancadas y (2) capa de convolución 1x1 zancada + (max / avg) combinadas con 2x2 zancadas, cada una contribuye con el mismo número de parámetros con el mismo relleno, como se puede ver a continuación: