博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
卷积神经网络原理简介
阅读量:3949 次
发布时间:2019-05-24

本文共 3726 字,大约阅读时间需要 12 分钟。

1,概念简介

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。

卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)要求,并被大量应用于计算机视觉、自然语言处理等领域。

卷积神经网络可用于分类,检索,识别(分类和回归),分割,特征提取,关键点定位(姿势识别)等等。

2,与神经网络的对比

在这里插入图片描述
左图为神经网络(全连接结构),右图为卷积神经网络。卷积神经网络组成:输入层;卷积层;激活函数;池化层;全连接层(INPUT - CONV - RELU - POOL - FC)
在这里插入图片描述

3,卷积层

卷积层是整个神经网络中最重要的一层,该层最核心的部分为过滤器,或者称为卷积核,卷积核有大小和深度两个属性,大小常用的有3X3、5X5,也有11X11的卷积核,而深度通俗一点理解就是卷积核的个数。卷积核的大小和深度均由人工指定,而权重参数则在初始化的时候由程序随机生成,并在后期训练过程中不断优化这些权重值,以达到最好的分类效果。卷积的过程就是用这些权重值不断的去乘这些图片的RGB值,以提取图片数据信息。

tf.nn.conv2d(i, k,strides,padding='VALID')

卷积不仅可以提取图片信息,也可以达到降维效果。如果希望卷积后的特征值维度和原图片一致,需要设置padding值(全零填充)为SAME(如果为VALID表示不填充),其中i为输入图片,k为卷积核大小,strides为移动步长(移动步长>1也可以达到降维的效果)。

假设输入图像的大小为(32,32,3),卷积核大小为(5,5,3)。卷积核的深度和输入图像的深度必须一致(这里为3)。

卷积(特征提取)的结果是对于特定大小的区域(大小和卷积核大小相同)提取一个特征值来代表该区域,遍历图片的所有区域便得到一个由特征值组成的特征图。在卷积过程中可指定卷积核的个数(大小都相同),便可得到多个特征图。

在这里插入图片描述卷积的对象除了输入的图像外,还可以是特征图:

在这里插入图片描述实际卷积的结果(根据提取特征的结果进一步完成分类或回归的任务):
在这里插入图片描述
卷积的计算示例:
输入图像大小(7,7,3),指定卷积核大小(3,3,3),通过卷积核窗口的移动(从左到右,由上至下)去遍历图像的所有区域(做内积运算,即对应元素相乘再求和),然后对各个深度的结果求和再加上偏置项b,得到最终结果。各个卷积核中的参数通过卷积神经网络的前向传播和反向传播调节
在这里插入图片描述
滑动步长(stride)
在这里插入图片描述
滑动步长越大,得到的特征图越小,一般情况希望特征值越多越好,因此滑动步长一般较小,但考虑到计算量,滑动步长不能过小。

在卷积过程中不同的像数点对结果贡献的信息量有可能不同。为了更好地利用边缘像素点的信息,在边缘外围增加若干个填充层(pading),下图为0填充:

在这里插入图片描述

计算输出大小:
输入大小为:W1 x H1 x D1;需要指定的超参数:filter个数(K),filter大小(F),步长(S),边界填充(P)
输出大小的公式:
在这里插入图片描述
在这里插入图片描述
卷积参数(权重)共享原则

每个特征图上所有的特征值都进行权重w共享,并拥有自己的偏置项b,故对于上图的卷积操作共涉及的参数个数计算如下:

在这里插入图片描述
卷积计算完成后,往往会加入一个修正线性单元ReLU函数,也就是把数据非线性化。为什么要把数据进行非线性化呢,这是因为非线性代表了输入和输出的关系是一条曲线而不是直线,曲线能够刻画输入中更为复杂的变化。比如一个输入值大部分时间都很稳定,但有可能会在某个时间点出现极值,但是通过ReLU函数以后,数据变得平滑,这样以便对复杂的数据进行训练。
在这里插入图片描述
ReLU是分段线性的,当输入为非负时,输出将与输入相同;而当输入为负时,输出均为0。它的优点在于不受“梯度消失”的影响,且取值范围为[0,+∞];其缺点在于当使用了较大的学习速率时,易受达到饱和的神经元的影响。

4,池化层

卷积层后一般会加入池化层,池化层可以非常有效地缩小矩阵的尺寸,从而减少最后全链层中的参数,使用池化层既可以加快计算速度也有防止过拟合问题的作用。

池化层也存在一个过滤器,但是过滤器对于输入的数据的处理并不是像卷积核对输入数据进行节点的加权和,而只是简单的计算最大值或者平均值。过滤器的大小、是否全0填充、步长等也是由人工指定,而深度跟卷积核深度不一样,卷积层使用过滤器是横跨整个深度的,而池化层使用的过滤器只影响一个深度上的节点,在计算过程中,池化层过滤器不仅要在长和宽两个维度移动,还要在深度这个维度移动。使用最大值操作的池化层被称之为最大池化层,这种池化层使用得最多,使用平均值操作的池化层被称之为平均池化层,这种池化层的使用相对要少一点。

Tensorflow程序很容易就可以实现最大值池化层的操作:

