第14章 使用保存点保存最好的模型

深度学习有可能需要跑很长时间,如果中间断了(特别是在竞价式实例上跑的时候)就要亲命了。本章关于在训练时中途保存模型。本章将:

保存点很重要!
每轮打保存点!
挑最好的模型!
我们开始吧。

14.1 使用保存点
长时间运行的程序需要能中途保存,加强健壮性。保存的程序应该可以继续运行,或者直接运行。深度学习的保存点用来存储模型的权重:这样可以继续训练,或者直接开始预测。

Keras有回调API,配合ModelCheckpoint可以每轮保存网络信息,可以定义文件位置、文件名和保存时机等。例如,损失函数或准确率达到某个标准就保存,文件名的格式可以加入时间和准确率等。ModelCheckpoint需要传入fit()函数,也需要安装h5py库。

14.2 效果变好就保存
好习惯:每轮如果效果变好就保存一下。还是用第7章的模型,用33%的数据测试。

每轮后在测试数据集上验证,如果比之前效果好就保存权重(monitor=‘val_acc’, mode=‘max’)。文件名格式是weights-improvement-val_acc=.2f.hdf5。

Checkpoint the weights when validation accuracy improves

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy

fix random seed for reproducibility

seed = 7
numpy.random.seed(seed)

load pima indians dataset

dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=",")

split into input (X) and output (Y) variables

X = dataset[:,0:8]
Y = dataset[:,8]

create model

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’))

Compile model

model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])

checkpoint

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]

Fit the model

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 保存最好的模型
也可以只保存最好的模型:每次如果效果变好就覆盖之前的权重文件,把之前的文件名改成固定的就可以:

Checkpoint the weights for best model on validation accuracy

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy

fix random seed for reproducibility

seed = 7
numpy.random.seed(seed)

load pima indians dataset

dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=",")

split into input (X) and output (Y) variables

X = dataset[:,0:8]
Y = dataset[:,8]

create model

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’))

Compile model

model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’])

checkpoint

filepath=“weights.best.hdf5”
checkpoint = ModelCheckpoint(filepath, monitor=‘val_acc’, verbose=1, save_best_only=True,
mode=‘max’)
callbacks_list = [checkpoint]

Fit the model

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章,代码如下:

How to load and use weights from a checkpoint

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy

fix random seed for reproducibility

seed = 7
numpy.random.seed(seed)

create model

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’))

load weights

model.load_weights(“weights.best.hdf5”)

Compile model (required to make predictions) model.compile(loss=‘binary_crossentropy’, optimizer=‘adam’, metrics=[‘accuracy’]) print(“Created model and loaded weights from file”)

load pima indians dataset

dataset = numpy.loadtxt(“pima-indians-diabetes.csv”, delimiter=",")

split into input (X) and output (Y) variables

X = dataset[:,0:8]
Y = dataset[:,8]

estimate accuracy on whole dataset using loaded weights

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 下一章
本章关于建立保存点:下一章关于在训练时画性能图表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值