Keras aprendendo taxa de não mudar apesar decadência em SGD

votos
10

Por alguma razão a minha taxa de aprendizagem não parece mudar eventhough I definir um fator de decaimento. Eu adicionei uma chamada de retorno para ver a taxa de aprendizagem e que parece ser o mesmo depois de cada época. Por que não mudar

class LearningRatePrinter(Callback):
    def init(self):
        super(LearningRatePrinter, self).init()

    def on_epoch_begin(self, epoch, logs={}):
        print('lr:', self.model.optimizer.lr.get_value())

lr_printer = LearningRatePrinter()

model = Sequential()
model.add(Flatten(input_shape = (28, 28)))
model.add(Dense(200, activation = 'tanh'))
model.add(Dropout(0.5))
model.add(Dense(20, activation = 'tanh'))
model.add(Dense(10, activation = 'softmax'))

print('Compiling Model')
sgd = SGD(lr = 0.01, decay = 0.1, momentum = 0.9, nesterov = True)
model.compile(loss = 'categorical_crossentropy', optimizer = sgd)
print('Fitting Data')
model.fit(x_train, y_train, batch_size = 128, nb_epoch = 400, validation_data = (x_test, y_test), callbacks = [lr_printer])


lr: 0.009999999776482582
Epoch 24/400
60000/60000 [==============================] - 0s - loss: 0.7580 - val_loss: 0.6539
lr: 0.009999999776482582
Epoch 25/400
60000/60000 [==============================] - 0s - loss: 0.7573 - val_loss: 0.6521
lr: 0.009999999776482582
Epoch 26/400
60000/60000 [==============================] - 0s - loss: 0.7556 - val_loss: 0.6503
lr: 0.009999999776482582
Epoch 27/400
60000/60000 [==============================] - 0s - loss: 0.7525 - val_loss: 0.6485
lr: 0.009999999776482582
Epoch 28/400
60000/60000 [==============================] - 0s - loss: 0.7502 - val_loss: 0.6469
lr: 0.009999999776482582
Epoch 29/400
60000/60000 [==============================] - 0s - loss: 0.7494 - val_loss: 0.6453
lr: 0.009999999776482582
Epoch 30/400
60000/60000 [==============================] - 0s - loss: 0.7483 - val_loss: 0.6438
lr: 0.009999999776482582
Epoch 31/400
Publicado 07/05/2016 em 16:42
fonte usuário
Em outras línguas...                            


1 respostas

votos
11

Isso está mudando muito bem, o problema é o campo que você está tentando acessar lojas taxa de aprendizagem inicial , não atual. Uma corrente é calculado a partir do zero durante cada iteração através equação

lr = self.lr * (1. / (1. + self.decay * self.iterations))

e isso nunca é armazenado , portanto, você não pode controlá-lo desta maneira, você simplesmente tem que calculá-lo em seu próprio país, usando esta equação.

ver linha: 126 de https://github.com/fchollet/keras/blob/master/keras/optimizers.py

Respondeu 07/05/2016 em 18:21
fonte usuário

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