2016-05-07 8 views
9

Aus irgendeinem Grund scheint sich meine Lernrate nicht zu ändern, obwohl ich einen Abklingfaktor einstelle. Ich habe einen Rückruf hinzugefügt, um die Lernrate anzuzeigen, und es scheint nach jeder Epoche gleich zu sein. Warum ist es nicht zu ändernKeras Lernrate ändert sich trotz Verfall in SGD

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 

Antwort

10

Dieser Wechsel ist ganz gut, ist das Problem, das Feld, das Sie für den Zugriff speichert versuchen anfängliche Lernrate, nicht aktuelle. Aktuelle man von Grund auf während jeder Iteration durch Gleichung berechnet

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

und es wird nie gespeichert, so können Sie es auf diese Weise nicht überwachen, müssen Sie einfach berechnen es auf eigene Faust, diese Gleichung.

siehe Zeile: 126 von https://github.com/fchollet/keras/blob/master/keras/optimizers.py