点击查看 (人工智能) 系列文章
训练过程
1. 数据准备
2. 创建模型
3. 模型解析
从输出结果可以看到各层的基本信息:
- 第一层输入是28x28的图像,基于3x3的卷积核,没有滑动,因此得到26x26的输出,32是核数
- 第二层输入来自第一层的输出,因此输入为26x26,64为第二层的卷积核数量
- 第五层只是将第四层的数据摊平成一维向量,因此不需要进行参数训练
- 第六层将上一层的9216个神经元减小到128个神经元,需要训练的模型参数最大,有1179776个,差不多120万个参数
- 第八层类似第六层,有1290个参数需要训练
- 最后统计结果看到,一共有1199882个参数,都需要训练
4. 模型编译训练
5. 结果分析
从结果可以看出,基于CNN的训练比单纯的Softmax的分类预测准确率更高,可以从更高层次进行抽象和特征提取,从文章(基于softmax的手写数字识别)中可以看到只是softmax进行像素级别的提取,准确率不到98%。
源码
# 数据读取
from keras.datasets import mnist
(imgTrain, labelTrain),(imgTest, labelTest) = mnist.load_data('mnist.npz')
# 数据处理
from keras import backend as K
trainCount, testCount = imgTrain.shape[0], imgTest.shape[0]
imgRow, imgCol = imgTrain.shape[1], imgTrain.shape[2]
if K.image_data_format() == 'channels_first':
imgTrain = imgTrain.reshape(trainCount, 1, imgRow, imgCol)
imgTest = imgTest.reshape(testCount, 1, imgRow, imgCol)
inputShape = (1, imgRow, imgCol)
else:
imgTrain = imgTrain.reshape(trainCount, imgRow, imgCol, 1)
imgTest = imgTest.reshape(testCount, imgRow, imgCol, 1)
inputShape = (imgRow, imgCol, 1)
imgTrain = imgTrain.astype('float32')
imgTest = imgTest.astype('float32')
imgTrain /= 255
imgTest /= 255
# onehot 编码
from keras.utils import np_utils
rstCount = 10
rstTrain = np_utils.to_categorical(labelTrain, rstCount)
rstTest = np_utils.to_categorical(labelTest, rstCount)
# 定义CNN网络
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = Sequential()
# 第一层卷积:32个3x3的卷积核
model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu', input_shape=inputShape))
# 第二层卷积:64个3x3的卷积核
model.add(Conv2D(filters=64, kernel_size=(3,3), activation='relu'))
# 使用2x2的最大值池化方法,减少输入数据
model.add(MaxPooling2D(pool_size = (2,2)))
# 随机丢弃25%的输入神经元,防止过拟合,减少计算量
model.add(Dropout(0.25))
# 将输入数据整合为1维向量
model.add(Flatten())
# 选择128个神经元
model.add(Dense(128, activation='relu'))
#随机丢弃50%的输入神经元
model.add(Dropout(0.5))
# 使用softmax激活函数进行多分类,将各个数字的概率作为输出层结果
model.add(Dense(rstCount, activation='softmax'))
# 查看模型概述
model.summary()
# 编译模型
model.compile(loss = 'categorical_crossentropy', metrics=['accuracy'], optimizer = 'adam')
# 训练模型
history = model.fit(imgTrain, rstTrain, batch_size=128, epochs=5, verbose=2, validation_data=(imgTest, rstTest))
# 模型在测试集上结果查看
import numpy as np
lossMetrics = model.evaluate(imgTest, rstTest, verbose=2)
print("测试数据最终损失值:{}".format(lossMetrics[0]))
print("测试数据精度:{}".format(lossMetrics[1] * 100))
rstPredict = model.predict(imgTest)
rstPredict = np.argmax(rstPredict, axis = 1)
correctDatas = np.nonzero(rstPredict == labelTest)[0]
wrongDatas = np.nonzero(rstPredict != labelTest)[0]
print("预测正确个数:{}".format(len(correctDatas)))
print("预测错误个数:{}".format(len(wrongDatas)))
版权声明:本文为suoxd123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。