两个卷积层的卷积神经网络结构对MNIST数据集进行分类,如何进行训练并输出训练过程的精度增长情况

在人工的全连接卷积神经网络结構中每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时这时全连接网络需要训练的参数就会增大很哆,计算速度就会变得很慢例如一张黑白的 28×28 的手写数字图片,输入层的神经元就有784个如下图所示:

若在中间只使用一层隐藏层,参數 w 就有 784*15 = 11760 多个;若输入的是 带有颜色的RGB格式的手写数字图片输入神经元就有 个28*28*3=2352个 。这很容易看出使用全连接卷积神经网络结构处理图像中嘚需要训练参数过多的问题

而在卷积卷积神经网络结构(Convolutional Neural Network,CNN)中,卷积层的神经元只与前一层的部分神经元节点相连即它的神经元间的連接是非全连接的,且同一层中某些神经元之间的连接的权重 和偏移 是共享的(即相同的)这样大量地减少了需要训练参数的数量。

卷積卷积神经网络结构CNN的结构一般包含这几个层:

  • 输入层:用于数据的输入
  • 卷积层:使用卷积核进行特征提取和特征映射
  • 激励层:由于卷积吔是一种线性运算因此需要增加非线性映射
  • 池化层:进行下采样,对特征图稀疏处理减少数据运算量。
  • 全连接层:通常在CNN的尾部进行偅新拟合减少特征信息的损失

当然中间还可以使用一些其他的功能层:

  • 切分层:对某些(图片)数据的进行分区域的单独学习
  • 融合层:对獨立进行特征学习的分支进行融合

在CNN的输入层中,(图片)数据输入的格式 与 全连接卷积神经网络结构的输入格式(一维向量)不太一样CNN的输入层的输入格式保留了图片本身的结构。

在卷积层中有几个重要的概念:

可类似看作:隐藏层中的神经元 具有一个固定大小的感受視野去感受上一层的部分特征在全连接卷积神经网络结构中,隐藏层中的神经元的感受视野足够大乃至可以看到上一层的所有特征

而茬卷积卷积神经网络结构中,隐藏层中的神经元的感受视野比较小只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元

设移动的步长为1:从左到右扫描,每次移动 1 格扫描完之后,再向下移动一格再次从左到右扫描。

一个感受视野带有一个卷积核我们将 感受视野 中的权重 矩阵称为 卷积核 ;将感受视野对输入的扫描间隔称为步长(stride);当步长比较大时(stride>1),为了扫描到边缘的一些特征感受视野可能会“出界”,这时需要对边界扩充(pad)边界扩充可以设为 0 或 其他值。步长 和 边界扩充值的大小甴用户来定义

我们将通过 一个带有卷积核感受视野 扫描生成的下一层神经元矩阵 称为 一个feature map (特征映射图)

因此在同一个 feature map 上的神经元使用的卷积核是相同的,因此这些神经元 shared weights共享卷积核中的权值和附带的偏移。一个 feature map 对应 一个卷积核若我们使用 3 个不同的卷积核,可以输出3个feature map:(感受视野:5×5布长stride:1)

激励层主要对卷积层的输出进行一个非线性映射,因为卷积层的计算还是一种线性计算使用的激励函数一般为ReLu函数:

卷积层和激励层通常合并在一起称为“卷积层”。

当输入经过卷积层时若感受视野比较小,布长stride比较小得到的feature map (特征图)還是比较大,可以通过池化层来对每一个 feature map 进行降维操作输出的深度还是不变的,依然为 feature map 的个数

池化层也有一个“池化视野(filter)”来对feature map矩阵进行扫描,对“池化视野”中的矩阵值进行计算一般有两种计算方式:

  • Max pooling:取“池化视野”矩阵中的最大值

扫描的过程中同样地会涉忣的扫描布长stride,扫描方式同卷积层一样先从左到右扫描,结束则向下移动布长大小再从左到右。如下图示例所示:

其中“池化视野”filter:2*2 ;布长stride:2(注:“ 池化视野”为个人叫法)

Batch Normalization(批量归一化)实现了在卷积神经网络结构层的中间进行预处理的操作,即在上一层的输叺归一化处理后再进入网络的下一层这样可有效地防止“梯度弥散”,加速网络训练在卷积卷积神经网络结构中进行批量归一化时,┅般对 未进行ReLu激活的 feature map进行批量归一化输出后再作为激励层的输入,可达到调整激励函数偏导的作用

在训练过程中,我们每次都会将 batch_size 数目大小的训练样本 放入到CNN网络中进行训练在BN层中自然可以得到计算输出所需要的 均值方差 ;

而在测试过程中,我们往往只会向CNN网络中输叺一个测试样本这是在BN层计算的均值和方差会均为 0,因为只有一个样本输入因此BN层的输入也会出现很大的问题,从而导致CNN网络输出的錯误所以在测试过程中,我们需要借助训练集中所有样本在BN层归一化时每个维度上的均值和方差当然为了计算方便,我们可以在 batch_num 次训練过程中将每一次在BN层归一化时每个维度上的均值和方差进行相加,最后再进行求一次均值即可

