Se eu quiser usar a função BatchNormalization no Keras, preciso chamá-la apenas uma vez no início?
Eu li esta documentação para ele: http://keras.io/layers/normalization/
Não vejo para onde devo chamá-lo. Abaixo está o meu código tentando 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 em lote, e se eu executar o código sem a segunda linha, obterei resultados semelhantes. Então, ou eu não estou chamando a função no lugar certo, ou acho que não faz muita diferença.
Este tópico é enganoso. Tentei comentar a resposta de Lucas Ramadan, mas ainda não tenho os privilégios corretos, então vou colocar isso aqui.
A normalização de lotes funciona melhor após a função de ativação, e é aqui ou aqui o porquê: foi desenvolvida para impedir o deslocamento covariável interno. O deslocamento covariável interno ocorre quando a distribuição das ativaçõesde uma camada muda significativamente durante o treinamento. A normalização de lote é usada para que a distribuição das entradas (e essas entradas sejam literalmente o resultado de uma função de ativação) para uma camada específica não seja alterada ao longo do tempo devido às atualizações de parâmetros de cada lote (ou pelo menos, permita que seja alterada de uma maneira vantajosa). Ele usa estatísticas de lote para fazer a normalização e, em seguida, usa os parâmetros de normalização de lote (gama e beta no artigo original) "para garantir que a transformação inserida na rede possa representar a transformação de identidade" (citação do artigo original). Mas o ponto é que estamos tentando normalizar as entradas para uma camada, por isso sempre deve ocorrer imediatamente antes da próxima camada na rede. Se isso é ou não '
fonte
g(BN(Wx + b))
ondeg
está a função de ativação.Este tópico tem um debate considerável sobre se o BN deve ser aplicado antes da não linearidade da camada atual ou sobre as ativações da camada anterior.
Embora não haja uma resposta correta, os autores da Normalização em lote dizem que ela deve ser aplicada imediatamente antes da não linearidade da camada atual. O motivo (citado no artigo original) -
fonte
O Keras agora suporta a
use_bias=False
opção, para que possamos economizar algum cálculo escrevendo comoou
fonte
model.add(BatchNormalization())
diferente demodel.add(BatchNormalization(axis=bn_axis))
tensorflow
como back-end. Está escrito aqui porque ele copiou isso dokeras.applications
módulo, ondebn_axis
precisa ser especificado para suportar os formatoschannels_first
e os doischannels_last
.É quase uma tendência agora ter um
Conv2D
seguido por umReLu
seguido por umaBatchNormalization
camada. Então, criei uma pequena função para chamar todos eles de uma vez. Faz com que a definição do modelo pareça muito mais limpa e fácil de ler.fonte
Como é outro tipo de camada, adicione-a como uma camada em um local apropriado do seu modelo
Veja um exemplo aqui: https://github.com/fchollet/keras/blob/master/examples/kaggle_otto_nn.py
fonte
A Normalização de lote é usada para normalizar a camada de entrada e as camadas ocultas, ajustando a média e o dimensionamento das ativações. Devido a esse efeito de normalização com camada adicional em redes neurais profundas, a rede pode usar uma taxa de aprendizado mais alta sem desaparecer ou explodir gradientes. Além disso, a normalização em lote regulariza a rede de modo que seja mais fácil generalizar e, portanto, é desnecessário usar a eliminação para reduzir o excesso de ajuste.
Logo após calcular a função linear usando, por exemplo, Dense () ou Conv2D () em Keras, usamos BatchNormalization () que calcula a função linear em uma camada e, em seguida, adicionamos a não linearidade à camada usando Ativação ().
Como a Normalização de Lote é aplicada?
Suponha que introduzimos a [l-1] em uma camada l. Também temos pesos W [l] e unidade de viés b [l] para a camada l. Seja a [l] o vetor de ativação calculado (isto é, após adicionar a não linearidade) para a camada l e z [l] seja o vetor antes de adicionar a não linearidade
Agora defina novos parâmetros γ e β que mudarão a escala da camada oculta da seguinte maneira:
z_norm [l] = γ.Z_temp [l] + β
Neste trecho de código, Denso () pega a [l-1], usa W [l] e calcula z [l]. Em seguida, o BatchNormalization () imediato executará as etapas acima para fornecer z_norm [l]. E então a Ativação imediata () calculará tanh (z_norm [l]) para dar um [l] ie
fonte