我尝试了几种方法来显示在Keras上一个时期有效使用的模型的学习率。
一些研究表明,可以使用回调更改学习率,或使用自定义指标显示学习率。 但是显示的学习率始终是原始学习率,无论我尝试什么方法。
某些答案意味着根据公式重新计算费率应该是多少。但我想要的只是获得用于反向传播的学习率,而不是根据算法进行计算。
以下是我使用的一些代码:
callback_list = []
metric_list = ['accuracy']
# Add checkpoints to save weights in case the test set acc improved
#...
if show_learn_param:
learn_param = Callback_show_learn_param()
callback_list.append(learn_param)
# Add metric if needed
def get_lr_metric(optimizer):
def lr(y_true, y_pred):
return optimizer.lr #K.eval(optimizer.lr)
return lr
lr_metric = get_lr_metric(optimizer)
metric_list.append(lr_metric)
以下是回调的定义:
class Callback_show_learn_param(Callback):
def on_epoch_end(self, epoch, logs=None):
lr = self.model.optimizer.lr
decay = self.model.optimizer.decay
iterations = self.model.optimizer.iterations
lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay)))
# Beta values
beta_1=self.model.optimizer.beta_1
beta_2=self.model.optimizer.beta_2
print("lr", K.eval(lr), "decay", K.eval(decay), "lr_with_decay", K.eval(lr_with_decay),
"beta_1", K.eval(beta_1), "beta_2", K.eval(beta_2))
基本上,显示的值是常量,不会改变。它对β值和衰变都有意义。显示的学习率似乎是最初的学习率。对于学习率,我找不到显示这个简单值的方法:真正使用的有效学习率。
BTW有一种更简单的方式来显示这种初始学习率:
import keras.backend as K
print(K.eval(model.optimizer.lr))
答案 0 :(得分:0)
您需要使用K.get_value
来获取学习率。看看LearningRateScheduler以及该回调如何从模型中获得学习率。在您的情况下,您应该能够打印学习率:
def on_epoch_end(self, epoch, logs=None):
lr = float(K.get_value(self.model.optimizer.lr))
print("Learning rate:", lr)