搭建一个卷积神经网络文字手写字MNIST识别模型
环境配置
- 安装Tensorflow以及keras,要注意的是tensorflow和keras的版本要对应
pip install tensorflow=1.13.1,
pip install keras==2.2.4 - 导入所需要的包:
import numpy as np
import keras
import matplotlib as plt
from keras.datasets import mnist
from keras.models import Squential
from keras.layers import Dense,Dropout,Flatten,Activation
from keras.layers import Conv2D,Maxpooling2D
from keras import backend as k
MNIST数据集
MNIST数据集包含了70000张数字图片,其中60000张图片作为训练集,10000张图片作为测试集,尺寸大小为28281
MNIST数据集数据预处理
#载入数据,如果本地没有的话会自动从网上下载
(X_train,Y_train),(X_test,Y_test)=keras.datasets.mnist.load_data()
#把输入的数据整理成模型可以接受的格式
X_train=X_train.reshape(X_train.shape[0],28,28,1)
X_test=X_tset.reshape(X_test.shape[0],28,28,1)
#对输入进行归一化
X_train=X_train/255
X_test=X_test/255
#对输出进行one-hot-coding
Y_train=keras.utils.to_categorical(Y_train,10)
Y_test=keras.utils.to_categorical(Y_test,10)
模型的搭建
#AlexNet网络结构
model=keras.model.Sequential()
model.add(Conv2D(32,(3,3),input_shape=(28,28,1))) #卷积算子大小为(3,3),共32层
model.add(Activation('relu')) #卷积层后面加入激活函数
model.add(Conv2D(32,(3,3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pooling_size=(2,2))) #池化层,池化层算子的大小为(2,2)
#全连接神经网络分类器
model.add(Flatten())
model.add(Dense(200))
model.add(Activation('relu'))
model.add(Dense(200))
model.add(Activation('relu'))
model.add(Dense(10,activation='softmax'))
定义模型的优化器
adam=keras.optimizers.Adam(lr=0.001,beta_1=0.9,beta_2=0.999,epsilon=1e-08)
model.compile(loss='categorical_crossentropy',optimizer=adam,metrics=['accuracy'])
模型的训练以及一些结果展示
#训练模型
model.fit(X_train,Y_train,batch_size=100,epochs=10,verbose=1,validation_data=(X_test,Y_test))
#展示训练的结果
test_index=2
plt.imshow(X_test([test_index,:,:,0))
output=model.predict(X_test[test_index,:,:,:].reshape(1,28,28,1)
模型的存储
model.save("你的路径")
#模型的载入
from keras.models import load_model
model=load_model("你的路径")
model.summary() #模型展示