Если я хочу использовать функцию BatchNormalization в Keras, то нужно ли вызывать ее один раз только в начале?
Я прочитал эту документацию для этого: 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)
Я спрашиваю, потому что, если я запускаю код со второй строкой, включая пакетную нормализацию, и если я запускаю код без второй строки, я получаю аналогичные результаты. Так что либо я не вызываю функцию в нужном месте, либо думаю, что это не имеет большого значения.
Эта тема вводит в заблуждение. Пробовал комментировать ответ Лукаса Рамадана, но у меня пока нет нужных привилегий, поэтому я просто выложу это здесь.
Пакетная нормализация работает лучше всего после функции активации, и здесь или здесь почему: она была разработана для предотвращения внутреннего смещения ковариат. Внутренний ковариатный сдвиг происходит при распределении активацийслоя значительно смещается на протяжении всего обучения. Пакетная нормализация используется для того, чтобы распределение входов (а эти входы были буквально результатом функции активации) по конкретному слою не изменялось со временем из-за обновлений параметров из каждого пакета (или, по крайней мере, позволяло его изменять выгодно). Он использует статистику по партиям для нормализации, а затем использует параметры нормализации по партиям (гамма и бета в оригинальном документе), «чтобы убедиться, что преобразование, вставленное в сеть, может представлять преобразование идентичности» (цитата из оригинального документа). Но дело в том, что мы пытаемся нормализовать входные данные для слоя, поэтому он всегда должен идти непосредственно перед следующим слоем в сети. Или нет?
источник
g(BN(Wx + b))
гдеg
функция активации.В этой ветке ведутся серьезные дебаты о том, следует ли применять BN до нелинейности текущего слоя или для активаций предыдущего слоя.
Хотя нет правильного ответа, авторы Batch Normalization говорят, что он должен быть применен непосредственно перед нелинейностью текущего слоя. Причина (цитата из оригинальной статьи) -
источник
Keras теперь поддерживает эту
use_bias=False
опцию, поэтому мы можем сохранить некоторые вычисления, написавили
источник
model.add(BatchNormalization())
отличается отmodel.add(BatchNormalization(axis=bn_axis))
tensorflow
качестве бэкэнда. Это написано здесь, потому что он скопировал это изkeras.applications
модуля, гдеbn_axis
нужно указать, чтобы поддерживать обаchannels_first
иchannels_last
форматы.Это почти стала тенденцией теперь имеет
Conv2D
сопровождаемуюReLu
последующийBatchNormalization
слой. Поэтому я создал небольшую функцию, чтобы вызывать их все сразу. Делает определение модели намного понятнее и легче для чтения.источник
Это другой тип слоя, поэтому вы должны добавить его в качестве слоя в соответствующем месте вашей модели
Смотрите пример здесь: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py
источник
Пакетная нормализация используется для нормализации входного слоя, а также скрытых слоев, путем регулировки среднего и масштабирования активаций. Из-за этого нормализующего эффекта с дополнительным слоем в глубоких нейронных сетях сеть может использовать более высокую скорость обучения без исчезновения или взрыва градиентов. Кроме того, пакетная нормализация упорядочивает сеть так, что ее легче обобщать, и, таким образом, нет необходимости использовать отсев для уменьшения перегрузки.
Сразу после вычисления линейной функции, скажем, Dense () или Conv2D () в Keras, мы используем BatchNormalization (), которая вычисляет линейную функцию в слое, а затем мы добавляем нелинейность в слой, используя Activation ().
Как применяется нормализация партии?
Предположим, мы ввели слой [l-1] в слой l. Также мы имеем веса W [l] и единицу смещения b [l] для слоя l. Пусть a [l] будет вектором активации, рассчитанным (т.е. после добавления нелинейности) для слоя l, а z [l] будет вектором до добавления нелинейности
Теперь определите новые параметры γ и β, которые изменят масштаб скрытого слоя, следующим образом:
z_norm [l] = γ.Z_temp [l] + β
В этом фрагменте кода Dense () принимает a [l-1], использует W [l] и вычисляет z [l]. Затем немедленная BatchNormalization () выполнит вышеуказанные шаги, чтобы получить z_norm [l]. И тогда немедленная Activation () вычислит tanh (z_norm [l]), чтобы получить [l], т.е.
источник