【tensorflow2.0】回调函数callbacks
tf.keras的回调函数实际上是一个类,一般是在model.fit时作为参数指定,用于控制在训练过程开始或者在训练过程结束,在每个epoch训练开始或者训练结束,在每个batch训练开始或者训练结束时执行一些操作,例如收集一些日志信息,改变学习率等超参数,提前终止训练过程等等。 同样地,针对model.evaluate或者model.predict也可以指定callbacks参数,用于控制在评估或预测开始或者结束时,在每个batch开始或者结束时执行一些操作,但这种用法相对少见。 大部分时候,keras.callbacks子模块中定义的回调函数类已经足够使用了,如果有特定的需要,我们也可以通过对keras.callbacks.Callbacks实施子类化构造自定义的回调函数。 所有回调函数都继承至 keras.callbacks.Callbacks基类,拥有params和model这两个属性。 其中params 是一个dict,记录了 training parameters (eg. verbosity,batch size,number of epochs...). model即当前关联的模型的引用。 此外,对于回调类中的一些方法如on_epoch_begin,on_batch_end,还会有一个输入参数logs,提供有关当前epoch或者batch的一些信息,并能够记录计算结果,如果model.fit指定了多个回调函数类,这些logs变量将在这些回调函数类的同名函数间依顺序传递。 一,内置回调函数
二,自定义回调函数可以使用callbacks.LambdaCallback编写较为简单的回调函数,也可以通过对callbacks.Callback子类化编写更加复杂的回调函数逻辑。 如果需要深入学习tf.Keras中的回调函数,不要犹豫阅读内置回调函数的源代码。 import numpy as np pandas as pd tensorflow as tf from tensorflow.keras layers,models,losses,metrics,callbacks tensorflow.keras.backend as K # 示范使用LambdaCallback编写较为简单的回调函数 json json_log = open('./data/keras_log.json',mode=wt) json_logging_callback = callbacks.LambdaCallback( on_epoch_end=lambda epoch,logs: json_log.write( json.dumps(dict(epoch = epoch,**logs)) + n'),on_train_end= logs: json_log.close() ) 示范通过Callback子类化编写回调函数(LearningRateScheduler的源代码) class LearningRateScheduler(callbacks.Callback): def __init__(self,schedule,verbose=0): super(LearningRateScheduler,self).__init__() self.schedule = schedule self.verbose = verbose def on_epoch_begin(self,epoch,logs=None): if not hasattr(self.model.optimizer,lr): raise ValueError(Optimizer must have a "lr" attribute.) try: lr = float(K.get_value(self.model.optimizer.lr)) lr = self.schedule(epoch,lr) except TypeError: Support for old API for backward compatibility lr = self.schedule(epoch) not isinstance(lr,(tf.Tensor,float,np.float32,np.float64)): The output of the "schedule" function ' should be float.if isinstance(lr,ops.Tensor) and lr.dtype.is_floating: The dtype of Tensor should be float) K.set_value(self.model.optimizer.lr,K.get_value(lr)) if self.verbose > 0: print(nEpoch %05d: LearningRateScheduler reducing learning ' rate to %s.' % (epoch + 1,lr)) def on_epoch_end(self,1)">None): logs = logs or {} logs['] = K.get_value(self.model.optimizer.lr) ? 参考: 开源电子书地址:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/ GitHub 项目地址:https://github.com/lyhue1991/eat_tensorflow2_in_30_days (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |