EarlyStopping是这样一种技术,可以使神经网络的训练过程在多次迭代没有明显更新的情况下提前结束,并获得当前训练条件下精度最高(或损失最小)的训练模型。
Keras中已经集成了EarlyStopping函数,本质上是callbacks的一个类,在使用EarlyStopping之前需要导入该函数:
from keras.callbacks import EarlyStopping
EarlyStopping的一般格式如下:
EarlyStops = EarlyStopping(monitor='loss', min_delta=0.001, patience=5, verbose=1, mode='min')
其中,monitor是指可监测的值,主要是‘acc’, ‘val_acc’, ‘loss’, ‘val_loss’。如果希望以精度作为监测指标,需要在model.compile中添加metrics=[‘accuracy’]:
model.compile(loss='mae', optimizer='adam', metrics=['accuracy'])
相应地,EarlyStopping的格式变成:
EarlyStops = EarlyStopping(monitor='acc', min_delta=0.001, patience=5, verbose=1, mode='max')
如果有验证集的话,还可以使用‘val_acc’, ‘val_loss’作为监测指标。
min_delta,最小变化幅度,只有超过这个值才算作改进。这个值可以凭经验设置,一般设置的值越大,可能训练过程就会结束得越早。
patience, 允许在多少epochs中没有改进,也是个经验参数。
mode, ‘auto’, ‘max’, ‘min’中三选一。对于‘loss’肯定是‘min’,对于’acc’肯定是’max’,不确定的情况下选’auto’。
在这里对verbose参数作一下说明,verbose不仅EarlyStopping里有,在model.fit里也会遇到。verbose主要有三个参数,verbose=0 #不在标准输出流输出日志信息,verbose=1 #输出进度条记录,verbose=2 #每个epoch输出一行记录。默认为1。
为了顺利地完成计算,我们需要对model.fit作相应调整。
带验证集的情形:
model.fit(x_train, y_train, validation_data(x_test, y_test), epochs=100, batch_size=50, callbacks=[EarlyStops], verbose=1)
不带验证集的情形:
model.fit(x_train, y_train, epochs=100, batch_size=50, callbacks=[EarlyStops], verbose=1)
需要注意的是,与ModelCheckpoint不同,EarlyStopping 中无法指定保存文件,需要额外添加model.saver进行模型的持久化:
model.save('/home/test/documents/filename.hdf5')