keras 保存模型 -说重点 ,实用 pickle保存-history列表

更加科学保存模型
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数

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值