Где я могу вызвать функцию BatchNormalization в Керасе?

Если я хочу использовать функцию 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)

Я спрашиваю, потому что, если я запускаю код со второй строкой, включая пакетную нормализацию, и если я запускаю код без второй строки, я получаю аналогичные результаты. Так что я либо не вызываю функцию в нужном месте, либо думаю, что это не так уж важно.

104 голоса | спросил pr338 11 Jam1000000amMon, 11 Jan 2016 10:47:53 +030016 2016, 10:47:53

6 ответов


0

Просто для того, чтобы ответить на этот вопрос немного подробнее, и, как сказал Павел, Batch Normalization - это просто еще один уровень, поэтому вы можете использовать его как таковой для создания желаемой сетевой архитектуры.

Общий вариант использования заключается в использовании BN между линейным и нелинейным слоями в вашей сети, поскольку он нормализует входные данные для вашей функции активации, так что вы центрируетесь в линейном участке функции активации (например, сигмовидной). здесь есть небольшая дискуссия здесь

В приведенном выше случае это может выглядеть следующим образом:


# 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)

Надеюсь, это прояснит ситуацию немного подробнее.

ответил Lucas Ramadan 23 J0000006Europe/Moscow 2016, 01:40:51
0

Эта тема вводит в заблуждение. Пытался комментировать ответ Лукаса Рамадана, но у меня пока нет нужных привилегий, поэтому я просто выложу это здесь.

Пакетная нормализация работает лучше всего после функции активации, и здесь или здесь , поэтому: он был разработан для предотвращения внутреннего смещения ковариат. Внутренний ковариатный сдвиг происходит, когда распределение активаций слоя существенно изменяется в течение обучения. Пакетная нормализация используется для того, чтобы распределение входов (а эти входы были буквально результатом функции активации) по конкретному слою не изменялось со временем из-за обновлений параметров из каждого пакета (или, по крайней мере, позволяло его изменять выгодно). Он использует статистику по партиям для нормализации, а затем использует параметры нормализации по партиям (гамма и бета в оригинальном документе), «чтобы убедиться, что преобразование, вставленное в сеть, может представлять преобразование идентичности» (цитата из оригинального документа). Но дело в том, что мы пытаемся нормализовать входные данные для слоя, поэтому он всегда должен идти непосредственно перед следующим слоем в сети. Будет ли это после активации, зависит от рассматриваемой архитектуры.

ответил jmancuso 11 AM00000010000002431 2017, 01:17:24
0

В этой ветке ведутся серьезные дебаты о том, следует ли применять BN перед нелинейностью текущего слоя или активациями предыдущего слоя.

Хотя правильного ответа нет, авторы Batch Normalization говорят, что Его следует применять непосредственно перед нелинейностью текущего слоя. Причина (цитата из оригинальной статьи) -

  

«Мы добавляем преобразование BN непосредственно перед   нелинейность, нормализуя x = Wu + b. Мы могли бы иметь   также нормализовал входы слоя u, но так как u, вероятно,   вывод другой нелинейности, форма ее распределения   может измениться во время обучения, и   его первый и второй моменты не устранят ковариату   сдвиг. В отличие от этого, Wu + B, скорее всего,   симметричное, не разреженное распределение, которое является «более гауссовым»   (Hyv¨arinen & Oja, 2000); нормализуя это, вероятно,   производить активации со стабильным распределением. "

ответил user12340 20 PM00000030000000231 2017, 15:54:02
0

Сейчас почти стало тенденцией иметь Conv2D, за которым следует ReLu, за которым следует слой BatchNormalization. Поэтому я создал небольшую функцию, чтобы вызывать их все сразу. Делает определение модели намного понятнее и легче для чтения.

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)))
ответил stochastic_zeitgeist 14 WedEurope/Moscow2016-12-14T19:02:37+03:00Europe/Moscow12bEurope/MoscowWed, 14 Dec 2016 19:02:37 +0300 2016, 19:02:37
0

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'))
ответил dontloo 29 ThuEurope/Moscow2016-12-29T10:42:36+03:00Europe/Moscow12bEurope/MoscowThu, 29 Dec 2016 10:42:36 +0300 2016, 10:42:36
0

Это другой тип слоя, поэтому вы должны добавить его в качестве слоя в соответствующем месте вашей модели

model.add(keras.layers.normalization.BatchNormalization())

См. пример здесь: https://github.com/fchollet /keras/blob/master/examples/kaggle_otto_nn.py

ответил Pavel Surmenok 12 Jpm1000000pmTue, 12 Jan 2016 21:31:08 +030016 2016, 21:31:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132