199

Keras で BatchNormalization 関数を使用したい場合、最初に一度だけ呼び出す必要がありますか?

私はそれについてこのドキュメントを読みました: http://keras.io/layers/normalization/

どこに電話すればいいのかわからない。以下は、それを使用しようとしている私のコードです:

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)

バッチ正規化を含む 2 行目でコードを実行すると、2 行目なしでコードを実行すると、同様の出力が得られるためです。したがって、関数を適切な場所で呼び出していないか、それほど大きな違いはないと思います。

4

8 に答える 8

260

この質問にもう少し詳しく答えると、Pavel が言ったように、バッチ正規化は別のレイヤーにすぎないため、それをそのまま使用して、目的のネットワーク アーキテクチャを作成できます。

一般的な使用例は、ネットワーク内の線形層と非線形層の間で BN を使用することです。これは、活性化関数への入力を正規化し、活性化関数 (Sigmoid など) の線形セクションに集中できるようにするためです。ここでそれについての小さな議論があります

上記の場合、これは次のようになります。


# import BatchNormalization
from keras.layers.normalization import BatchNormalization

# instantiate model
model = Sequential()

# we can think of this chunk as the input layer
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the hidden layer    
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the output layer
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('softmax'))

# setting up the optimization of our weights 
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)

# running the fitting
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

これが物事をもう少し明確にすることを願っています。

于 2016-06-22T22:40:51.113 に答える
33

Keras はuse_bias=Falseオプションをサポートするようになったので、次のように書くことで計算を節約できます。

model.add(Dense(64, use_bias=False))
model.add(BatchNormalization(axis=bn_axis))
model.add(Activation('tanh'))

また

model.add(Convolution2D(64, 3, 3, use_bias=False))
model.add(BatchNormalization(axis=bn_axis))
model.add(Activation('relu'))
于 2016-12-29T07:42:36.713 に答える
33

レイヤーの後にレイヤーが続くConv2Dというのは、今ではほぼトレンドになっています。そこで、それらすべてを一度に呼び出す小さな関数を作成しました。モデルの定義がすっきりと読みやすくなります。ReLuBatchNormalization

def Conv2DReluBatchNorm(n_filter, w_filter, h_filter, inputs):
    return BatchNormalization()(Activation(activation='relu')(Convolution2D(n_filter, w_filter, h_filter, border_mode='same')(inputs)))
于 2016-12-14T16:02:37.207 に答える