2016-05-07 12 views
9

По какой-то причине скорость обучения не изменяется, хотя я устанавливаю коэффициент распада. Я добавил обратный вызов, чтобы просмотреть скорость обучения, и, похоже, будет одинаково после каждой эпохи. Почему не меняетсяСкорость обучения Keras не меняется, несмотря на спад в 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 

ответ

10

Это меняется очень хорошо, проблема заключается в поле вы пытаетесь магазинов доступа начальная скорость обучения, не тока один. Текущий один рассчитывается с нуля на каждой итерации с помощью уравнения

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

и он никогда не хранится, таким образом, вы не можете контролировать это таким образом, вы просто вычислить его по своему усмотрению, с помощью этого уравнения.

см. Строку: 126 из https://github.com/fchollet/keras/blob/master/keras/optimizers.py

Смежные вопросы