基于卷积神经网络CNN的手写数字识别 您所在的位置:网站首页 手写体数字识别实验 基于卷积神经网络CNN的手写数字识别

基于卷积神经网络CNN的手写数字识别

2023-12-21 22:04| 来源: 网络整理| 查看: 265

基于卷积神经网络CNN的手写数字识别 1.CNN卷积神经网络中的几个概念卷积核(Convolution Kernel)卷积(Convolution)池化(Pooling) 2.导入mnist手写数据集3.构建卷积神经网络4.训练卷积神经网络5.使用测试集测试6.参考文献

1.CNN卷积神经网络中的几个概念

想象现在你有一张手写数字图片,你需要识别它是0-9中的哪个数字,一种思路是寻找图片局部的特征,如果这个图片和某个数字的大部分局部特征最相似,则将该图片识别为该数字。

卷积核(Convolution Kernel)

卷积核就是判断为哪个数字所需要的图片的局部特征,不过CNN中卷积核的选择是由根据大量数据训练生成的,而不是我们人类根据经验选定的。如下图所示,中间三个小片段就是所谓的卷积核,就好比一块块小的拼图碎片,需要在被识别的图片中寻找相似的片段来决定和哪个数字相似。 卷积核

卷积(Convolution)

通俗的说,寻找局部相似片段的过程就叫做卷积,我的理解就是拿着上面的片段(卷积核)在被识别的图片上从上到下,从左到右比对一遍(这里还涉及到步长、边界补零等)。那么,如何将“比对”用数学运算来表示呢?如下图所示,将卷积核与图片相应位置分别做乘法后累加,累加的结果表征比对的“相似程度”。在原图经过标准化的情况下(数据标准化到-1与1之间),结果越接近1,说明原图的这个局部与要寻找的片段(卷积核)越相似,比如上图右边计算结果代表的格子越白(越接近1),原图该部位与相应卷积核越相似。 卷积

池化(Pooling)

什么是池化呢?我目前的理解是一种降维方法。在保留原图大部分特征的前提下,降低图片的尺寸,以达到减少运算量的目的。池化主要有最大值池化和平均值池化两种方法,如下图所示是最大值池化,将原图2X2方格中的最大值代表该局部的值,生成新的图片。这样就将原图4X4大小的数据降维到2X2大小,虽然数据信息减少了,但原图的重要特征任然保留。你可能感觉这种方法没什么大的作用,但当图片极其庞大,信息量巨大的情况下,池化是优化算法,减轻运算量的一种重要手段。 池化

2.导入mnist手写数据集 #导入相应模块和数据集 import numpy as np import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets('mnist_data',one_hot=True)

由于数据集较大,只选择一部分数据进行训练和测试

#获得训练集和测试集 X_train,y_train = mnist.train.images[:3000], mnist.train.labels[:3000] X_test,y_test = mnist.test.images[:1000], mnist.test.labels[:1000] #定义输出图片函数 def print_digits(images, y, max_n=10): # 图片尺寸 fig = plt.figure(figsize=(12, 12)) # 宽,高,英寸为单位 fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05) i = 0 while i input_x:X_train,output_y:y_train}) print("Step = %d, Train loss = %.4f,[Train accuracy = %.2f]" %(i,train_loss,train_accuracy)) Step = 0, Train loss = 2.2904,[Train accuracy = 0.13] Step = 1000, Train loss = 1.2188,[Train accuracy = 0.47] Step = 2000, Train loss = 0.5437,[Train accuracy = 0.60] Step = 3000, Train loss = 0.5143,[Train accuracy = 0.67] Step = 4000, Train loss = 0.2612,[Train accuracy = 0.72] Step = 5000, Train loss = 0.4200,[Train accuracy = 0.75] ...... Step = 44000, Train loss = 0.0969,[Train accuracy = 0.92] Step = 45000, Train loss = 0.1404,[Train accuracy = 0.93] Step = 46000, Train loss = 0.0506,[Train accuracy = 0.93] Step = 47000, Train loss = 0.0290,[Train accuracy = 0.93] Step = 48000, Train loss = 0.0867,[Train accuracy = 0.93] Step = 49000, Train loss = 0.0935,[Train accuracy = 0.93] 5.使用测试集测试 test_accuracy=sess.run(accuracy_op,{input_x:X_test,output_y:y_test}) print(test_accuracy) 0.9292303

可以看到,训练集准确率达到92%,说明对测试集的识别效果也较好

#查看测试集前20张 print_digits(X_test,y_test,20)

测试集前20张

#输出测试集前20个的预测值 test_output = sess.run(logits,{input_x:X_test[:20]}) y_pred = np.argmax(test_output,1) print(y_pred,'predicted numbers') print(np.argmax(y_test[:20],1),'real numbers') sess.close() [7 2 1 0 4 1 4 9 6 9 0 6 9 0 1 5 9 7 3 4] predicted numbers [7 2 1 0 4 1 4 9 5 9 0 6 9 0 1 5 9 7 3 4] real numbers

可以看出,对手写数字的识别效果较好。该卷积神经网络只使用了一层卷积+池化层,可以继续尝试使用多层卷积+池化层进行优化

6.参考文献

[1] 使用tensorflow实现CNN [2] tensorflow中文文档



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有