Die Stapelnormalisierung wird verwendet, um sowohl die Eingabeebene als auch die ausgeblendeten Ebenen zu normalisieren, indem der Mittelwert und die Skalierung der Aktivierungen angepasst werden. Aufgrund dieses Normalisierungseffekts mit zusätzlicher Schicht in tiefen neuronalen Netzen kann das Netzwerk eine höhere Lernrate verwenden, ohne Gradienten zu verschwinden oder zu explodieren. Darüber hinaus reguliert die Batch-Normalisierung das Netzwerk so, dass es einfacher zu verallgemeinern ist, und es ist daher nicht erforderlich, Dropout zu verwenden, um eine Überanpassung zu verringern.
Unmittelbar nach der Berechnung der linearen Funktion mit Dense () oder Conv2D () in Keras verwenden wir BatchNormalization (), das die lineare Funktion in einer Ebene berechnet, und fügen dann die Nichtlinearität mit Layivation () zur Ebene hinzu.
from keras.layers.normalization import BatchNormalization
model = Sequential()
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
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)
Wie wird die Chargennormalisierung angewendet?
Angenommen, wir haben ein [l-1] in eine Ebene l eingegeben. Wir haben auch Gewichte W [l] und Vorspannungseinheit b [l] für die Schicht l. Sei a [l] der Aktivierungsvektor, der für die Schicht l berechnet wird (dh nach dem Hinzufügen der Nichtlinearität), und z [l] der Vektor vor dem Hinzufügen der Nichtlinearität
- Mit a [l-1] und W [l] können wir z [l] für die Schicht l berechnen
- Normalerweise fügen wir bei der Vorwärtsausbreitung in diesem Stadium eine Vorspannungseinheit zum z [l] hinzu, wie z [l] + b [l], aber bei der Chargennormalisierung ist dieser Schritt der Addition von b [l] nicht erforderlich und nein Der Parameter b [l] wird verwendet.
- Berechnen Sie die Mittelwerte für z [l] und subtrahieren Sie sie von jedem Element
- Teilen Sie (z [l] - Mittelwert) mit der Standardabweichung. Nenne es Z_temp [l]
Definieren Sie nun die neuen Parameter γ und β, die den Maßstab der verborgenen Schicht wie folgt ändern:
z_norm [l] = γ.Z_temp [l] + β
In diesem Code-Auszug nimmt Dense () das a [l-1], verwendet W [l] und berechnet z [l]. Dann führt die sofortige BatchNormalization () die obigen Schritte aus, um z_norm [l] zu erhalten. Und dann berechnet die sofortige Aktivierung () tanh (z_norm [l]), um ein [l] zu ergeben
a[l] = tanh(z_norm[l])