Keras的model.save()和model.save_weights()有什么区别?

55

在Keras中保存模型,model.save()model.save_weights()和回调函数中的ModelCheckpoint()输出文件有什么区别?

model.save()生成的保存文件比model.save_weights()生成的模型文件大,但比JSON或Yaml模型结构文件要大得多。为什么会这样?

换句话说,为什么大小(model.save() + something)=(model.save_weights() + model.to_json()),那个“something”是什么?

只用model.save_weights()model.to_json()进行保存并从这些文件加载是否比使用model.save()load_model()更有效率?它们之间有什么区别?

4个回答

48

save()函数将模型结构和权重保存在一个HDF5文件中,包括优化器的状态等信息。使用load()函数可以重新构建整个模型,包括权重。

save_weights()函数只会将权重保存到HDF5文件中,不包含其他信息。如果要从JSON文件中重建模型,需要额外的代码。


只是想澄清一下,我使用h5dump --contents命令将保存的模型与保存的权重进行比较,我可以看到权重只是模型hd5文件中的一个“组”。但是还有优化器状态。但是,我没有看到任何与模型体系结构相关的文件。优化状态用于什么目的,模型体系结构如何持久化? - CMCDragonkai
@CMCDragonkai 这不是澄清而是一个新问题。 - Dr. Snoopy
@MatiasValdenegro,您能解释一下为什么要保存优化器的状态吗?如果只是在不同的会话中加载权重来保持训练相同的模型,但在另一个会话中继续训练(例如关闭Python并在其他日期继续训练),会出现什么问题呢? - payne
2
@payne 优化器具有状态,例如梯度的运行平均值,因此如果您从头开始学习,学习可能会不稳定甚至失败。 - Dr. Snoopy
3
@MatiasValdenegro 所以使用 model.save_weights('my_model_weights.h5') 会干扰学习过程,应该使用 model.save('my_model.h5') 来继续训练。 - payne

9
  • model.save_weights(): 只会保存权重,如果需要,您可以将它们应用于不同的架构
  • mode.save(): 将保存模型的架构+权重+训练配置+优化器的状态

此函数与Keras Model save_weights函数略有不同。tf.keras.Model.save_weights创建一个名为filepath的检查点文件,而tf.train.Checkpoint使用filepath作为检查点文件名的前缀来编号检查点。除此之外,model.save_weights()和tf.train.Checkpoint(model).save()是等效的。Object-based checkpointing会保存一个对象的状态,这个对象可以是一个模型或者一组变量。当你需要恢复训练时,你可以从最近的检查点恢复,而无需重建模型或者初始化变量。如果你想要在不同的代码版本之间共享模型,或者在不同的机器上运行模型,那么Checkpoint就非常有用了。 - g_p

4

只是为了补充一下ModelCheckPoint的输出,如果对其他人有用的话:当作为模型训练期间的回调函数使用时,它可以根据save_weights_only参数所设置的状态来保存整个模型或仅保存权重。如果设置为TRUE和仅权重,则相当于调用model.save_weights();如果设置为FALSE(默认),则保存整个模型,就像调用model.save()一样。


0

除了上面的答案之外,从tf.keras版本“2.7.0”开始,模型可以使用model.save()保存为两种格式,即TensorFlow SavedModel格式和旧版Keras H5格式。推荐使用SavedModel格式,并且在调用model.save()时默认使用该格式。要保存为.h5(HDF5)格式,请使用model.save('my_model', save_format='h5')更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接