2016-10-20 5 views
0

Ich habe versucht, die Lernrate in der Mini-Batch-Gradienten-Abstieg zu drucken. Aber die Ir bleiben für viele Epochen unverändert (immer 0.10000000149). Aber es wurde angenommen, dass alle Mini-Chargen geändert werden. Der Code lautet wie folgt:Drucken Lernrate Evary Epoche in Sgd

# set the decay as 1e-1 to see the Ir change between epochs. 
sgd = SGD(lr=0.1, decay=1e-1, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', 
       optimizer=sgd, 
       metrics=['accuracy']) 
class LossHistory(Callback): 
    def on_epoch_begin(self, batch, logs={}): 
     lr=self.model.optimizer.lr.get_value() 
     print('Ir:', lr) 
history=LossHistory() 
model.fit(X_train, Y_train, 
      batch_size= batch_size, 
      nb_epoch= nb_epoch, 
      callbacks= [history]) 

Antwort

1

Was Sie drucken die anfängliche Lernrate ist, nicht die tatsächliche eine, die auf dem Sprung berechnet:

lr = self.lr * (1./(1. + self.decay * self.iterations)) 
0
from keras import backend as K 

class SGDLearningRateTracker(Callback): 
    def on_epoch_end(self, epoch, logs={}): 
     optimizer = self.model.optimizer 
     lr = K.eval(optimizer.lr * (1./(1. + optimizer.decay * optimizer.iterations))) 
     print('\nLR: {:.6f}\n'.format(lr)) 

Dann in Ihrem Modell der hinzufügen Rückruf:

model.fit(X_train, Y_train_cat, nb_epoch=params['n_epochs'], batch_size=params['batch_size'], validation_split=0.1,callbacks=[SGDLearningRateTracker()]) 
Verwandte Themen