Si je souhaite utiliser la fonction BatchNormalization dans Keras, dois-je l'appeler une seule fois au début?
J'ai lu cette documentation pour cela: http://keras.io/layers/normalization/
Je ne vois pas où je suis censé l'appeler. Voici mon code essayant de l'utiliser:
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)
Je demande parce que si j'exécute le code avec la deuxième ligne, y compris la normalisation par lots et si j'exécute le code sans la deuxième ligne, j'obtiens des sorties similaires. Donc, soit je n'appelle pas la fonction au bon endroit, soit je suppose que cela ne fait pas beaucoup de différence.
Ce fil est trompeur. J'ai essayé de commenter la réponse de Lucas Ramadan, mais je n'ai pas encore les bons privilèges, alors je vais simplement mettre ceci ici.
La normalisation par lots fonctionne mieux après la fonction d'activation, et voici ou voici pourquoi: elle a été développée pour empêcher le décalage de covariable interne. Le décalage de covariable interne se produit lorsque la distribution des activationsd'une couche change considérablement tout au long de la formation. La normalisation par lots est utilisée pour que la distribution des entrées (et ces entrées sont littéralement le résultat d'une fonction d'activation) vers une couche spécifique ne change pas au fil du temps en raison des mises à jour des paramètres de chaque lot (ou du moins, lui permet de changer de manière avantageuse). Il utilise des statistiques par lots pour faire la normalisation, puis utilise les paramètres de normalisation par lots (gamma et bêta dans le papier d'origine) "pour s'assurer que la transformation insérée dans le réseau peut représenter la transformation d'identité" (citation du papier original). Mais le fait est que nous essayons de normaliser les entrées sur une couche, donc cela devrait toujours aller immédiatement avant la couche suivante du réseau. Que ce soit ou non
la source
g(BN(Wx + b))
, oùg
est la fonction d'activation.Ce fil a un débat considérable sur la question de savoir si BN doit être appliqué avant la non-linéarité de la couche actuelle ou aux activations de la couche précédente.
Bien qu'il n'y ait pas de réponse correcte, les auteurs de la normalisation par lots disent qu'elle doit être appliquée immédiatement avant la non-linéarité du calque actuel. La raison (citée du papier original) -
la source
Keras prend désormais en charge l'
use_bias=False
option, nous pouvons donc enregistrer des calculs en écrivant commeou
la source
model.add(BatchNormalization())
different frommodel.add(BatchNormalization(axis=bn_axis))
tensorflow
comme backend. Il est écrit ici car il l'a copié à partir dukeras.applications
module, oùbn_axis
doit être spécifié afin de prendre en charge les formatschannels_first
etchannels_last
.C'est presque devenu une tendance maintenant d'avoir un
Conv2D
suivi d'unReLu
suivi d'unBatchNormalization
calque. J'ai donc créé une petite fonction pour les appeler tous à la fois. Rend la définition du modèle beaucoup plus propre et plus facile à lire.la source
C'est un autre type de calque, vous devez donc l'ajouter en tant que calque à un endroit approprié de votre modèle
Voir un exemple ici: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py
la source
La normalisation par lots est utilisée pour normaliser la couche d'entrée ainsi que les couches cachées en ajustant la moyenne et la mise à l'échelle des activations. En raison de cet effet de normalisation avec une couche supplémentaire dans les réseaux de neurones profonds, le réseau peut utiliser un taux d'apprentissage plus élevé sans disparaître ou exploser de gradients. En outre, la normalisation par lots régularise le réseau de sorte qu'il est plus facile à généraliser, et il n'est donc pas nécessaire d'utiliser le décrochage pour atténuer le surajustement.
Juste après avoir calculé la fonction linéaire en utilisant, par exemple, Dense () ou Conv2D () dans Keras, nous utilisons BatchNormalization () qui calcule la fonction linéaire dans un calque, puis nous ajoutons la non-linéarité au calque en utilisant Activation ().
Comment la normalisation des lots est-elle appliquée?
Supposons que nous ayons entré a [l-1] dans une couche l. Nous avons également les poids W [l] et l'unité de biais b [l] pour la couche l. Soit a [l] le vecteur d'activation calculé (c'est-à-dire après addition de la non-linéarité) pour la couche l et z [l] le vecteur avant d'ajouter la non-linéarité
Définissez maintenant de nouveaux paramètres γ et β qui changeront l'échelle du calque caché comme suit:
z_norm [l] = γ.Z_temp [l] + β
Dans cet extrait de code, le Dense () prend le a [l-1], utilise W [l] et calcule z [l]. Ensuite, le BatchNormalization () immédiat exécutera les étapes ci-dessus pour donner z_norm [l]. Et puis l'activation immédiate () calculera tanh (z_norm [l]) pour donner un [l] ie
la source