我们在训练模型的时候,一般会选择记录训练模型的权值文件或者只保存训练过程中的最优模型的权重文件。这里介绍训练过程中保存最优模型的权重文件的方法。下面是简单写了一个适用vgg16模型训练cifar10的程序,最终最优的模型权重文件会被保存在logs文件夹下。
# -*- coding: utf-8 -*-
"""
使用VGG网络训练cifar-10,保存训练过程权重
@author: Administrator
"""
from sklearn.preprocessing import LabelBinarizer
from keras.applications.vgg16 import VGG16
from keras.callbacks import ModelCheckpoint, TensorBoard
from keras.optimizers import SGD
from keras.datasets import cifar10
#import argparse
# =============================================================================
# # construct the argument parse and parse the arguments
# ap = argparse.ArgumentParser()
# ap.add_argument("-w", "--weights", required=True,
# help="path to weights directory")
# args = vars(ap.parse_args())
# =============================================================================
#导入数据
print("loading cifar-10 data ....")
((trainX, trainY),(testX, testY)) = cifar10.load_data()
trainX = trainX.astype("float") / 255.0
testX = testX.astype("float") / 255.0
#将label转化为vectors
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
#初始化模型和参数
print("compiling model .....")
opt = SGD(lr=0.01, decay=0.1/40, momentum=0.9, nesterov=True)
model = VGG16.build(width=32, height=32, depth=3, classes=10)
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=["accuracy"])
#创建一个权重文件保存文件夹logs
log_dir = "logs/"
#记录所有训练过程,每隔一定步数记录最大值
tensorboard = TensorBoard(log_dir=log_dir)
checkpoint = ModelCheckpoint(log_dir + "best_weights.h5",
monitor="val_loss",
mode='min',
save_weights_only=True,
save_best_only=True,
verbose=1,
period=1)
callback_lists=[tensorboard,checkpoint]
print("training network...")
H = model.fit(trainX, trainY, validation_data=(testX, testY),
batch_size=64, epochs=40, callbacks=callback_lists, verbose=2)
回调函数 Callbacks 是一组在训练的特定阶段被调用的函数集,可以使用回调函数来观察训练过程中网络内部的状态和统计信息。然后,在模型上调用 fit() 函数时,可以将ModelCheckpoint传递给训练过程。训练深度学习模型时,Checkpoint是模型的权重。ModelCheckpoint回调类允许你定义检查模型权重的位置,文件应如何命名,以及在什么情况下创建模型的Checkpoint。函数如下:
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=0, save_best_only=True, mode='max', period=1)
参考
1、https://www.jianshu.com/p/0711f9e54dd2
2、https://cloud.tencent.com/developer/article/1049579