pool = tf.nn.max_pool(i, ksize=[1,3,3,1], stride=[1,2,2,1], padding='SAME')# i为输入矩阵# ksize为过滤器尺寸,其中第一个和第四个值必须为1,表示过滤器不可以垮不同的输入样列和节点矩阵深度。中间的两个值为尺寸,常使用2*2或3*3。# stride为步长,第一个值和第四个值与ksize一样# padding为全0填充,‘SAME’表示使用全0填充,‘VALID’表示不使用全0填充

池化层(Pooing layer)一般是对特征图进行特征压缩(利用区域内均值或最大值代表该区域,无权重参数)操作(下采样)。

在这里插入图片描述
Pooing操作结果示例:
在这里插入图片描述5,全连接层

在KNN或线性分类中有对数据进行归一化处理,而在神经网络中,也会做数据归一化的处理,原因和之前的一样,避免数据值大的节点对分类造成影响。归一化的目标在于将输入保持在一个可接受的范围内。例如,将输入归一化到[0.0,1.0]区间内。在卷积神经网络中,对数据归一化的处理我们有可能放在数据正式输入到全连接层之前或之后,或其他地方,每个网络都可能不一样。

全链层的作用就是进行正确的图片分类,不同神经网络的全连接层层数不同,但作用确是相同的。输入到全连接层的神经元个数通过卷积层和池化层的处理后大大的减少了,比如以AlexNet为例,一张227*227大小,颜色通道数为3的图片经过处理后,输入到全连接层的神经元个数有4096个,最后softmax的输出,则可以根据实际分类标签数来定。

在全连接层中,会使用dropout以随机的去掉一些神经元,这样能够比较有效地防止神经网络的过拟合。相对于一般如线性模型使用正则的方法来防止模型过拟合,而在神经网络中Dropout通过修改神经网络本身结构来实现。对于某一层神经元,通过定义的概率来随机删除一些神经元,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新,下一次迭代中,重新随机删除一些神经元,直至训练结束。

在这里插入图片描述

6,前向传播和反向传播原理

6.1 卷积层的前向传播:

在这里插入图片描述
这里输入图像的数据x有4个维度分别代表编号(一般在实际操作中都是通过batch对输入数据进行批量操作的,这里是去一个batch中的第一个图片举例说明),图片通道数(RGB),图片高h,图片宽w。上图选择3个卷积核,其中4个维度分别代表卷积核的编号,与图片通道数相对应的编号,卷积核的高和宽。

6.2 卷积层的反向传播:

在这里插入图片描述
卷积层的反向传播的目的是为了更新权重参数w,上图展示了第一个卷积核的反向传播过程,为了更新参数w。因此要先算出dJ/dw。假设上一层会传过来一个梯度dJ/dout,根据链式求导法则,因此dJ/dw = dJ/dout * dout/dw =dJ/dout * x 。在计算机中方便为变量命名的缘故,将dJ/dout记为dout,dJ/dw记为dw,即图中的情况。后面也用这个记号来讲。

首先要清楚:dw 和 w 的尺寸是一样的。一个点乘以一个区域还能得到一个区域。那么反向传播过程就相当于:用dout中的一个元素乘以输入层划窗里的矩阵便得到一个dw矩阵;然后滑动滑窗,继续求下一个dw,依次下去,最后将得到的多个dw相加,执行 w = w - dw 就完成了反向传播的计算。

6.3 池化层的前向传播和反向传播

在这里插入图片描述
上图分别对应mean和max两种池化方式前向传播和反向传播的结果。对于mean池化方式在反向传播时是将对应值直接均摊到对应区域;对于max池化方式在反向传播时是只在原来最大值处有值(前后相同),对应区域的其他位置均为0。

转载地址:http://kohwi.baihongyu.com/

你可能感兴趣的文章
动态规划-背包问题
查看>>
Windows10 + Nodejs调用C++语言Dll
查看>>
CSAPP - 一个简单的Shell
查看>>
《算法4》 Windows/Mac环境下使用Visual Studio Code和Orcale JDK1.8开发环境搭建
查看>>
精心整理很实用的前端笔记,看完你就在css上有很深的造诣了!!!
查看>>
前端开发在工作中用到的工具、软件、库.......------Sesiid
查看>>
正则表达式~~~很全的------Sestid
查看>>
在HTML中嵌入百度地图------Sestid
查看>>
Js或jQuery图片层叠轮播------Sestid
查看>>
js或jQuery实现返回顶部功能------Sestid
查看>>
JS实现拖拽效果------Sestid
查看>>
jQuery实现倒计时秒杀效果------Sestid
查看>>
jQuery实现html网页顶部自适应导航栏(media)------Sestid
查看>>
鼠标悬停显示下划线(带小特效)------Sestid
查看>>
jQuery 实现input搜索框自动匹配------Sestid
查看>>
Js 实现回车键触发登录,并弹出需要输入信息------Sestid
查看>>
Js字符串和数组方法及使用------Sestid
查看>>
JavaScript常用算法(面试)------Sestid
查看>>
Js或者jQuery实现点击图片出现蒙层并将图片放大在蒙层上------Sestid
查看>>
Js,jQuery事件、效果大全------Sestid
查看>>