Keras BatchNormalization
layer はデフォルト値として_axis=-1
_を使用し、フィーチャ軸は通常正規化されていると述べています。これはなぜですか?
私は StandardScaler
のようなものを使用することに慣れているので、これは驚くべきことだと思います。これは_axis=0
_を使用することと同等です。これにより、機能が個別に正規化されます。
機能とは対照的に、サンプルがケラでデフォルトで個別に正規化される(つまり、_axis=-1
_)理由はありますか?
編集:具体性の例
各フィーチャの平均および分散がゼロになるようにデータを変換することは一般的です。このモックデータセットの「ゼロ平均」部分を考えてみましょう。各行はサンプルです。
_>>> 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])
_
_axis=0
_の平均とは対照的に、_axis=1
_の平均を減算するほうが理にかなっているのではないでしょうか。 _axis=1
_を使用すると、単位とスケールが完全に異なる場合があります。
編集2:
(このペーパー のセクション3の最初の方程式は、(m、n)形状のデータセットがある場合、_axis=0
_を使用して、各特徴の期待値と分散を個別に計算する必要があることを示唆しているようです。 mはサンプルの数、nは特徴の数です。
編集3:別の例
おもちゃのデータセットでBatchNormalization
が計算している平均と分散の次元を確認したいと思いました。
_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>
_
入力Xの形状は(150、4)であり、BatchNormalization
レイヤーで計算された4の意味は、_axis=0
_で動作したことを意味します。
BatchNormalization
のデフォルトが_axis=-1
_である場合、150の手段があるべきではありませんか?
混乱は、axis
ではなく_np.mean
_でのBatchNormalization
の意味によるものです。
軸に沿って平均を取ると、その次元が縮小され、他のすべての次元が保持されます。あなたの例では、data.mean(axis=0)
はdata
の垂直寸法である_0-axis
_を折りたたみます。
軸に沿ってBatchNormalization
を計算するとき、配列の次元を保存し、平均値と標準偏差他のすべての軸で正規化します。したがって、あなたの_2D
_の例BatchNormalization
と_axis=1
_ isを使用すると、期待どおりに_axis=0
_の平均を減算します。これが_bn.moving_mean
_が_(4,)
_の形をしている理由です。
私はこの投稿が古いことを知っていますが、混乱がまだKerasのドキュメントに残っているため、まだ答えています。これを理解するためにコードを調べる必要がありました。
ミニバッチが行列の場合[〜#〜] a [〜#〜]mxn、つまりmサンプルおよびn機能、正規化軸はaxis = 0。あなたが言ったように、私たちが望むのは、すべての機能を個別に正規化することです、デフォルトのaxis = -1は畳み込み層で使用され、数字データセットの次元は通常(samples、width、height、channal)、 channal axis(最後の軸)でバッチサンプルが正規化されます。