2 votes

La normalisation par lots de Keras arrête la convergence

Je suis nouveau à keras et j'ai expérimenté diverses choses telles que BatchNormalization, mais cela ne fonctionne pas du tout. Lorsque la ligne BatchNormalization est commentée, elle converge vers une perte d'environ 0,04 ou mieux, mais avec la ligne telle quelle, elle converge vers 0,71 et reste bloquée à ce niveau.

from sklearn import preprocessing
from sklearn.datasets import load_boston
from keras.models import Model
from keras.layers import Input, Dense
from keras.layers.normalization import BatchNormalization
import keras.optimizers

boston = load_boston()

x = boston.data
y = boston.target

normx = preprocessing.scale(x)
normy = preprocessing.scale(y)

# doesnt construct output layer
def layer_looper(inputs, number_of_loops, neurons):
    inputs_copy = inputs
    for i in range(number_of_loops):

        inputs_copy = Dense(neurons, activation='relu')(inputs_copy)
        inputs_copy = BatchNormalization()(inputs_copy)

    return inputs_copy

inputs = Input(shape = (13,))

x = layer_looper(inputs, 40, 20)

predictions = Dense(1, activation='linear')(x)

model = Model(inputs=inputs, outputs=predictions)

opti = keras.optimizers.Adam(lr=0.0001)
model.compile(loss='mean_absolute_error', optimizer=opti, metrics=['acc'])

print(model.summary())

model.fit(normx, normy, epochs=5000, verbose=2, batch_size=128)

J'ai essayé d'expérimenter avec la taille des lots et l'optimiseur mais cela ne semble pas très efficace. Est-ce que je fais quelque chose de mal ?

1voto

Jakub Bartczuk Points 1166

J'ai augmenté le taux d'apprentissage à 0.01 et il semble que le réseau soit capable d'apprendre quelque chose (j'obtiens Epoch 1000/5000- 0s - loss: 0.2330 ) .

Je pense qu'il est utile de noter ce qui suit dans le résumé de l'original Normalisation par lots papier :

La normalisation par lots nous permet d'utiliser des taux d'apprentissage beaucoup plus élevés et de réduire les coûts. d'être moins prudent en matière d'initialisation. Elle agit également comme un régularisateur (...)

Cela laisse supposer une augmentation du taux d'apprentissage (c'est quelque chose que vous pourriez vouloir expérimenter).

Soyez conscient que puisqu'il fonctionne comme une régularisation, BatchNorm devrait aggraver votre perte d'apprentissage - cela est censé empêcher l'overfitting et donc réduire l'écart entre les erreurs d'apprentissage et de test/valide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X