更加科学保存模型
keras如何更加科学的保存训练好的模型呢?
使用Callbacks回调函数中的ModelCheckpoint
filepath = 'model-ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5'
checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
这样设置会生成多个h5文件,若filepath='mymodel.h5’则只会生成一个文件,同时save_best_only打开之后,如果val_loss 提高了就会保存,没有提高就不会保存。
不太懂? 接下来细细讲
keras模型包括model和weight两个部分
保存model方法一 JSON文件:
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
保存model方法二 Yaml文件:
yaml_string = model.to_yaml()
保存weight方法一 h5文件:
model.save_weights("modelweight.h5")
同时保存model和weight
model.save('model.h5')
加载model:
#json model load
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
#h5 model load
from keras.models import load_model
model = load_model('model.h5')
#weight load
loaded_model.load_weights("model.h5")
Keras训练历史记录保存,导入,绘制acc或者loss曲线
训练:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X, Y, validation_split=0.33, epochs=150, batch_size=10, verbose=0)
保存训练的历史记录pickle.dump()
with open('','wb') as xxx:
pickle.dump( 变量,文件)
import pickle
with open('log.txt', 'wb') as file_txt:
pickle.dump(history.history, file_txt)
读取保存的训练历史记录:
with open('','rb') as :xxx
pickle.load(xxx)
with open('log.txt','rb') as file_txt:
history=pickle.load(file_txt)
绘制曲线
下面是绘制准确率的变化曲线,如果将acc修改成loss就可以绘制损失变化曲线。
plt.plot(history['acc'])
plt.plot(history['val_acc'])
plt.title("model accuracy")
plt.ylabel("Accuracy")
plt.xlabel("epoch")
plt.legend(["train","test"],loc="lower right")
plt.show()
用更加规范的函数打印acc和loss
打印 accuracy
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
def plot_graphs(history, string):
plt.plot(history.history[string])
plt.plot(history.history['val_'+string])
plt.xlabel('epochs')
plt.ylabel(string)
plt.legend([string, 'val_'+string])
plt.show()
plot_graphs(history, 'accuracy')
打印 loss
def plot_graphs(history, string):
plt.plot(history.history[string])
plt.plot(history.history['val_'+string])
plt.xlabel('epochs')
plt.ylabel(string)
plt.legend([string, 'val_'+string])
plt.show()
plot_graphs(history, 'loss')
如何只保存最佳的训练模型
from keras.callbacks import ModelCheckpoint
filepath='weights.best.hdf5'
# 有一次提升, 则覆盖一次.
checkpoint = ModelCheckpoint(filepath,
monitor='val_acc',
verbose=1,
save_best_only=True,
mode='max',period=2)
callbacks_list = [checkpoint]
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(lr=2e-6,decay=1e-7),
metrics=['acc'])
history1 = model.fit_generator(train_generator,
steps_per_epoch=100,
epochs=40,
validation_data=validation_generator,
validation_steps=100,
callbacks=callbacks_list)
保存有所有 有提升的模型
from keras.callbacks import ModelCheckpoint
# 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]
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history1 = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=40,
validation_data=validation_generator,
validation_steps=100, callbacks=callbacks_list)
加载最佳的模型
# load weights 加载模型权重
model.load_weights('weights.best.hdf5')
#如果想加载模型,则将model.load_weights('weights.best.hdf5')改为
#model.load_model('weights.best.hdf5')
# compile 编译
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print('Created model and loaded weights from hdf5 file')
# estimate
scores = model.evaluate(validation_generator, steps=30, verbose=0)
print("{0}: {1:.2f}%".format(model.metrics_names[1], scores[1]*100))
keras.callbacks.ModelCheckpoint
参数说明
keras.callbacks.ModelCheckpoint(filepath,monitor=‘val_loss’,verbose=0,save_best_only=False, save_weights_only=False, mode=‘auto’, period=1)
filename:字符串,保存模型的路径
monitor:需要监视的值
verbose:信息展示模式,0或1(checkpoint的保存信息,类似Epoch 00001: saving model to ...)
(verbose = 0 为不在标准输出流输出日志信息;verbose = 1 为输出进度条记录;verbose = 2 为每个epoch输出一行记录)
save_best_only:当设置为True时,监测值有改进时才会保存当前的模型( the latest best model according to the quantity monitored will not be overwritten)
mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当监测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。
save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
period:CheckPoint之间的间隔的epoch数