Onde posso chamar a função BatchNormalization em Keras?

votos
70

Se eu quiser usar a função BatchNormalization em Keras, então eu preciso chamá-lo apenas uma vez no início?

Eu li esta documentação para ele: http://keras.io/layers/normalization/

Não vejo onde eu deveria chamá-lo. Abaixo está o meu código de tentar usá-lo:

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)

Eu pergunto porque se eu executar o código com a segunda linha, incluindo a normalização lote e se eu executar o código sem a segunda linha Recebo saídas semelhantes. Então, ou eu não estou chamando a função no lugar certo, ou eu acho que não faz muito de uma diferença.

Publicado 11/01/2016 em 05:47
fonte usuário
Em outras línguas...                            


7 respostas

votos
2

É um outro tipo de camada, então você deve adicioná-lo como uma camada em um local apropriado do seu modelo

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

Veja um exemplo aqui: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py

Respondeu 12/01/2016 em 16:31
fonte usuário

votos
102

Só para responder a esta pergunta em um pouco mais detalhadamente, e como disse Pavel, Lote A normalização é apenas uma outra camada, de modo que você pode usá-lo como tal para criar sua arquitetura de rede desejado.

O caso de uso geral é usar BN entre as camadas não-lineares linear e na sua rede, porque normaliza a entrada para a sua função de ativação, de modo que você está centrado na seção linear da função de ativação (como sigmóide). Há uma pequena discussão sobre isso aqui

No seu caso acima, isto pode parecer:


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

Espero que isso esclarece as coisas um pouco mais.

Respondeu 22/06/2016 em 21:40
fonte usuário

votos
17

É quase se tornou uma tendência agora ter um Conv2Dseguido por um ReLuseguido por uma BatchNormalizationcamada. Então eu fiz uma pequena função para chamar todos eles de uma vez. Faz a definição do modelo parecem muito mais limpo e mais fácil de ler.

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)))
Respondeu 14/12/2016 em 14:02
fonte usuário

votos
14

Keras agora suporta a use_bias=Falseopção, para que possamos salvar alguma computação escrevendo como

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

ou

model.add(Convolution2D(64, 3, 3, use_bias=False))
model.add(BatchNormalization(axis=bn_axis))
model.add(Activation('relu'))
Respondeu 29/12/2016 em 05:42
fonte usuário

votos
19

Esta discussão é enganosa. Tentou comentando sobre a resposta de Lucas Ramadã, mas não tem os privilégios corretos ainda, então eu vou colocar isso aqui.

Batch normalização funciona melhor após a função de ativação, e aqui ou aqui está o porquê: ele foi desenvolvido para evitar mudança covariável interno. Mudança covariável interna ocorre quando a distribuição das ativaçõesde uma camada muda significativamente ao longo da formação. Lote normalização é utilizado de modo que a distribuição das entradas (e estas entradas são literalmente o resultado de uma função de activação) para uma camada específica não se altera ao longo do tempo devido a alterações de parâmetros de cada lote (ou, pelo menos, permite-lhe mudar de uma forma vantajosa). Ele usa estatísticas de lote para fazer a normalização, e então usa o lote parâmetros de normalização (gama e beta no artigo original) "para se certificar de que a transformação inserido na rede pode representar transformar a identidade" (citação do artigo original). Mas o ponto é que estamos a tentar normalizar as entradas para uma camada, por isso deve sempre ir imediatamente antes da próxima camada na rede. Seja ou não esse'

Respondeu 10/08/2017 em 21:17
fonte usuário

votos
16

Esta discussão tem algum debate considerável sobre se BN deve ser aplicado antes de não-linearidade da camada atual ou para as ativações da camada anterior.

Embora não haja nenhuma resposta correta, os autores de Normalização Batch dizer que Ele deve ser aplicado imediatamente antes da não-linearidade da camada atual. A razão (citado a partir de papel original) -

"Nós adicionamos o BN transformar imediatamente antes a não-linearidade, normalizando x = Wu + b. Poderíamos ter também normalizou as entradas camada u, mas desde que u é provável a saída de outro não-linearidade, a forma de sua distribuição é susceptível de alterar durante treinamento e restringindo seus primeiro e segundo momentos não eliminaria a mudança covariável. Em contraste, Wu + b é mais propensos a ter uma simétrica, a distribuição não-escasso, que é “mais Gaussian” (HYVÄRINEN & Oja, 2000) ; normalização é susceptível de produzir activações com uma distribuição estável ".

Respondeu 20/08/2017 em 11:54
fonte usuário

votos
1

Lote A normalização é utilizada para normalizar a camada de entrada, bem como camadas escondidas por ajustamento significativo e dimensionamento das activações. Devido a este efeito normalizador com camada adicional em redes neurais profundas, a rede pode usar mais elevada taxa de aprendizagem sem desaparecendo ou explodindo gradientes. Além disso, a normalização lote regulariza a rede de tal forma que é mais fácil generalizar, e é assim desnecessário o uso de abandono para mitigar overfitting.

Logo após o cálculo da função linear usando digamos, a Denso () ou Conv2D () in Keras, usamos BatchNormalization (), que calcula a função linear em uma camada e então nós adicionamos a não-linearidade para a camada usando Activation ().

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)

Como é Batch Normalização aplicado?

Suponhamos que temos uma entrada de [L-1] a uma camada de l. Também temos pesos W [L] e unidade de polarização b [l] para a camada L. Deixe um [l] é o vector de activação calculada (isto é, após adição do não-linearidade) para a camada L e z [l] ser o vector antes da adição de não-linearidade

  1. Usando um [L-1] e W [l] podemos calcular z [l] para a camada L
  2. Normalmente, na propagação de alimentação para a frente que irá adicionar unidade de polarização para o z [l], nesta fase, como este z [l] + b [l], mas em lote de normalização, não é necessário este passo de adição de b [L] e nenhuma b [l] parâmetro é utilizado.
  3. Calcular z [l] significa e subtrai-lo a partir de cada elemento
  4. Divide (z [l] - média) utilizando o desvio padrão. Chamá-lo Z_temp [l]
  5. Agora definir novos parâmetros g e β que vai mudar a escala da camada oculta da seguinte forma:

    z_norm [l] = γ.Z_temp [l] + β

Neste trecho de código, a densa () leva a um [L-1], usa W [L] e calcula z [l]. Em seguida, o BatchNormalization imediato () irá executar as etapas acima para dar z_norm [l]. E, em seguida, a activação imediata () vai calcular tanh (z_norm [l]) para dar um [l] ou seja

a[l] = tanh(z_norm[l])
Respondeu 09/04/2019 em 07:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more