Soy bastante nuevo en las redes neuronales, pero entiendo bastante bien el álgebra lineal y las matemáticas de la convolución.
Estoy tratando de entender el código de ejemplo que encuentro en varios lugares de la red para entrenar un NN convolucional Keras con datos MNIST para reconocer dígitos. Mi expectativa sería que cuando creara una capa convolucional, tendría que especificar un filtro o conjunto de filtros para aplicar a la entrada. Pero las tres muestras que he encontrado crean una capa convolucional como esta:
model.add(Convolution2D(nb_filter = 32, nb_row = 3, nb_col = 3,
border_mode='valid',
input_shape=input_shape))
Esto parece estar aplicando un total de 32 filtros 3x3 a las imágenes procesadas por la CNN. ¿Pero qué son esos filtros? ¿Cómo los describiría matemáticamente? La documentación de Keras no es de ayuda.
Gracias por adelantado,
Respuestas:
De manera predeterminada, los filtros se inicializan aleatoriamente utilizando el método, que extrae valores de una distribución uniforme con límites positivos y negativos descritos así:W W∼ U( 6norteyo n+ no u t, - 6norteyo n+ no u t) ,
glorot_uniform
donde es el número de unidades que alimentan a esta unidad, y es el número de unidades a las que se alimenta este resultado.norteyo n norteo u t
Cuando utiliza la red para hacer una predicción, estos filtros se aplican en cada capa de la red. Es decir, se realiza una convolución discreta para cada filtro en cada imagen de entrada, y los resultados de estas convoluciones se envían a la siguiente capa de convoluciones (o capa totalmente conectada, o cualquier otra cosa que pueda tener).
Durante el entrenamiento, los valores en los filtros se optimizan con retropropagación con respecto a una función de pérdida. Para tareas de clasificación como el reconocimiento de dígitos, generalmente se usa la pérdida de entropía cruzada. Aquí hay una visualización de algunos filtros aprendidos en la primera capa (arriba) y los filtros aprendidos en la segunda capa (abajo) de una red convolucional:
Como puede ver, los filtros de la primera capa básicamente actúan como detectores de borde simples, mientras que los filtros de la segunda capa son más complejos. A medida que profundiza en una red, los filtros pueden detectar formas más complejas. Sin embargo, se vuelve un poco difícil de visualizar, ya que estos filtros actúan sobre imágenes que ya han sido convolucionadas muchas veces, y probablemente no se parecen mucho a la imagen natural original.
fuente
glorot_uniform
No utiliza la distribución normal. Creo que lo estás describiendoglorot_normal
. No creo que eso sea muy importante para la respuesta: los puntos clave son la inicialización aleatoria seguida de los efectos del entrenamiento. Podría valer la pena explicar cómo los filtros entrenados terminan pareciéndose a los filtros de borde / esquina, etc.glorot_normal
yglorot_uniform
he actualizado la respuesta para reflejar esto. También agregué un poco de información adicional sobre cómo terminan los filtros, como usted sugirió.Son núcleos de convolución. Por ejemplo, su imagen es 5x5, tiene 32 núcleos de convolución 3x3 . El border_mode es 'válido', lo que significa que no hay relleno alrededor de la entrada, por lo que se pierden los píxeles (i, 0), (0, j), (i, 4), (4, j). Por lo tanto, sus resultados son 32 imágenes 3x3 , (i = 1,2,3, j = 1,2,3), cada imagen de resultado está definida por la convolución: F k B k ( i , j ) B k ( i , j ) = ( F k ∗ A ) ( i , j ) = ∑ l = 0 , 1 , 2 ∑ m = 0 , 1 , 2 F k ( l , m ) A ( i - l , j -A Fk Bk(i,j)
El modelo trazado entrenará los núcleos de acuerdo con su función de costo, y al final estos núcleos son los filtros de su modelo.
fuente