深度学习有可能需要跑很长时间,如果中间断了(特别是在竞价式实例上跑的时候)就要亲命了。本章关于在训练时中途保存模型。本章将:
保存点很重要! 每轮打保存点! 挑最好的模型! 我们开始吧。
14.1 使用保存点 长时间运行的程序需要能中途保存,加强健壮性。保存的程序应该可以继续运行,或者直接运行。深度学习的保存点用来存储模型的权重:这样可以继续训练,或者直接开始预测。
Keras有回调API,配合ModelCheckpoint可以每轮保存网络信息,可以定义文件位置、文件名和保存时机等。例如,损失函数或准确率达到某个标准就保存,文件名的格式可以加入时间和准确率等。ModelCheckpoint需要传入fit()函数,也需要安装h5py库。
14.2 效果变好就保存 好习惯:每轮如果效果变好就保存一下。还是用第7章的模型,用33%的数据测试。
每轮后在测试数据集上验证,如果比之前效果好就保存权重(monitor=‘val_acc’, mode=‘max’)。文件名格式是weights-improvement-val_acc=.2f.hdf5。
from keras.models import Sequential from keras.layers import Dense from keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import numpy
seed = 7 numpy.random.seed(seed)
dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=",")
X = dataset[:,0:8] Y = dataset[:,8]
model = Sequential() model.add(Dense(12, input_dim=8, init=‘uniform’, activation=‘relu’)) model.add(Dense(8, init=‘uniform’, activation=‘relu’)) model.add(Dense(1, init=‘uniform’, activation=‘sigmoid’))
model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])
filepath=“weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5” checkpoint = ModelCheckpoint(filepath, monitor=‘val_acc’, verbose=1, save_best_only=True, mode=‘max’) callbacks_list = [checkpoint]
model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, callbacks=callbacks_list, verbose=0) 输出的结果如下:如果效果更好就保存。
… Epoch 00134: val_acc did not improve Epoch 00135: val_acc did not improve Epoch 00136: val_acc did not improve Epoch 00137: val_acc did not improve Epoch 00138: val_acc did not improve Epoch 00139: val_acc did not improve Epoch 00140: val_acc improved from 0.83465 to 0.83858, saving model to weights-improvement-140-0.84.hdf5 Epoch 00141: val_acc did not improve Epoch 00142: val_acc did not improve Epoch 00143: val_acc did not improve Epoch 00144: val_acc did not improve Epoch 00145: val_acc did not improve Epoch 00146: val_acc improved from 0.83858 to 0.84252, saving model to weights-improvement-146-0.84.hdf5 Epoch 00147: val_acc did not improve Epoch 00148: val_acc improved from 0.84252 to 0.84252, saving model to weights-improvement-148-0.84.hdf5 Epoch 00149: val_acc did not improve 目录下会保存每次的模型:
… weights-improvement-74-0.81.hdf5 weights-improvement-81-0.82.hdf5 weights-improvement-91-0.82.hdf5 weights-improvement-93-0.83.hdf5 这种方法有效,但是文件较多。当然最好的模型肯定保存下来了。
14.3 保存最好的模型 也可以只保存最好的模型:每次如果效果变好就覆盖之前的权重文件,把之前的文件名改成固定的就可以:
from keras.models import Sequential from keras.layers import Dense from keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import numpy
seed = 7 numpy.random.seed(seed)
dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=",")
X = dataset[:,0:8] Y = dataset[:,8]
model = Sequential() model.add(Dense(12, input_dim=8, init=‘uniform’, activation=‘relu’)) model.add(Dense(8, init=‘uniform’, activation=‘relu’)) model.add(Dense(1, init=‘uniform’, activation=‘sigmoid’))
model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])
filepath=“weights.best.hdf5” checkpoint = ModelCheckpoint(filepath, monitor=‘val_acc’, verbose=1, save_best_only=True, mode=‘max’) callbacks_list = [checkpoint]
model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, callbacks=callbacks_list, verbose=0) 结果如下:
… Epoch 00136: val_acc did not improve Epoch 00137: val_acc did not improve Epoch 00138: val_acc did not improve Epoch 00139: val_acc did not improve Epoch 00140: val_acc improved from 0.83465 to 0.83858, saving model to weights.best.hdf5 Epoch 00141: val_acc did not improve Epoch 00142: val_acc did not improve Epoch 00143: val_acc did not improve Epoch 00144: val_acc did not improve Epoch 00145: val_acc did not improve Epoch 00146: val_acc improved from 0.83858 to 0.84252, saving model to weights.best.hdf5 Epoch 00147: val_acc did not improve Epoch 00148: val_acc improved from 0.84252 to 0.84252, saving model to weights.best.hdf5 Epoch 00149: val_acc did not improve 网络保存在:
weights.best.hdf5 14.4 导入保存的模型 保存点只保存权重,网络结构需要预先保存。参见第13章,代码如下:
from keras.models import Sequential from keras.layers import Dense from keras.callbacks import ModelCheckpoint import matplotlib.pyplot as plt import numpy
seed = 7 numpy.random.seed(seed)
model = Sequential() model.add(Dense(12, input_dim=8, init=‘uniform’, activation=‘relu’)) model.add(Dense(8, init=‘uniform’, activation=‘relu’)) model.add(Dense(1, init=‘uniform’, activation=‘sigmoid’))
model.load_weights(“weights.best.hdf5”)
dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=",")
X = dataset[:,0:8] Y = dataset[:,8]
scores = model.evaluate(X, Y, verbose=0) print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 结果如下:
Created model and loaded weights from file acc: 77.73% 14.5 总结 本章关于在训练时保存检查点。总结一下:
如何在优化时保存网络 如何保存最好的网络 如何导入网络 14.5.1 下一章 本章关于建立保存点:下一章关于在训练时画性能图表。