Jeśli chcę użyć funkcji BatchNormalization w Keras, czy muszę wywoływać ją tylko raz na początku?
Przeczytałem do tego dokumentację: http://keras.io/layers/normalization/
Nie wiem, gdzie mam to nazywać. Poniżej znajduje się mój kod, który próbuje go użyć:
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)
Pytam, ponieważ jeśli uruchomię kod z drugą linią zawierającą normalizację wsadową i jeśli uruchomię kod bez drugiej linii, otrzymam podobne wyniki. Więc albo nie wywołuję funkcji we właściwym miejscu, albo myślę, że nie robi to dużej różnicy.
Ten wątek jest mylący. Próbowałem skomentować odpowiedź Lucasa Ramadana, ale nie mam jeszcze odpowiednich uprawnień, więc po prostu wstawię to tutaj.
Normalizacja wsadowa działa najlepiej po funkcji aktywacji, a tutaj lub tutaj jest dlaczego: została opracowana, aby zapobiec wewnętrznemu przesunięciu współzmiennej. Wewnętrzne przesunięcie współzmienne występuje, gdy rozkład aktywacjiwarstwy zmienia się znacznie podczas treningu. Normalizacja wsadowa jest stosowana tak, aby dystrybucja danych wejściowych (a te dane wejściowe są dosłownie wynikiem funkcji aktywacji) do określonej warstwy nie zmienia się w czasie z powodu aktualizacji parametrów z każdej partii (lub przynajmniej pozwala na zmianę w korzystny sposób). Wykorzystuje statystykę wsadową do normalizacji, a następnie wykorzystuje parametry normalizacji wsadowej (gamma i beta w oryginalnym artykule) ", aby upewnić się, że transformacja wstawiona do sieci może reprezentować transformację tożsamości" (cytat z oryginalnego artykułu). Ale chodzi o to, że staramy się znormalizować dane wejściowe do warstwy, więc zawsze powinno to następować bezpośrednio przed następną warstwą w sieci. Czy to ”
źródło
g(BN(Wx + b))
, gdzieg
jest funkcja aktywacji.W tym wątku toczy się poważna debata na temat tego, czy BN powinno być stosowane przed nieliniowością bieżącej warstwy, czy też do aktywacji poprzedniej warstwy.
Chociaż nie ma poprawnej odpowiedzi, autorzy Normalizacji wsadowej twierdzą, że należy ją zastosować bezpośrednio przed nieliniowością bieżącej warstwy. Powód (cytat z oryginalnego artykułu) -
źródło
Keras obsługuje teraz tę
use_bias=False
opcję, więc możemy zaoszczędzić trochę obliczeń, pisząc likelub
źródło
model.add(BatchNormalization())
różni się odmodel.add(BatchNormalization(axis=bn_axis))
tensorflow
jako zaplecza. Jest napisane tutaj, ponieważ skopiował to zkeras.applications
modułu, gdziebn_axis
musi być określone, aby obsługiwać oba formatychannels_first
ichannels_last
.Niemal trend stał się teraz, gdy
Conv2D
po aReLu
następuje poBatchNormalization
warstwie. Dlatego stworzyłem małą funkcję, aby wywołać je wszystkie naraz. Sprawia, że definicja modelu wygląda na dużo czystszą i łatwiejszą do odczytania.źródło
Jest to inny rodzaj warstwy, dlatego warto dodać ją jako warstwę w odpowiednim miejscu modelu
Zobacz przykład tutaj: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py
źródło
Normalizacja wsadowa służy do normalizacji warstwy wejściowej oraz warstw ukrytych poprzez dostosowanie średniej i skalowania aktywacji. Ze względu na ten efekt normalizujący z dodatkową warstwą w głębokich sieciach neuronowych, sieć może używać wyższego tempa uczenia się bez zanikania lub eksplozji gradientów. Ponadto normalizacja wsadowa reguluje sieć w taki sposób, że łatwiej jest uogólniać, a zatem nie jest konieczne stosowanie przerywania w celu złagodzenia nadmiernego dopasowania.
Zaraz po obliczeniu funkcji liniowej za pomocą, powiedzmy, Dense () lub Conv2D () w Keras, używamy BatchNormalization (), które oblicza funkcję liniową w warstwie, a następnie dodajemy nieliniowość do warstwy za pomocą Activation ().
W jaki sposób stosowana jest normalizacja wsadowa?
Załóżmy, że wprowadziliśmy [l-1] do warstwy l. Mamy również wagi W [l] i jednostkę odchylenia b [l] dla warstwy l. Niech a [l] będzie wektorem aktywacji (tj. Po dodaniu nieliniowości) dla warstwy l i z [l] będzie wektorem przed dodaniem nieliniowości
Teraz zdefiniuj nowe parametry γ i β, które zmienią skalę ukrytej warstwy w następujący sposób:
z_norm [l] = γ.Z_temp [l] + β
W tym fragmencie kodu Dense () przyjmuje a [l-1], używa W [l] i oblicza z [l]. Następnie natychmiastowa BatchNormalization () wykona powyższe kroki, aby uzyskać z_norm [l]. Następnie natychmiastowa Activation () obliczy tanh (z_norm [l]), aby dać [l] ie
źródło