web-dev-qa-db-fra.com

keras BatchNormalisation de la clarification des axes

Les keras BatchNormalization couche utilise axis=-1 comme valeur par défaut et indique que l'axe de la fonction est généralement normalisé. pourquoi est-ce le cas?

Je suppose que cela est surprenant car je suis plus familier avec quelque chose comme StandardScaler , ce qui équivaudrait à utiliser axis=0. Cela normaliserait les fonctionnalités individuellement.

Y a-t-il une raison pour laquelle les échantillons sont normalisés individuellement par défaut (c'est-à-dire axis=-1) en keras par opposition aux fonctionnalités?

Edit: exemple de concrétisation

Il est courant de transformer des données de telle sorte que chaque entité ait une moyenne et une variance d'unité nulles. Prenons simplement la partie "zéro moyenne" avec cet ensemble de données fictif, où chaque ligne est un échantillon:

>>> data = np.array([[   1,   10,  100, 1000],
                     [   2,   20,  200, 2000],
                     [   3,   30,  300, 3000]])

>>> data.mean(axis=0)
array([    2.,    20.,   200.,  2000.])

>>> data.mean(axis=1)
array([ 277.75,  555.5 ,  833.25])

Ne serait-il pas plus logique de soustraire le axis=0 signifie, par opposition à axis=1 signifier? En utilisant axis=1, les unités et les échelles peuvent être complètement différentes.

Modifier 2:

La première équation de la section 3 dans cet article semble impliquer que axis=0 doit être utilisé pour calculer les attentes et les variances pour chaque entité individuellement, en supposant que vous avez un ensemble de données en forme (m, n) où m est le nombre d'échantillons et n est le nombre d'entités.

Edit 3: un autre exemple

Je voulais voir les dimensions des moyennes et des variances BatchNormalization calculait sur un jeu de données jouet:

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris

from keras.optimizers import Adam
from keras.models import Model
from keras.layers import BatchNormalization, Dense, Input


iris = load_iris()
X = iris.data
y = pd.get_dummies(iris.target).values

input_ = Input(shape=(4, ))
norm = BatchNormalization()(input_)
l1 = Dense(4, activation='relu')(norm)
output = Dense(3, activation='sigmoid')(l1)

model = Model(input_, output)
model.compile(Adam(0.01), 'categorical_crossentropy')
model.fit(X, y, epochs=100, batch_size=32)

bn = model.layers[1]
bn.moving_mean  # <tf.Variable 'batch_normalization_1/moving_mean:0' shape=(4,) dtype=float32_ref>

L'entrée X a une forme (150, 4) et la couche BatchNormalization a calculé 4 signifie, ce qui signifie qu'elle a fonctionné sur axis=0.

Si BatchNormalization a une valeur par défaut de axis=-1 alors ne devrait-il pas y avoir 150 moyens?

14
trianta2

La confusion est due à la signification de axis dans np.mean Par rapport à BatchNormalization.

Lorsque nous prenons la moyenne le long d'un axe, nous réduisons cette dimension et préservons toutes les autres dimensions. Dans votre exemple, data.mean(axis=0) réduit le 0-axis, Qui est la dimension verticale de data.

Lorsque nous calculons un BatchNormalization le long d'un axe, nous préservons les dimensions du tableau et nous normalisons par rapport à la moyenne et l'écart type sur tous les deux axes. Ainsi, dans votre exemple 2DBatchNormalization avec axis=1is en soustrayant la moyenne de axis=0, Comme vous vous y attendez. C'est pourquoi bn.moving_mean A la forme (4,).

19
Imran

Je sais que ce message est ancien, mais j'y réponds toujours car la confusion persiste dans la documentation Keras. J'ai dû parcourir le code pour comprendre cela:

  1. La variable d'axe qui est documentée comme étant un entier peut en fait être une liste d'entiers dénotant plusieurs axes. Donc, par exemple si mon entrée avait une image aux formats NHWC ou NCHW, fournissez axe = [1,2,3] si je voulais effectuer BatchNormalization de la manière souhaitée par l'OP (c'est-à-dire normaliser uniquement sur la dimension de lot uniquement).
  2. La liste des axes (ou entier) doit contenir les axes que vous ne voulez pas réduire pendant le calcul de la moyenne et de la variance. En d'autres termes, c'est le complément des axes le long duquel vous voulez normaliser - tout à fait à l'opposé de ce que la documentation semble dire si vous allez par la définition conventionnelle des "axes". Donc, par exemple si votre entrée était de forme (N, H, W, C) ou (N, C, H, W) - c'est-à-dire que la première dimension était la dimension du lot et que vous vouliez uniquement que la moyenne et la variance soient calculées sur la dimension du lot vous devez fournir axe = [1,2,3]. Cela entraînera Keras à calculer la moyenne des tenseurs M de forme et de variance V de forme (1, H, W, C) ou (1, C, H, W) respectivement - c'est-à-dire que la dimension du lot serait marginalisée/réduite en raison de l'agrégation ou la variance est calculée sur la première dimension). Dans des opérations ultérieures comme (I-M) et (I-M)/V, la première dimension de M et V serait diffusée à tous les N échantillons du lot.
  3. La couche BatchNorm finit par appeler tf.nn.moments avec axes = (1,) dans cet exemple! C'est parce que la définition des axes dans tf.nn.moments est la bonne.
  4. De même, tf.nn.moments appelle tf.nn.reduce_mean, où encore la définition des axes est la bonne (c'est-à-dire l'opposé de tf.keras.layers.BatchNormalization).
  5. Cela dit, le document BatchNormalization suggère une normalisation à travers la carte spatiale HxW en plus de la dimension du lot (N). Par conséquent, si l'on devait suivre ce conseil, l'axe n'inclurait que la dimension de canal (C) car c'est la seule dimension restante que vous ne vouliez pas réduire. La documentation Keras y fait probablement allusion, bien qu'elle soit assez cryptique.
3
BoltzmannMachine

si votre mini-batch est une matrice [~ # ~] a [~ # ~] mxn , c'est-à-dire m échantillons et n caractéristiques, l'axe de normalisation doit être axe = 0 . Comme vous l'avez dit, ce que nous voulons, c'est normaliser chaque fonctionnalité individuellement, l'axe par défaut = -1 en keras car quand il est utilisé dans la couche de convolution, les dimensions du jeu de données des figures sont généralement (échantillons, largeur, hauteur, canal) , et les échantillons de lot sont normalisés le long de axe canalaire (le dernier axe) .

0
Hanrong Zheng