导入模块:
from keras.datasets import mnist from keras.utils import np_utils import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
下载手写数据集:
(x_Train,y_Train),(x_Test,y_Test)=mnist.load_data() print(x_Train.shape) print(y_Train.shape)
训练数据6000个,长度和宽度都是28,标签也是6000个。
图形化数据集,查看前10个数据集:
def polt_images_label_prediction(images,labels,idx,num=10): fig=plt.gcf() fig.set_size_inches(12,14) for i in range(num): ax=plt.subplot(5,2,1+i) ax.imshow(images[idx],cmap='binary') title='label='+str(labels[idx]) ax.set_title(title,fontsize=10) ax.set_xticks([]) ax.set_yticks([]) plt.show() polt_images_label_prediction(x_Train,y_Train,0)
数据预处理:
将features以reshape转化为6000*28*28*1的4维矩阵,并将其标准化。
x_Train4D=x_Train.reshape(x_Train.shape[0],28,28,1).astype('float32') x_Test4D = x_Test.reshape(x_Test.shape[0], 28, 28, 1).astype('float32') x_Train4D_normalize = x_Train4D / 255 x_Test4D_normalize = x_Test4D / 255
数据预处理,对标签进行one-hot编码处理:
#未转化第一个数是 5 print(y_Train[:1]) y_TrainOneHot = np_utils.to_categorical(y_Train) #转化 One-Hot Encoding 都是以0 1 表示,5 在第六个位置 print(y_TrainOneHot[:1])
建立模型:
#建立一个 Sequential 线性堆叠模型 model=Sequential() #建立第一个卷积层,input_shape 输入数字图像大小为 28*28*1, filters 卷积核个数 16 个,kernel_size 卷积核大小 3*3 #padding 是否零填充 same 表示填充, activation 激活函数 relu model.add(Conv2D(filters = 16, kernel_size = (3, 3), padding = 'same', input_shape = (28, 28, 1), activation = 'relu')) #建立第一个池化层 pool_size 池化窗口 2 model.add(MaxPooling2D(pool_size = (2, 2))) #建立第二个卷积层, filters 卷积核个数 36 个,kernel_size 卷积核大小 3*3 #padding 是否零填充 same 表示填充, activation 激活函数 relu model.add(Conv2D(filters = 36, kernel_size = (3, 3), padding = 'same', activation = 'relu')) #建立第二个池化层 pool_size 池化窗口 2 model.add(MaxPooling2D(pool_size = (2, 2))) #加入Dropout避免过度拟合 model.add(Dropout(0.25)) #建立平坦层,将多维向量转化为一维向量 model.add(Flatten()) #建立隐藏层,隐藏层有 128 个神经元, activation 激活函数用 relu model.add(Dense(128, activation = 'relu')) #加入Dropout避免过度拟合 model.add(Dropout(0.25)) #建立输出层,一共有 10 个神经元,因为 0 到 9 一共有 10 个类别, activation 激活函数用 softmax 这个函数用来分类 model.add(Dense(10, activation = 'softmax'))
查看模型摘要:
print(model.summary())
训练模型:
#定义训练模型, loss 损失函数用 categorical_crossentropy, optimizer 优化器用 adam, metrics 度量用 accuracy model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy']) #开始训练模型, x 是训练数据集, y 是训练数据集的标签, validation_split 是把训练数据集分为 8 份训练数据集 2 份验证集 #epochs 是迭代次数 20, batch_size 是批量 256, verbose 为 2 显示训练过程 train_history = model.fit(x = x_Train4D_normalize, y = y_TrainOneHot, validation_split = 0.2, epochs = 20, batch_size = 256, verbose = 2)
查看训练模型loss和accuracy:
def show_train_history(train_history, train, validation): plt.plot(train_history.history[train]) plt.plot(train_history.history[validation]) plt.title('Train History') plt.ylabel(train) plt.xlabel('Epoch') plt.legend(['train', 'validation'], loc = 'upper left') plt.show() show_train_history(train_history, 'loss', 'val_loss') show_train_history(train_history, 'accuracy', 'val_accuracy')
评估模型,准确率为99.21%。
scores = model.evaluate(x_Test4D_normalize, y_TestOneHot) print(scores[1])
预测模型:
#预测测试集第一个数字 prediction = np.argmax(model.predict(x_Test4D_normalize[:1])) print('预测值:', prediction) print('真实值:', np.argmax(y_TestOneHot[:1]))