TensorFlow简单卷积神经(CNN)网络实现

数据集

本次依然使用MNIST数据集来进行卷积神经网络训练。

MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:

之间用简单神经网络进行手写识别的博文:http://www.omegaxyz.com/2018/04/26/tensorflow_mnist_simple/

简单卷积神经网络的流程

第一层卷积操作

需要输入的参数值有卷积核尺寸大小,即patch、图像通道数,卷积核的数目,代表会出现多少个卷积特征图像。

对于每一个卷积核都有一个对应的偏置量。

图片乘以卷积核,并加上偏执量,卷积结果28*28*32。

池化结果14*14*32 卷积结果乘以池化卷积核。

第二层卷积操作

32通道卷积,卷积出64个特征。

原图像尺寸28*28,第一轮图像缩小为14*14,共有32张,第二轮后图像缩小为7*7,共有64张。

第三层全连接操作

二维张量,第一个参数7*7*64的patch,也可以认为是只有一行7*7*64个数据的卷积,第二个参数代表卷积个数共1024个。

卷积操作,结果是1*1*1024,单行乘以单列等于1*1矩阵,matmul实现最基本的矩阵相乘,不同于tf.nn.conv2d的遍历相乘,自动认为是前行向量后列向量。

第四层输出操作

二维张量,1*1024矩阵卷积,共10个卷积,对应我们开始的ys长度为10。

最后的分类,结果为1*1*10 ,Softmax和Sigmoid都是基于logistic分类算法,一个是多分类一个是二分类。

注意

dropout操作,减少过拟合,其实就是降低上一层某些输入的权重scale,甚至置为0,升高某些输入的权值,甚至置为2,防止评测曲线出现震荡。

使用占位符,由dropout自动确定scale,也可以自定义,比如0.5,根据TensorFlow文档可知,程序中真实使用的值为1/0.5=2,也就是某些输入乘以2,同时某些输入乘以0。

代码

结果:

显然这个结果要比简单双层神经网络的效果要好。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注