基于之前的一篇博文
里面介绍了如何使用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