用卷积神经网络CNN识别手写数字的方法

用卷积神经网络CNN识别手写数字的方法:

卷积神经网络,英文全称为Convolutional Neural Network。在手写数字识别上应用该神经网络,识别的准确率能提升到99%以上。下面我们来描述下利用CNN进行手写数字识别的基本思路。

卷积神经网络主要有下列几个部分组成:输入层(Input Layer),卷积层(Convolution Layer),池化层(Pooling Layer),全连接层(Fully Connected Network)

第一步,我们从输入层通过卷积运算来提取出卷积层。首先,我们要定义出特征图和偏置数:
w_fm1_in=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-w1′)
b_fm1=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-b1′)

第二步,把输入的图片数据和特征图进行卷积运算,并加上偏置数,然后使用激活函数Relu对数据进行处理,得到卷积后的数据层。卷积的运算方法是2个相同大小的矩阵的同一位置的数相乘,然后求和,举例如下:
假定矩阵M和N都为2×2矩阵:
M(0,0) M(0,1) N(0,0) N(0,1)
M(1,0) M(1,1) N(1,0) N(1,1)
卷积的结果是:M(0,0)*N(0,0)+M(0,1)*N(0,1)+M(1,0)*N(1,0)+M(1,1)*N(1,1)
x_conv_l1 = tf.nn.relu(_cnn_convolution_fun_(input_image, w_fm1) + b_fm1)

第三步:我们对上面得到的数据进行池化,以缩减图片的数据量。池化的方法是把图片切割成2X2的小方块,然后取每个小方块中的最大值来重新组合成一张图片。如一张28×28的图片,经过池化后就变成14×14。
x_pool_l1 = _cnn_max_pooling_fun_(x_conv_l1)

重复上述步骤,以获得两层的卷积结果:
w_fm2_in=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-w2′)
b_fm2=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-b2′)
x_conv_l2 = tf.nn.relu(_cnn_convolution_fun_(x_pool_l1, w_fm2) + b_fm2)
x_pool_l2 = _cnn_max_pooling_fun_(x_conv_l2)

经过上述的卷积运算后,我们把一张图片分离成大小为x*y的z张图片。接下来,我们把提取到的卷积图像压平成一个一维的数组,以进行全连接运算。
h_pool2_flat = tf.reshape(x_pool_l2, [-1, x*y*z])

在进行全连接运算前,我们要定义好全连接权重和偏置:
w_fcn1_in=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-w1′)
b_fcn1=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-b1′)

然后进行矩阵运算:
x_fcn_l1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fcn1) + b_fcn1)

为了获得更精确的运算结果,我们也可以多加一层全连接层:
w_fcn2_in=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-w2′)
b_fcn2=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-b2′)
y = tf.nn.softmax(tf.matmul(x_fcn_l1, w_fcn2) + b_fcn2)

程序的运行结果如下:
0:[ 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 ]=0.996759 num=5/5 Y
1:[ 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=0/0 Y
2:[ 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=4/4 Y
3:[ 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=1/1 Y
4:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 ]=1.000000 num=9/9 Y
。。。
79:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 ]=1.000000 num=7/7 Y
80:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 ]=0.999991 num=8/9 N
81:[ 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=0/0 Y
82:[ 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=2/2 Y
。。。
94:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 ]=1.000000 num=8/8 Y
95:[ 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=0/0 Y
96:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 ]=1.000000 num=7/7 Y
97:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 ]=1.000000 num=8/8 Y
98:[ 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=3/3 Y
99:[ 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=1/1 Y

由此,可以看出,采用卷积神经网络CNN后,手写数字的识别率能提高到99%

上文详细描述了采用卷积神经网络CNN进行手写数字识别的方法,如需转载,请勿用于商业目的,并注明:该文章出自圆点博士www.bspilot.com