回调函数是一个函数的集合,会在训练阶段中使用。一般使用回调函数来查看训练模型的内在状态和统计信息。
使用方法:传递一个列表的回调函数名称作为callbacks关键字到Sequential或Model类型的…fit()方法。在训练时,相应的回调函数的方法就会在各自的阶段被调用。
编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会给自己写的库留下一些接口,即API(application programming interface,应用编程接口),以供应用程序员使用。所以在抽象层的图示里,库位于应用的底下。当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。
下面介绍几种常见的回调函数的用法
在模型的训练过程中,常常需要根据训练状态动态调整学习速率。当然本身可自动调整学习速率的优化器,如:Adagrad、Adadelta、RMSprop、Adam等除外。
具体的,Keras提供了两种调整学习速率的方法:
keras.callbacks.callbacks.LearningRateScheduler(schedule, verbose=0)
示例
import keras.backend as K # backend 作为获取设置学习速率的工具
from keras.callbacks import LearningRateScheduler
def scheduler(epoch):
# 每隔100个epoch,学习速率减小为原来的1/10
if epoch % 100 == 0 and epoch != 0:
lr = K.get_value(model.optimizer.lr)
K.set_value(model.optimizer.lr, lr * 0.1)
return K.get_value(model.optimizer.lr)
reduce_lr = LearningRateScheduler(scheduler)
model.fit(train_x, train_y, batch_size=32, epochs=300, callbacks=[reduce_lr])
当标准评估停止提升时,降低学习速率。
当学习停止时,模型总是会受益于降低 2-10 倍的学习速率。 这个回调函数监测一个数据并且当这个数据在一定「有耐心」的训练轮之后还没有进步, 那么学习速率就会被降低。
keras.callbacks.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', min_delta=0.0001, cooldown=0, min_lr=0)
实例
from keras.callbacks import ReduceLROnPlateau
redeuce_lr = ReduceLROnPlateau(monitor='val_loss', patience=10, mode='auto')
model.fit(train_x, train_y, batch_size=32, epochs=300, validation_split=0.1, callback=[reduce_lr])
利用回调保存最佳模型需要用到ModelCheckpoint这个回调函数。其作用为:在每个训练期之后保存模型。
keras.callbacks.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
实例
from keras.callbacks import LearningRateScheduler, ModelCheckpoint
# 保存最佳模型
filepath = 'weights.{epoch:02d}-{val_loss:.2f}.hdf5'
checkpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')
# epochs迭代周期,图片全部训练一次为一周期
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, callbacks=[lr_new, checkpoint], validation_data=(x_test, y_test))
保存最佳模型后,可能想要提前结束训练,这是就必须用到callbacks的另一个回调函数EarlyStopping()
当被监测的数量不再提升,则停止训练。
keras.callbacks.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto', baseline=None, restore_best_weights=False)