上一篇博客,我们学会如何训练模型,但是训练好的模型我们需要保存下来啊?一般有2种方式。
第一种,我们可以等模型训练完了,再调用保存模型的方法。但是一般不用等模型训练完,模型就能达到很高的精度,另外一方面,训练完的模型可能过拟合或者还不如训练过程中的精度高。所以;我们我们经常用第二种,在训练过程中,就不断的保存模型。
这里就需要用到回调函数了callbacks
还是直接上代码吧!
# 下面是创建callbacks
trained_models_path = "./trained_models/face_model"
log_file_path = "./log.csv"
early_stop = EarlyStopping('loss', 0.1, patience=60) # 当损失(loss)提升连续60次小于0.1时,就停止训练模型
reduce_lr = ReduceLROnPlateau('loss', factor=0.1, patience=25, verbose=1) #当损失的训练轮次25后还没有进步,那么学习率就会降低
csv_logger = CSVLogger(log_file_path, append=False) #保存日志,地址、日志不叠加
model_names = trained_models_path + '.{epoch:02d} - {accuracy:2f}.hdf5' #模型保存的名称
model_checkpoint = ModelCheckpoint(model_names, #模型名称
monitor='loss', #监听损失的变化
verbose=1,
save_best_only=True, #是否值保存最好的
save_weights_only=False) #是否值保存权重(模型包括“权值”和“框架”)
callbacks = [model_checkpoint, csv_logger, early_stop, reduce_lr]
上面创建了callbacks,那怎么使用呢?
还记得博客的模型训练方法吗?最后我们调用的“model.fit”
model.fit(X_train,y_train,
steps_per_epoch=10,
epochs=num_epochs,
verbose=1,
validation_data=(X_test,y_test),
validation_steps=len(y_test) / batch_size)
我们修改成下面就好了
model.fit(X_train,y_train,
steps_per_epoch=10,
epochs=num_epochs,
verbose=1,
callbacks=callbacks, # 对,就是加在这里
validation_data=(X_test,y_test),
validation_steps=len(y_test) / batch_size)
我们再次训练,就会发现,在每次训练完毕,就会产生很多模型文件(大概100兆以上)和日志,好吧,选一个精度最高的模型,修改名称为"best_face_recognition_model.hdf5",我们进行下一篇,模型识别图片中2个人脸是否为同一个人?
参考文献:keras保存模型