def scheduler(epoch): # 每隔100个epoch,学习率减小为原来的1/10 if epoch % 5 == 0 and epoch != 0: lr = K.get_value(model.optimizer.lr) K.set_value(model.optimizer.lr, lr * 0.2) print("lr changed to {}".format(lr * 0.2)) return K.get_value(model.optimizer.lr)
def on_epoch_end(self, epoch, logs=None): p, r, f1 = evaluate(valid_generator) if f1 > self.best_f1: self.best_f1 = f1 model.save_weights('best_model_fcqa_layer_unlabel_2.weights') else: #调整学习速率 lr = K.get_value(model.optimizer.lr) print("第{}epoch的lr为{}".format(epoch, lr)) K.set_value(model.optimizer.lr, lr * 0.5) lr = K.get_value(model.optimizer.lr) print("第{}epoch的{}".format(epoch, lr)) print(u'val_p: %.5f, val_r: %.5f, val_f1:%.5f, best_f1: %.5f\n' % (p, r, f1, self.best_f1))
def on_epoch_end(self, epoch, logs=None): lr = K.get_value(self.model.optimizer.lr) trans = K.eval(self.CRF.trans) self.NER.trans = trans # print(NER.trans) f1, precision, recall = evaluate(self.valid_data, self.NER, self.model) if f1 >= self.best_val_f1: # 取得新的最优f1, 更新最优f1, 保存模型 self.best_val_f1 = f1 self.model.save_weights(self.model_save_to) print('F1: %.5f, P: %.5f, R: %.5f, best f1: %.5f, lr: %.6f\n' % (f1, precision, recall, self.best_val_f1, lr)) if True: # 学习率调整策略0(学习率逐步降低0.3,当学习率接近0时,固定学习率) if lr * 0.7 > 0.000001: K.set_value(self.model.optimizer.lr, lr * 0.7) if False: # 学习率调整策略1(学习率逐步降低0.3,当学习率接近0时,重置学习率) if lr * 0.7 >= 0.000001: K.set_value(self.model.optimizer.lr, lr * 0.7) else: K.set_value(self.model.optimizer.lr, 1e-4) if False: # 学习率调整策略2(若f1降低, 则降低学习率, 当学习率接近0时,重置学习率) if f1 >= self.pre_f1: # 若f1 优于上一轮,重置早停, bad_count和patience计数器 self.scheduler_patience = 1 self.early_stop_patience = 3 self.bad_count = 3 else: self.scheduler_patience -= 1 self.early_stop_patience -= 1 self.bad_count -= 1 if self.early_stop_patience == 0: pass # 去除早停 exit() # 若f1比上一轮的结果差,则降低学习率 if self.scheduler_patience == 0: # 若学习率过低, 则重置学习率 if lr * 0.7 >= 0.000001: K.set_value(self.model.optimizer.lr, lr * 0.7) else: K.set_value(self.model.optimizer.lr, 1e-4) # 调整后,重置patience计数器 self.scheduler_patience = 1 if self.bad_count == 0: K.set_value(self.model.optimizer.lr, 1e-4) # 调整后,重置bad_count计数器 self.bad_count = 3 # 更新pre_f1 self.pre_f1 = f1
def on_epoch_begin(self, epoch, logs=None): print("learn-rate: {}".format(K.get_value(self.model.optimizer.lr)))