Python手写数字识别——卷积神经网络训练model

卷积

卷积(Convolution),也叫摺积,是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积。

卷积神经网络

卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络由卷积层、汇聚层和全连接层交叉堆叠而成,利用反向传播算法进行训练。卷积神经网络有三个特性:局部连接、权重共享以及子采样,这些特性使得卷积神经网络具有一定程度上的平移、缩放和旋转不变性,和前馈神经网络相比,其参数较少。

卷积层

卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。由于卷积网络主要应用在图像处理上,而图像为两维结构,因此为了更充分地利用图像的局部信息,通常将神经元组织为三维结构的神经层,其大小为高度 M × 宽度N×深度D,由D个M ×N大小的特征映射构成。

汇聚层(池化层)

汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量。池化也称为下采样,主要用于特征降维,压缩数据和参数数量,减小过拟合,提高模型的容错性,常用的有最大池化和平均池化。

全连接层

在卷积神经网络最后会加一个flatten层,将之前所得到的feature map“压平”,然后用一个全连接层输出最后的结果,如果是分类的话,一般会利用softmax激活函数,最后就可以输出相应的分类结果了。

书写数字识别model训练过程

此次卷积神经网络训练mnist,使用了3层卷积,1层全连接,激活函数为 softmax

下载mnist数据集,代码如下
mnist = keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
第一层卷积
# 一层卷积
model.add(
    Conv2D(
        filters=16,
        kernel_size=(5, 5),
        padding='same',  # 保证卷积核大小,不够补零
        input_shape=(28, 28, 1),
        activation='relu'))
第一层 池化
# 池化层1
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
第二层卷积和池化
# 二层卷积
model.add(
    Conv2D(filters=32, kernel_size=(5, 5), padding='same', activation='relu'))
# 池化层2
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
第三层卷积和池化层
model.add(
    Conv2D(filters=64, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(
    Conv2D(filters=128, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
全连接层
model.add(Flatten())  # 平坦层
model.add(Dense(128, activation='relu'))  # 全连接层
model.add(Dropout(0.25)) 
model.add(Dense(10, activation='softmax')) # 激活函数
训练模型
# 训练模型
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
train_history = model.fit(x=X_train4D_Normalize,
                          y=y_trainOnehot,
                          validation_split=0.2,
                          batch_size=300,
                          epochs=10,
                          verbose=2)

最后的效果还可以,训练准确率可以达到99%,测试准确率可以达到97%

此程序配合之前的手写板程序即可实现手写数字识别任务。

大家对程序有任何疑问或建议均可留言,感谢大家支持!!!

发布了14 篇原创文章 · 获赞 21 · 访问量 8199

猜你喜欢

转载自blog.csdn.net/qq_42078934/article/details/105016912
今日推荐