Si quiero usar la función BatchNormalization en Keras, ¿debo llamarla solo una vez al principio?
Leí esta documentación para ello: http://keras.io/layers/normalization/
No veo dónde se supone que debo llamarlo. A continuación se muestra mi código intentando usarlo:
model = Sequential()
keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)
Pregunto porque si ejecuto el código con la segunda línea, incluida la normalización por lotes, y si ejecuto el código sin la segunda línea, obtengo resultados similares. Entonces, o no estoy llamando a la función en el lugar correcto, o supongo que no hace mucha diferencia.
Este hilo es engañoso. Intenté comentar la respuesta de Lucas Ramadan, pero todavía no tengo los privilegios correctos, así que lo pondré aquí.
La normalización por lotes funciona mejor después de la función de activación, y aquí o aquí es por qué: se desarrolló para evitar el cambio interno de covariable. El cambio covariable interno ocurre cuando la distribución de las activacionesde una capa cambia significativamente durante el entrenamiento. La normalización de lote se usa para que la distribución de las entradas (y estas entradas son literalmente el resultado de una función de activación) a una capa específica no cambie con el tiempo debido a las actualizaciones de parámetros de cada lote (o al menos, permite que cambie de manera ventajosa). Utiliza estadísticas de lote para hacer la normalización, y luego usa los parámetros de normalización de lote (gamma y beta en el documento original) "para asegurarse de que la transformación insertada en la red pueda representar la transformación de identidad" (cita del documento original). Pero el punto es que estamos tratando de normalizar las entradas a una capa, por lo que siempre debe ir inmediatamente antes de la siguiente capa en la red. Si eso o no
fuente
g(BN(Wx + b))
dóndeg
está la función de activación.Este hilo tiene un debate considerable sobre si BN debe aplicarse antes de la no linealidad de la capa actual o a las activaciones de la capa anterior.
Aunque no hay una respuesta correcta, los autores de Batch Normalization dicen que debe aplicarse inmediatamente antes de la no linealidad de la capa actual. El motivo (citado del artículo original):
fuente
Keras ahora admite la
use_bias=False
opción, por lo que podemos guardar algunos cálculos escribiendo comoo
fuente
model.add(BatchNormalization())
diferente demodel.add(BatchNormalization(axis=bn_axis))
tensorflow
como back-end. Está escrito aquí porque copió esto desde elkeras.applications
módulo, dondebn_axis
se debe especificar con el fin de apoyar tantochannels_first
ychannels_last
formatos.Casi se ha convertido en una tendencia ahora tener un
Conv2D
seguido de unReLu
seguido de unaBatchNormalization
capa. Así que hice una pequeña función para llamarlos a todos a la vez. Hace que la definición del modelo se vea mucho más limpia y fácil de leer.fuente
Es otro tipo de capa, por lo que debe agregarla como una capa en un lugar apropiado de su modelo
Vea un ejemplo aquí: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py
fuente
La normalización por lotes se utiliza para normalizar la capa de entrada, así como las capas ocultas ajustando la media y la escala de las activaciones. Debido a este efecto de normalización con capa adicional en redes neuronales profundas, la red puede usar una mayor tasa de aprendizaje sin desaparecer o explotar gradientes. Además, la normalización por lotes regulariza la red de modo que sea más fácil generalizar y, por lo tanto, no es necesario utilizar el abandono para mitigar el sobreajuste.
Justo después de calcular la función lineal usando say, Dense () o Conv2D () en Keras, usamos BatchNormalization () que calcula la función lineal en una capa y luego agregamos la no linealidad a la capa usando Activación ().
¿Cómo se aplica la normalización por lotes?
Supongamos que hemos ingresado a [l-1] en una capa l. También tenemos los pesos W [l] y la unidad de polarización b [l] para la capa l. Deje que [l] sea el vector de activación calculado (es decir, después de agregar la no linealidad) para la capa l y z [l] sea el vector antes de agregar la no linealidad
Ahora defina nuevos parámetros γ y β que cambiarán la escala de la capa oculta de la siguiente manera:
z_norm [l] = γ.Z_temp [l] + β
En este extracto de código, Dense () toma a [l-1], usa W [l] y calcula z [l]. Luego, la BatchNormalization () inmediata realizará los pasos anteriores para dar z_norm [l]. Y luego la Activación inmediata () calculará tanh (z_norm [l]) para dar un [l] es decir
fuente