keras训练完以后怎么预测_一文告诉你如何将Keras模型保存到文件中,并再次加载它们来进行预测。...

Keras是一个用于深度学习的简单而强大的Python库。

鉴于深度学习模式可能需要数小时、数天甚至数周的时间来培训,了解如何保存并将其从磁盘中加载是很重要的。

在本文中,您将发现如何将Keras模型保存到文件中,并再次加载它们来进行预测。

让我们开始吧。

2017/03更新:添加了首先安装h5py的说明。在每个示例中的最终打印语句中添加了缺失的括号

2017/03更新:更新了Keras 2.0.2,TensorFlow 1.0.1和Theano 0.9.0的示例。

56a992ffb70edf02580b75e9813a2675.png

图片版权所有:art_inthecity

教程概述

Keras将保存模型体系结构和保存模型权重的关注点分离开来。

模型权重被保存为 HDF5格式。这是一种网格格式,适合存储数字的多维数组。

可以使用两种不同的格式来描述和保存模型结构:JSON和YAML。

在这篇文章中,我们将会看到两个关于保存和加载模型文件的例子:

将模型保存到JSON。

将模型保存到YAML。

每个示例还将演示如何在HDF5格式化的文件中保存和加载你的模型权重。

这些例子将使用同样简单的网络训练,并且这些训练被用于Pima印第安人的糖尿病二分类数据集上。这是一个包含所有数值数据的小型数据集,很容易使用。你可以下载此数据集,并将其放置在你的工作目录中,文件名为“pima – indians – diabetes.csv”。

确认您已安装最新版本的Keras(截至2017年3月为v1.2.2)。

注意:您可能需要先安装h5py:

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后端的适当而有效的计算。

该模型以相同的方式进行评估,打印相同的评估分数。

# 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))

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

acc: 78.78%

Saved model to disk

Loaded model from disk

acc: 78.78%

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

{

"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

# 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))

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

acc: 78.78%

Saved model to disk

Loaded model from disk

acc: 78.78%

YAML格式描述的模型如下:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值