如何保存和加载你的Keras深度学习模型
Keras是一个简单而强大的Python库,用于深度学习。
鉴于深度学习模型可能需要数小时、数天甚至数周的时间进行训练,因此了解如何从磁盘保存和加载它们非常重要。
在这篇文章中,你将了解如何将Keras模型保存到文件中并再次加载以进行预测。
阅读本教程后,你将知道:
- 如何将模型权重和模型体系结构保存在单独的文件中。
- 如何以YAML和JSON格式保存模型体系结构。
- 如何将模型权重和结构保存到单个文件中以供以后使用。
我们开始吧。
教程概述
如果你是Keras或深度学习的新手,请参阅此Keras分步教程。
Keras将保存模型体系结构和保存模型权重的问题分开。
模型权重将保存为HDF5格式。这是一种网格格式,非常适合存储数字的多维数组。
可以使用两种不同的格式来描述和保存模型结构:JSON和YAML。
在本文中,我们将查看两个将模型保存和加载到文件的示例:
- 将模型保存到JSON。
- 将模型保存为YAML。
每个示例还将演示如何将模型权重保存和加载到HDF5格式的文件中。
这些示例将使用在皮马印第安人糖尿病发病二进制分类数据集上训练的相同的简单网络。这是一个包含所有数字数据且易于使用的小数据集。你可以下载此数据集并将其放在文件名为“pia-Indians-diabetes.csv”的工作目录中(更新:从此处下载)。
确认你安装了最新版本的Keras(例如,截至2019年5月的v2.2.4)。
注意:保存模型需要安装h5py库。你可以按如下方式轻松安装:
sudo pip install h5py
将你的神经网络模型保存为JSON
JSON是一种简单的文件格式,用于分层描述数据。
Keras通过to_json()函数提供了使用JSON格式描述任何模型的能力。这可以保存到文件中,稍后通过model_from_json()函数加载,该函数将根据JSON规范创建一个新模型。
权重是使用save_weights()函数直接从模型保存的,稍后使用对称的load_weights()函数加载权重。
下面的示例在Pima Indians数据集上训练和评估一个简单的模型。然后将模型转换为JSON格式,并将其写入本地目录中的model.json。网络权重被写入本地目录中的model.h5。
将从保存的文件加载模型和重量数据,并创建新模型。在使用加载的模型之前编译它是很重要的。这是为了使使用该模型进行的预测可以使用来自Keras后端的适当的高效计算。
以相同的方式对模型进行评估,打印相同的评估分数。
# MLP for Pima Indians Dataset Serialize to JSON and HDF5
from keras.models import Sequential
from keras.layers import Dense
from keras.models import model_from_json
import numpy
import os
# fix random seed for reproducibility
numpy.random.seed(7)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
# later...
# load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("model.h5")
print("Loaded model from disk")
# evaluate loaded model on test data
loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
score = loaded_model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))
运行此示例将提供以下输出。
acc: 78.78% Saved model to disk Loaded model from disk acc: 78.78%
模型的JSON格式如下所示:
{
"class_name":"Sequential",
"config":{
"name":"sequential_1",
"layers":[
{
"class_name":"Dense",
"config":{
"name":"dense_1",
"trainable":true,
"batch_input_shape":[
null,
8
],
"dtype":"float32",
"units":12,
"activation":"relu",
"use_bias":true,
"kernel_initializer":{
"class_name":"VarianceScaling",
"config":{
"scale":1.0,
"mode":"fan_avg",
"distribution":"uniform",
"seed":null
}
},
"bias_initializer":{
"class_name":"Zeros",
"config":{
}
},
"kernel_regularizer":null,
"bias_regularizer":null,
"activity_regularizer":null,
"kernel_constraint":null,
"bias_constraint":null
}
},
{
"class_name":"Dense",
"config":{
"name":"dense_2",
"trainable":true,
"dtype":"float32",
"units":8,
"activation":"relu",
"use_bias":true,
"kernel_initializer":{
"class_name":"VarianceScaling",
"config":{
"scale":1.0,
"mode":"fan_avg",
"distribution":"uniform",
"seed":null
}
},
"bias_initializer":{
"class_name":"Zeros",
"config":{
}
},
"kernel_regularizer":null,
"bias_regularizer":null,
"activity_regularizer":null,
"kernel_constraint":null,
"bias_constraint":null
}
},
{
"class_name":"Dense",
"config":{
"name":"dense_3",
"trainable":true,
"dtype":"float32",
"units":1,
"activation":"sigmoid",
"use_bias":true,
"kernel_initializer":{
"class_name":"VarianceScaling",
"config":{
"scale":1.0,
"mode":"fan_avg",
"distribution":"uniform",
"seed":null
}
},
"bias_initializer":{
"class_name":"Zeros",
"config":{
}
},
"kernel_regularizer":null,
"bias_regularizer":null,
"activity_regularizer":null,
"kernel_constraint":null,
"bias_constraint":null
}
}
]
},
"keras_version":"2.2.5",
"backend":"tensorflow"
}
将你的神经网络模型保存为YAML。、
此示例与上面的JSON示例基本相同,不同之处在于模型规范使用了YAML格式。
注意,此示例假设你安装了PyYAML 5,例如:
sudo pip install PyYAML
在本例中,使用YAML描述模型,将其保存到文件model.yaml,然后通过model_from_yaml()函数将其加载到新模型中。
权重在HDF5格式中的处理方式与上面的model.h5相同。
# MLP for Pima Indians Dataset serialize to YAML and HDF5
from keras.models import Sequential
from keras.layers import Dense
from keras.models import model_from_yaml
import numpy
import os
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
# serialize model to YAML
model_yaml = model.to_yaml()
with open("model.yaml", "w") as yaml_file:
yaml_file.write(model_yaml)
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
# later...
# load YAML and create model
yaml_file = open('model.yaml', 'r')
loaded_model_yaml = yaml_file.read()
yaml_file.close()
loaded_model = model_from_yaml(loaded_model_yaml)
# load weights into new model
loaded_model.load_weights("model.h5")
print("Loaded model from disk")
# evaluate loaded model on test data
loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
score = loaded_model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (loaded_model.metrics_names[1], score[1]*100))
运行该示例将显示以下输出:
acc: 78.78% Saved model to disk Loaded model from disk acc: 78.78%
以YAML格式描述的模型如下所示:
backend: tensorflow
class_name: Sequential
config:
layers:
- class_name: Dense
config:
activation: relu
activity_regularizer: null
batch_input_shape: !!python/tuple
- null
- 8
bias_constraint: null
bias_initializer:
class_name: Zeros
config: {}
bias_regularizer: null
dtype: float32
kernel_constraint: null
kernel_initializer:
class_name: VarianceScaling
config:
distribution: uniform
mode: fan_avg
scale: 1.0
seed: null
kernel_regularizer: null
name: dense_1
trainable: true
units: 12
use_bias: true
- class_name: Dense
config:
activation: relu
activity_regularizer: null
bias_constraint: null
bias_initializer:
class_name: Zeros
config: {}
bias_regularizer: null
dtype: float32
kernel_constraint: null
kernel_initializer:
class_name: VarianceScaling
config:
distribution: uniform
mode: fan_avg
scale: 1.0
seed: null
kernel_regularizer: null
name: dense_2
trainable: true
units: 8
use_bias: true
- class_name: Dense
config:
activation: sigmoid
activity_regularizer: null
bias_constraint: null
bias_initializer:
class_name: Zeros
config: {}
bias_regularizer: null
dtype: float32
kernel_constraint: null
kernel_initializer:
class_name: VarianceScaling
config:
distribution: uniform
mode: fan_avg
scale: 1.0
seed: null
kernel_regularizer: null
name: dense_3
trainable: true
units: 1
use_bias: true
name: sequential_1
keras_version: 2.2.5
将模型权重和结构一起保存
Keras还支持更简单的界面,可以将模型重量和模型体系结构一起保存到单个H5文件中。
以这种方式保存模型包括我们需要了解的有关模型的所有信息,包括:
- 模型权重。
- 模型体系结构。
- 模型编译详细信息(损失和指标)。
- 模型优化器状态。
这意味着我们可以直接加载和使用模型,而不必像在上面的示例中那样重新编译它。
注意:这是保存和加载Keras模型的首选方式。
如何保存Keras模型
你可以通过调用模型上的save()函数并指定文件名来保存模型。
下面的示例通过首先拟合一个模型、对其进行评估并将其保存到文件model.h5来演示这一点。
# MLP for Pima Indians Dataset saved to single file
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
# load pima indians dataset
dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# define model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X, Y, epochs=150, batch_size=10, verbose=0)
# evaluate the model
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
# save model and architecture to single file
model.save("model.h5")
print("Saved model to disk")
运行该示例适合模型,汇总训练数据集上的模型性能,并将模型保存到文件。
acc: 77.73% Saved model to disk
我们可以稍后从文件加载此模型并使用它。
如何加载Keras模型。
稍后可以通过调用load_model()函数并传递文件名来加载保存的模型。该函数返回具有相同体系结构和权重的模型。
在这种情况下,我们加载模型,总结体系结构,并在同一数据集上对其进行评估,以确认权重和体系结构是相同的。
# load and evaluate a saved model
from numpy import loadtxt
from keras.models import load_model
# load model
model = load_model('model.h5')
# summarize model.
model.summary()
# load dataset
dataset = loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]
# evaluate the model
score = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))
运行该示例首先加载模型,打印模型体系结构的摘要,然后计算同一数据集上加载的模型。
该模型获得了相同的准确率分数,在本例中为77%。
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_1 (Dense) (None, 12) 108 _________________________________________________________________ dense_2 (Dense) (None, 8) 104 _________________________________________________________________ dense_3 (Dense) (None, 1) 9 ================================================================= Total params: 221 Trainable params: 221 Non-trainable params: 0 _________________________________________________________________ acc: 77.73%
进一步阅读
- 在Keras文档中的如何保存Keras模型?。
- 关于Keras文档中的Keras模型。
摘要
在这篇文章中,你发现了如何将Keras深度学习模型序列化。
你了解了如何将训练好的模型保存到文件中,并在以后加载它们并使用它们进行预测。
你还了解到使用HDF5格式可以轻松存储模型权重,并且可以JSON或YAML格式保存网络结构。



