保存并加载您的Keras深度学习模型

2018-03-02 15:57:24 浏览数 (1)

Keras是一个用于深度学习的简单而强大的Python库。 鉴于深度学习模式可能需要数小时、数天甚至数周的时间来培训,了解如何保存并将其从磁盘中加载是很重要的。 在本文中,您将发现如何将Keras模型保存到文件中,并再次加载它们来进行预测。 让我们开始吧。

  • 2017/03更新:添加了首先安装h5py的说明。在每个示例中的最终打印语句中添加了缺失的括号
  • 2017/03更新:更新了Keras 2.0.2,TensorFlow 1.0.1和Theano 0.9.0的示例。

图片版权所有:art_inthecity

教程概述

Keras将保存模型体系结构和保存模型权重的关注点分离开来。 模型权重被保存为 HDF5格式。这是一种网格格式,适合存储数字的多维数组。 可以使用两种不同的格式来描述和保存模型结构:JSON和YAML。 在这篇文章中,我们将会看到两个关于保存和加载模型文件的例子:

  • 将模型保存到JSON。
  • 将模型保存到YAML。

每个示例还将演示如何在HDF5格式化的文件中保存和加载你的模型权重。 这些例子将使用同样简单的网络训练,并且这些训练被用于Pima印第安人的糖尿病二分类数据集上。这是一个包含所有数值数据的小型数据集,很容易使用。你可以下载此数据集,并将其放置在你的工作目录中,文件名为“pima - indians - diabetes.csv”。 确认您已安装最新版本的Keras(截至2017年3月为v1.2.2)。 注意:您可能需要先安装h5py:

代码语言:javascript复制
sudo pip install h5py

将你的神经网络模型保存到JSON

JSON是一种简单的轻量级的数据交换格式。 Keras提供了使用带有to_json()函数的JSON格式它有描述任何模型的功能。它可以保存到文件中,然后通过从JSON参数创建的新模型model_from_json()函数加载。 使用save_weights()函数直接从模型中保存权重,并使用对称的load_weights()函数加载。 下面的例子训练并评估了Pima印第安人数据集上的一个简单模型。然后将该模型转换为JSON格式并写入本地目录中的model.json。网络权重写入本地目录中的model.h5。 从保存的文件加载模型和权重数据,并创建一个新的模型。在使用加载的模型之前,必须先编译它。这样,使用该模型进行的预测可以使用Keras后端的适当而有效的计算。 该模型以相同的方式进行评估,打印相同的评估分数。

代码语言:javascript复制
# 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, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', 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))

运行此示例得到以下输出:

代码语言:javascript复制
acc: 78.78%
Saved model to disk
Loaded model from disk
acc: 78.78%

这个模型的JSON格式如下所示:

代码语言:javascript复制
{  
   'keras_version':'2.0.2',
   'backend':'theano',
   'config':[  
      {  
         'config':{  
            'dtype':'float32',
            'bias_regularizer':null,
            'activation':'relu',
            'bias_constraint':null,
            'use_bias':true,
            'bias_initializer':{  
               'config':{  

               },
               'class_name':'Zeros'
            },
            'kernel_regularizer':null,
            'activity_regularizer':null,
            'kernel_constraint':null,
            'trainable':true,
            'name':'dense_1',
            'kernel_initializer':{  
               'config':{  
                  'maxval':0.05,
                  'minval':-0.05,
                  'seed':null
               },
               'class_name':'RandomUniform'
            },
            'batch_input_shape':[  
               null,
               8
            ],
            'units':12
         },
         'class_name':'Dense'
      },
      {  
         'config':{  
            'kernel_regularizer':null,
            'bias_regularizer':null,
            'activation':'relu',
            'bias_constraint':null,
            'use_bias':true,
            'bias_initializer':{  
               'config':{  

               },
               'class_name':'Zeros'
            },
            'activity_regularizer':null,
            'kernel_constraint':null,
            'trainable':true,
            'name':'dense_2',
            'kernel_initializer':{  
               'config':{  
                  'maxval':0.05,
                  'minval':-0.05,
                  'seed':null
               },
               'class_name':'RandomUniform'
            },
            'units':8
         },
         'class_name':'Dense'
      },
      {  
         'config':{  
            'kernel_regularizer':null,
            'bias_regularizer':null,
            'activation':'sigmoid',
            'bias_constraint':null,
            'use_bias':true,
            'bias_initializer':{  
               'config':{  

               },
               'class_name':'Zeros'
            },
            'activity_regularizer':null,
            'kernel_constraint':null,
            'trainable':true,
            'name':'dense_3',
            'kernel_initializer':{  
               'config':{  
                  'maxval':0.05,
                  'minval':-0.05,
                  'seed':null
               },
               'class_name':'RandomUniform'
            },
            'units':1
         },
         'class_name':'Dense'
      }
   ],
   'class_name':'Sequential'
}

将你的神经网络模型保存到YAML

此示例与上述JSON示例大致相同,但YAML格式用于模型规范。 该模型使用YAML进行描述,保存到文件model.yaml。yaml和later通过model_from_yaml()函数加载到新模型中。权重的处理方式同样以HDF5格式保存在model.5

代码语言:javascript复制
# 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, kernel_initializer='uniform', activation='relu'))
model.add(Dense(8, kernel_initializer='uniform', activation='relu'))
model.add(Dense(1, kernel_initializer='uniform', 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))

运行该示例将显示以下输出:

代码语言:javascript复制
acc: 78.78%
Saved model to disk
Loaded model from disk
acc: 78.78%

YAML格式描述的模型如下:

代码语言:javascript复制
backend: theano
class_name: Sequential
config:
- 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: RandomUniform
      config: {maxval: 0.05, minval: -0.05, 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
    kernel_constraint: null
    kernel_initializer:
      class_name: RandomUniform
      config: {maxval: 0.05, minval: -0.05, 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
    kernel_constraint: null
    kernel_initializer:
      class_name: RandomUniform
      config: {maxval: 0.05, minval: -0.05, seed: null}
    kernel_regularizer: null
    name: dense_3
    trainable: true
    units: 1
    use_bias: true
keras_version: 2.0.2

总结

在这篇文章中,你发现了如何序列化你的Keras深度学习模型。 你了解了如何将训练的模型保存到文件中,然后将它们加载并使用它们进行预测。 你还了解到,模型权重很容易使用HDF5格式存储,而网络结构可以以JSON或YAML格式保存。

0 人点赞