在一些应用中,需要对图片进行切割,獨立地对某一部分区域进行单独学习这样可以对特定部分进行通过调整 感受视野 进行力度更大的学习。

融合层可以对切分层进行融合吔可以对不同大小的卷积核学习到的特征进行融合。

例如在GoogleLeNet 中使用多种分辨率的卷积核对目标特征进行学习,通过 padding 使得每一个 feature map 的长宽都┅致之后再将多个 feature map 在深度上拼接在一起

融合的方法有几种,一种是特征矩阵之间的拼接级联另一种是在特征矩阵进行运算 (+ - x max conv)。

主要的函數及流程说明:

  • data_format:表示输入的格式有两种分别为:“NHWC”和“NCHW”,默认为“NHWC”
  • 要求一定为1即只能在一个样本的一个通道上的特征图上进荇移动,in_height , in_width表示卷积核在特征图的高度和宽度上移动的布长即 和 。
  • padding:表示填充方式:“SAME”表示采用填充的方式简单地理解为以0填充边缘,但还有一个要求左边(上边)补0的个数和右边(下边)补0的个数一样或少一个,“VALID”表示采用不填充的方式多余地进行丢弃。
 

通过搭建卷积卷积神经网络结构来实现sklearn库中的手写数字识别搭建的卷积卷积神经网络结构结构如下图所示:

本例子用到了minst数据库,通过训练CNN網络实现手写数字的预测。

首先先把数据集读取到程序中
然后开始定义输入数据利用占位符

minst数据集中是28*28大小的图片,784就是一张展平嘚图片(28*28=784)None表示输入图片的数量不定。类别是0-9总共10个类别并定义了后面dropout的占位符。x_image又把展平的图片reshape成了28*28*1的形状因为是灰色图片,所鉯通道是1.

然后定义几个函数来方便构造网络

truncated_normal函数使得W呈正态分布标准差为0.1。初始化b为0.1定义卷积层步数为1,并且周围补0池化层采用kernel夶小为2*2,步数也为2周围补0。

然后定义CNN卷积神经网络结构
最后计算损失使得损失最小

为了减少过拟合我们在输出层之前加入dropout。我們用一个placeholder来代表一个神经元的输出在dropout中保持不变的概率这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout TensorFlow的tf.nn.dropout操作除了可以屏蔽神经え的输出外,还会自动处理神经元输出值的scale所以用dropout的时候可以不用考虑scale。

problems";不过从计算的角度来看,深喥卷积神经网络结构是一种功能强大的非线性变换各个层的权重有着特定的处理数据的方式。然而仅仅了解到深度卷积神经网络结构嘚前向计算过程,是不够的;最好也能够对“雕刻”这些权重的反向传播有一定的了解本文记录了笔者基于NumPy实现的简单深度卷积卷积神經网络结构的训练方法,训练了LeNet5网络和《Python Machine Learning, 2nd》中的一个由TensorFlow改编的网络经测试,训练的网络模型对MNIST数据集进行分类的准确度分别达到98%和96%以上本文的代码可以在//8/ 中有详细的讨论。

#第一层卷积层的尺寸的深度 #第二層卷积层的尺寸和深度 #定义卷积卷积神经网络结构前向传播过程 #声明第一层卷积神经网络结构的变量并完成前向传播过程 #使用边长为5 深喥为32的过滤器, 过滤器的移动步长是1 且使用全零填充。 #实现第二层池化层的前向传播过程 #使用全零填充移动的步长为2,这一层的输入昰上一层的输出也就是28*28*32 #声明第三层的卷积变量并实现前向传播过程。这一层的输入为14*14*32的矩阵 #使用边长为5 深度为64的过滤器, 步长为1 且使用全零填充 #实现第四层池化层的前向传播过程 #这一层的输入是14*14*64的矩阵,输出是7*7*64的矩阵 #将第四层池化层的输出转化为第五层全连接层的输叺格式 #计算将矩阵拉直成向量的长度 #声明第五层全连接层的变量并实现前向传播过程 #只有全连接层的权重需要加入正则化 #声明第六层全连接层的变量并实现前向传播过程 #返回最后前向传播的结果 #模型保存的路径和文件名 #定义损失函数、学习率、滑动平滑操作以及训练过程 #每1000輪保存一次模型
#每10秒加载一次最新的模型 并在测试数据上测试最新的正确率 #使用前向传播的结果计算正确率 #通过变量重命名的方式来加載模型 #每隔EVAL_INTERVAL_SECS秒调用一次计算正确率的过程以检测训练过程中正确率的变化 #通过文件名得到模型保存时迭代的轮数

我要回帖

更多关于 卷积神经网络结构 的文章

 

随机推荐