一旦您投入时间和计算资源训练了一个深度学习模型,您肯定不希望丢失这些成果,或者每次需要使用时都重新训练它。保存训练好的模型可以暂停和继续训练,与他人共享模型,将其部署到应用程序中,或比较不同版本。保存和加载 Keras 模型及其学习参数(权重)的常用方法将被阐述。为什么要保存模型?保存模型是机器学习工作流的一个基本组成部分,原因有以下几点:持久性: 训练可能需要数小时甚至数天。保存可以让您保留训练好的状态,而无需从头开始重新训练。部署: 保存的模型可以加载到不同的环境或应用程序中,用于对新数据进行预测。共享与协作: 您可以将训练好的模型与同事或社区共享。微调与迁移学习: 您可以加载预训练模型,并在新的数据集或任务上继续训练它。实验: 保存模型的不同版本(例如,使用不同超参数训练的版本),以便后续比较。容错性: 结合 ModelCheckpoint 等回调(前面已讨论过),保存可以让您在训练中断时也能恢复到性能最好的模型状态。保存整个模型保存工作的最全面的方式是保存整个模型。这通常包括:模型的架构(层、连接)。模型学习到的权重。模型的训练配置(在 compile() 期间指定,如优化器、损失函数和指标)。优化器的状态(允许您从中断的地方精确地恢复训练)。Keras 为此提供了一个简单的 save() 方法。尤其是在 Keras 3 中,推荐的格式是 .keras ZIP 归档格式。与 HDF5 (.h5) 或 TensorFlow 的 SavedModel (.tf) 等旧选项相比,这是一种更现代、高效且统一的格式。import keras from keras import layers import numpy as np # 定义一个简单的序贯模型(示例) model = keras.Sequential( [ keras.Input(shape=(784,)), layers.Dense(64, activation="relu"), layers.Dense(10, activation="softmax"), ] ) # 编译模型(示例编译) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 假设模型已经训练完成... # model.fit(x_train, y_train, epochs=5, batch_size=32) # 将整个模型保存到推荐格式的单个文件中 model.save("my_model.keras") print("模型已成功保存到 my_model.keras")这一个命令将所需的一切都打包到 my_model.keras 文件中。加载整个模型要加载使用 model.save() 保存的模型,您可以使用 keras.models.load_model() 函数。此函数会重新构建模型架构,加载权重,并恢复训练配置和优化器状态。import keras import numpy as np # 从文件加载模型 loaded_model = keras.models.load_model("my_model.keras") # 验证模型概况 loaded_model.summary() # 您现在可以使用加载的模型进行预测或继续训练 # 预测示例(需要适当的输入数据) # dummy_input = np.random.rand(1, 784) # predictions = loaded_model.predict(dummy_input) # print("从加载模型中获得的预测:", predictions) # 如果需要,您甚至可以恢复训练 # loaded_model.fit(x_train_more, y_train_more, epochs=2)请注意,如果您的模型包含自定义层、自定义激活函数或不属于核心 Keras API 的其他自定义对象,您可能需要在加载时使用 load_model() 中的 custom_objects 参数提供这些定义。但是,对于标准层和函数,这会自动处理。仅保存权重有时,您只需要保存模型的学习参数(权重),而不是整个架构或训练配置。这在以下情况下很有用:您计划使用相同的模型架构,但想尝试不同的权重初始化或训练运行。您正在进行迁移学习,将权重加载到可能修改过的架构中。您想要一个只包含参数的更小的文件。您可以使用 save_weights() 方法仅保存权重。Keras 通常使用 HDF5 格式保存权重,通常带有 .weights.h5 扩展名,尽管也可能使用其他后端特定格式。import keras from keras import layers import numpy as np # 定义相同的简单序贯模型(示例) model = keras.Sequential( [ keras.Input(shape=(784,)), layers.Dense(64, activation="relu"), layers.Dense(10, activation="softmax"), ] ) # 编译模型(训练需要,但不会随权重一起保存) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 假设模型已经训练完成... # model.fit(x_train, y_train, epochs=5, batch_size=32) # 仅保存权重 model.save_weights("my_model_weights.weights.h5") print("模型权重已成功保存到 my_model_weights.weights.h5")仅加载权重要加载使用 save_weights() 保存的权重,您首先需要创建一个具有与您保存权重的模型完全相同的架构的模型实例。然后,您在此新实例化的模型上使用 load_weights() 方法。import keras from keras import layers import numpy as np # 1. 重新创建完全相同的模型架构 new_model = keras.Sequential( [ keras.Input(shape=(784,)), layers.Dense(64, activation="relu"), layers.Dense(10, activation="softmax"), ] ) # 2. 将保存的权重加载到新的模型实例中 new_model.load_weights("my_model_weights.weights.h5") print("模型权重加载成功。") # 现在 `new_model` 具有学习到的权重。 # 注意:如果您想进一步训练此模型 # 或使用已编译的指标评估它,则仍需要编译此模型。 new_model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) # 您现在可以使用 `new_model` 进行预测。 # dummy_input = np.random.rand(1, 784) # predictions = new_model.predict(dummy_input) # print("从加载权重的模型中获得的预测:", predictions)如果您尝试将权重加载到具有不同架构(例如,不同的层、不同数量的单元)的模型中,Keras 通常会引发错误。选择合适的方法当您需要模型的自包含表示(包括其架构、权重和训练设置)时,请使用 model.save() 和 keras.models.load_model()。这是部署、共享或恢复训练最常用和推荐的方法。请使用 .keras 格式。当您只关心学习到的参数并计划使用 Python 代码单独实例化模型架构时,请使用 model.save_weights() 和 model.load_weights()。这在研究环境中很常见,用于将预训练权重加载到标准或自定义架构中(例如,迁移学习)。能够有效地保存和加载模型是管理深度学习项目的一项基本技能。它与 ModelCheckpoint 等训练技术紧密结合,并在模型开发和模型部署之间架起桥梁。