【Python深度学习系列】一文讲明白深度学习模型的保存与加载(案例+源码)
一文讲明白深度学习模型的保存与加载(案例+源码)
这是我的第330篇原创文章。
一、引言
深度学习模型的保存的内容主要包括以下几个方面:
-
模型的架构
-
模型的训练过程信息
-
在训练过程中学习到的权重
-
模型的配置信息
-
本文所提到的方法仅适用于采用顺序式、函数式、以及子类式三种方式构建的模型,对于原生模型(自己编写)的保存方式不适用。此外,模型的构建方式不同,有些方法可能也存在适用性方面的差异。
二、实现过程
2.1 模型的完整保存与加载(架构、权重、配置)
使用model.save()函数搭配tf.keras.models.load_model()对模型的架构,权重以及配置进行保存与恢复。
训练并保存完整模型:
class NeuralNetwork(tf.keras.Model):
def __init__(self, hidden_size, output_size):
super(NeuralNetwork, self).__init__()
self.dense1 = tf.keras.layers.Dense(hidden_size, activation='relu')
self.dense2 = tf.keras.layers.Dense(hidden_size, activation='relu')
self.dense3 = tf.keras.layers.Dense(output_size, activation='softmax')
def call(self, inputs):
x = self.dense1(inputs)
x = self.dense2(x)
x = self.dense3(x)
return x
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建模型实例
input_size = X.shape[1]
hidden_size = 64
output_size = len(set(y))
model = NeuralNetwork(hidden_size, output_size)
model.build(input_shape=(None, input_size))
model.summary()
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 保存完整的模型
model.save('iris_model', save_format='tf')
# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(test_accuracy)
将模型保存为 HDF5 格式要求模型是函数式模型或序列式模型。它不适用于子类化模型,因为此类模型是通过 Python 方法的主体定义的,而 Python 方法并不能安全地序列化。可以考虑保存为 Tensorflow SavedModel 格式(通过设置 save_format=“tf”)或使用 `save_weights`。
结果:
![]()
保存的模型文件:iris_model文件夹

加载保存的模型,直接读取模型文件就行,不需要保留模型的架构、不需要重新训练、不需要保留模型的配置信息:
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 直接调用完整的模型
model = tf.keras.models.load_model('iris_model')
# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(test_accuracy)
结果:
![]()
2.2 仅对模型的权重进行保存和加载
使用model.save_weights()函数搭配model.load_weights()函数对模型进行权重的保存与加载。
训练并保存模型的权重:
class NeuralNetwork(tf.keras.Model):
def __init__(self, hidden_size, output_size):
super(NeuralNetwork, self).__init__()
self.dense1 = tf.keras.layers.Dense(hidden_size, activation='relu')
self.dense2 = tf.keras.layers.Dense(hidden_size, activation='relu')
self.dense3 = tf.keras.layers.Dense(output_size, activation='softmax')
def call(self, inputs):
x = self.dense1(inputs)
x = self.dense2(x)
x = self.dense3(x)
return x
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建模型实例
input_size = X.shape[1]
hidden_size = 64
output_size = len(set(y))
model = NeuralNetwork(hidden_size, output_size)
model.build(input_shape=(None, input_size))
model.summary()
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 保存模型的权重
model.save_weights(r'save_weights.h5')
# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(test_accuracy)
权重文件:
![]()
结果:
![]()
加载模型的权重,模型的架构和配置要保留且不变,但是不需要重新训练
class NeuralNetwork(tf.keras.Model):
def __init__(self, hidden_size, output_size):
super(NeuralNetwork, self).__init__()
self.dense1 = tf.keras.layers.Dense(hidden_size, activation='relu')
self.dense2 = tf.keras.layers.Dense(hidden_size, activation='relu')
self.dense3 = tf.keras.layers.Dense(output_size, activation='softmax')
def call(self, inputs):
x = self.dense1(inputs)
x = self.dense2(x)
x = self.dense3(x)
return x
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建模型实例
input_size = X.shape[1]
hidden_size = 64
output_size = len(set(y))
model = NeuralNetwork(hidden_size, output_size)
model.build(input_shape=(None, input_size))
model.summary()
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 加载模型的权重,模型的架构和配置要保留且不变,不需要重新训练了
model.load_weights(r'save_weights.h5')
# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(test_accuracy)
结果:
![]()
2.3 仅对模型的架构进行保存和恢复
使用model.to_json()搭配tf.keras.models.model_from_json()对模型的架构进行保存与恢复。这种方式只适合于顺序式和函数式,不适用子类化式构建的模型。
训练模型,并保存模型的架构:
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建模型实例
input_size = X.shape[1]
hidden_size = 64
output_size = len(set(y))
model = Sequential([
Dense(hidden_size, activation='relu', input_shape=[input_size]),
Dense(hidden_size, activation='relu'),
Dense(output_size, activation='softmax')
])
model.summary()
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 保存模型的架构,生成json文件
model_json = model.to_json()
with open(r'model_json.json', 'w') as f:
f.write(model_json)
print('模型的架构json文件保存完成!')
# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(test_accuracy)
保存结构的json文件:
![]()
结果:
![]()
加载模型的架构,模型配置和训练要保留,不需要保留模型的结构:
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# =============================
# 加载模型的架构,模型配置和训练要保留,不需要保留模型的结构
with open(r'model_json.json', 'r') as f:
model_json = f.read()
model = model_from_json(model_json)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 评估模型
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print(test_accuracy)
结果:
![]()
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)