任务背景
手写数字识别作为深度学习经典入门案例, 能够帮助您快速了解关于CNN卷积神经网络的模型结构及原理
卷积神经网络原理解析
请参考该博文: http://www.elecfans.com/rengongzhineng/580113.html
MNIST数据集介绍
请参考该博文: https://www.jianshu.com/p/050750a1bb5e
模型建立及训练
请参考该博文: https://blog.csdn.net/weixin_41196817/article/details/82770448
为方便, 我这里贴上代码:
#导入需要的包
from __future__ import print_function
import keras
from keras.models import Sequential
from keras.layers import Dense , Conv2D,MaxPooling2D,Flatten,Dropout
from keras.datasets import mnist
from keras import backend as K
#定义好一些参数
batch_size = 64
num_classes = 10
epochs = 12
# input image dimensions
img_rows, img_cols = 28, 28
#加载数据
(x_train ,y_train),(x_test,y_test) = mnist.load_data(path='mnist.npz') #选中,go_to_definiation ,把下载#的代码去掉
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape([x_train.shape[0],1,img_rows,img_cols])
x_test = x_test.reshape([x_test.shape[0],1,img_rows,img_cols])
input_shape = [1,img_rows,img_cols]
else:
x_train = x_train.reshape([x_train.shape[0],img_rows,img_cols,1])
x_test = x_test.reshape([x_test.shape[0],img_rows, img_cols,1])
input_shape = [img_rows,img_cols,1]
#单精度的数据类型更利于深度学习的计算
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#像素值都归一化到0-1之间
x_train /= 255
x_test /= 255
#对标签数据进行独热 编码
y_train = keras.utils.to_categorical(y_train,num_classes)
y_test = keras.utils.to_categorical(y_test , num_classes)
#构造模型了
model = Sequential() #更正:不是model.Sequential()
model.add(Conv2D(32,kernel_size =(3,3),activation='relu',input_shape = input_shape))
model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2))) #更正:这里是pool_size 不是kernel_size
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(num_classes,activation='softmax'))
model.compile(loss = keras.losses.categorical_crossentropy,optimizer = keras.optimizers.Adadelta(),metrics=['accuracy']) #这里的optimizers 有s
model.fit(x_train,y_train,batch_size = batch_size ,epochs = epochs,verbose=2,validation_data=(x_test,y_test)) #注意是epochs 不是es
score = model.evaluate(x_test,y_test,verbose=0)
print('Test Loss:', score[0])
print('Test Accuarcy:', score[1])
————————————————
版权声明:本文为CSDN博主「helun_wang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41196817/article/details/82770448
模型保存及预测
# 将整个模型保存为HDF5文件
model.save('./my_model.h5')
# 读取手机拍照图片并进行图片处理及预测
import os
from skimage import transform, io
import numpy as np
import keras
import warnings
warnings.filterwarnings('ignore')
# 定义读取图片
def deal_image(path):
test_images = []
images_list = os.listdir(path)
for image in images_list:
img = io.imread('./image/{}'.format(image), as_gray=True)
reimg = transform.resize(img, (28, 28))
test_images.append(reimg)
return test_images
# 读取图片
test_images = deal_image('./image')
# 重新创建完全相同的模型,包括其权重和优化程序
new_model = keras.models.load_model('my_model.h5')
# 预测结果
for test_image in test_images:
# 将白底黑字转化为黑底白字
test_image = 1 - test_image.reshape([-1, 28, 28, 1])
# 0.5位阈值, 作用是去除背景效果
test_image = np.where(test_image < 0.5, 0.1, 1)
# 预测数字并打印
number = new_model.predict(test_image)
print(number.reshape((10, )).argmax())