您的位置:首页 > 其它

深度学习笔记--使用keras训练&保存&加载CNN模型

2018-09-04 16:26 906 查看

基于之前的一篇博文

深度学习笔记–使用keras创建CNN模型

里面介绍了如何使用keras建立cnn模型,加载mnist数据集,并且进行训练。那么问题来了,训练好的模型,如何进行保存进行利用?以及如何使用model进行预测新样本的类别,本文将给出详细介绍。
保存模型
模型的保存分为两步,一个是保存模型的结构,即architecture,这里的结构是不带参数的,保存为json文件,代码如下。

#save architecture
json_string = model.to_json()
open('./my_model_architecture.json','w').write(json_string)

第二个是保存权重,代码如下。

#save weights
model.save_weights('./my_model_weights.h5')

结合之前的mnist cnn模型代码,训练&保存模型全代码如下。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./", one_hot=True)
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras import optimizers
from keras.optimizers import SGD
import keras.models
from keras.models import load_model

if __name__ == "__main__":
print (mnist.train.images.shape,mnist.train.labels.shape)
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
x_train,y_train = mnist.train.images,mnist.train.labels
x_test,y_test= mnist.test.images,mnist.test.labels
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train = x_train.reshape(x_train.shape[0],28,28,1)
x_test = x_test.reshape(x_test.shape[0],28,28,1)
print (x_train.shape)
print (y_train.shape)
#build the model
model = Sequential()
model.add(Conv2D(32,(3,3),activation = 'relu',input_shape = (28,28,1),padding='same'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Conv2D(64,(3,3),activation = 'relu',padding='same'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Flatten())
model.add(Dense(128,activation = 'relu'))
model.add(Dense(10,activation = 'softmax'))
print (model.summary())
model.compile(loss=keras.losses.categorical_crossentropy,optimizer=sgd,metrics=['accuracy'])
model.fit(x_train,y_train,batch_size = 100,epochs = 1)
score = model.evaluate(x_test,y_test)
print ("loss: "+str(score[0]))
print ("accuracy: "+str(score[1]))
#save architecture
json_string = model.to_json()
open('./my_model_architecture.json','w').write(json_string)
#save weights
model.save_weights('./my_model_weights.h5')

这里为了速度,epoch设为1,一轮训练的模型精度在90%左右。

这个json文件打开内容如下:

{"class_name": "Sequential", "config": [{"class_name": "Conv2D", "config": {"name": "conv2d_1", "trainable": true, "batch_input_shape": [null, 28, 28, 1], "dtype": "float32", "filters": 32, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "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": "MaxPooling2D", "config
20000
": {"name": "max_pooling2d_1", "trainable": true, "pool_size": [2, 2], "padding": "valid", "strides": [2, 2], "data_format": "channels_last"}}, {"class_name": "Conv2D", "config": {"name": "conv2d_2", "trainable": true, "filters": 64, "kernel_size": [3, 3], "strides": [1, 1], "padding": "same", "data_format": "channels_last", "dilation_rate": [1, 1], "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": "MaxPooling2D", "config": {"name": "max_pooling2d_2", "trainable": true, "pool_size": [2, 2], "padding": "valid", "strides": [2, 2], "data_format": "channels_last"}}, {"class_name": "Flatten", "config": {"name": "flatten_1", "trainable": true, "data_format": "channels_last"}}, {"class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "units": 128, "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, "units": 10, "activation": "softmax", "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.2", "backend": "tensorflow"}

加载模型&使用模型预测测试样本类型
这里用一个test的样本来测试一下模型的预测结果,这里注意两点:(1)需要根据之前保存模型的json和h5,分别加载一次。(2)注意这里使用model.predict()函数,输入为四维向量。(这里只使用一个样本)

代码如下。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./", one_hot=True)
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras import optimizers
from keras.optimizers import SGD
import keras.models
from keras.models import load_model
from keras.models import model_from_json

if __name__ == "__main__":
x_test,y_test= mnist.test.images,mnist.test.labels
x_test = x_test.astype('float32')
x_test = x_test.reshape(x_test.shape[0],28,28,1)
my_model = model_from_json(open('./my_model_architecture.json').read())
my_model.load_weights('./my_model_weights.h5')
print(my_model.summary())
num_x = x_test.shape[0]
print(y_test[1:2])
print(my_model.predict(x_test[1:2]))

输出如下:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 32)        320
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 32)        0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 14, 14, 64)        18496
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 64)          0
_________________________________________________________________
flatten_1 (Flatten)          (None, 3136)              0
_________________________________________________________________
dense_1 (Dense)              (None, 128)               401536
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1290
=================================================================
Total params: 421,642
Trainable params: 421,642
Non-trainable params: 0
_________________________________________________________________
None
[[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]
[[8.4765656e-05 1.3002625e-04 9.9952304e-01 2.5596499e-04 6.8042225e-11
2.5410640e-07 7.5433627e-07 1.2265508e-08 5.2395180e-06 3.2515456e-11]]

最后两行分别为标注的one-hot编码 ,和模型预测的值,可以看出,这里的数字是2,在输出向量中,第三项为9.9952304e-01,也是最大的一项,结果准确。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