如何保存和加载你的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格式保存网络结构。