热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

卷积神经网络CNN算法原理

写在前面在上一篇【Deeplearning】卷积神经网络CNN结构中我们简单地介绍了CNN的结构。接下来我们看看这种结构的CNN模型是怎么运行的,包括CNN的前向传

写在前面

在上一篇【Deep learning】卷积神经网络CNN结构中我们简单地介绍了CNN的结构。接下来我们看看这种结构的CNN模型是怎么运行的,包括CNN的前向传播和反向传播算法。


1.CNN前向传播算法

(1)输入层前向传播到卷积层

输入层的前向传播是CNN前向传播算法的第一步。一般输入层对应的都是卷积层,因此我们标题是输入层前向传播到卷积层。

我们这里还是以图像识别为例。先考虑最简单的,样本都是二维的黑白图片。这样输入层X就是一个矩阵,矩阵的值等于图片的各个像素位置的值。这时和卷积层相连的卷积核W就也是矩阵。如果样本都是有RGB的彩色图片,这样输入X就是3个矩阵,即分别对应R,G和B的矩阵,或者说是一个张量。这时和卷积层相连的卷积核W就也是张量,对应的最后一维的维度为3.即每个卷积核都是3个子矩阵组成。同样的方法,对于3D的彩色图片之类的样本,我们的输入X可以是4维,5维的张量,那么对应的卷积核W也是个高维的张量。不管维度多高,对于我们的输入,前向传播的过程可以表示为:

a^{2}=\sigma\left(z^{2}\right)=\sigma\left(a^{1} * W^{2}+b^{2}\right)

其中,上标代表层数,星号代表卷积,而b代表我们的偏倚, σ为激活函数,这里一般都是ReLU。

 

和DNN的前向传播比较一下,其实形式非常的像,只是我们这儿是张量的卷积,而不是矩阵的乘法。同时由于W是张量,那么同样的位置,W参数的个数就比DNN多很多了。为了简化我们的描述,本文后面如果没有特殊说明,我们都默认输入是3维的张量,即用RBG可以表示的彩色图片。

这里需要我们自己定义的CNN模型参数是:

    1) 一般我们的卷积核不止一个,比如有K个,那么我们输入层的输出,或者说第二层卷积层的对应的输入就K个。
    2) 卷积核中每个子矩阵的的大小,一般我们都用子矩阵为方阵的卷积核,比如FxF的子矩阵。
    3) 填充padding(以下简称P),我们卷积的时候,为了可以更好的识别边缘,一般都会在输入矩阵在周围加上若干圈的0再进行卷积,加多少圈则P为多少。

    4) 步幅stride(以下简称S),即在卷积过程中每次移动的像素距离大小。

(2)隐藏层前向传播到卷积层

现在我们再来看普通隐藏层前向传播到卷积层时的前向传播算法。

假设隐藏层的输出是M个矩阵对应的三维张量,则输出到卷积层的卷积核也是M个子矩阵对应的三维张量。这时表达式和输入层的很像,也是:

a^{l}=\sigma\left(z^{l}\right)=\sigma\left(a^{l-1} * W^{l}+b^{l}\right)

和上一节唯一的区别仅仅在于,这里的输入是隐藏层来的,而不是我们输入的原始图片样本形成的矩阵。

需要我们定义的CNN模型参数也和上一节一样,这里我们需要定义卷积核的个数K,卷积核子矩阵的维度F,填充大小P以及步幅S。

(3)隐藏层前向传播到池化层

池化层的处理逻辑是比较简单的,我们的目的就是对输入的矩阵进行缩小概括。比如输入的若干矩阵是NxN维的,而我们的池化大小是kxk的区域,则输出的矩阵都是N/k × N/k维的。

这里需要需要我们定义的CNN模型参数是:

    1)池化区域的大小k
    2)池化的标准,一般是MAX或者Average。

(4)隐藏层前向传播到FC层

由于全连接层就是普通的DNN模型结构,因此我们可以直接使用DNN的前向传播算法逻辑,即:

a^{l}=\sigma\left(z^{l}\right)=\sigma\left(W^{l} a^{l-1}+b^{l}\right)

这里的激活函数一般是sigmoid或者tanh。经过了若干全连接层之后,最后的一层为Softmax输出层。此时输出层和普通的全连接层唯一的区别是,激活函数是softmax函数。

这里需要需要我们定义的CNN模型参数是:

    1)全连接层的激活函数
    2)全连接层各层神经元的个数

CNN前向传播算法小结:

 


2. CNN反向传播算法

对于CNN反向传播,首先要理解DNN反向传播算法。举个栗子:

现在我们把同样的思想用到CNN中,很明显,CNN有些不同的地方,不能直接去套用DNN的反向传播算法的公式。

要套用DNN的反向传播算法到CNN,有几个问题需要解决:
    1)池化层没有激活函数,没有需要学习的参数。这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1.
    2)池化层在前向传播的时候,对输入进行了压缩,那么我们现在需要向前反向推导δl−1,这个推导方法和DNN完全不同。
    3) 卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得的当前层的输出,这和DNN很不相同,DNN的全连接层是直接进行矩阵乘法得到当前层的输出。这样在卷积层反向传播的时候,上一层的δl−1递推计算方法肯定有所不同。
    4)对于卷积层,由于W使用的运算是卷积,那么从δl推导出该层的所有卷积核的W,b的方式也不同。

从上面可以看出,问题1比较好解决,但是问题2,3,4就需要好好的动一番脑筋了,而问题2,3,4也是解决CNN反向传播算法的关键所在。另外大家要注意到的是,DNN中的al,zl都只是一个向量,而我们CNN中的al,zl都是一个张量,这个张量是三维的,即由若干个输入的子矩阵组成。

下面我们就针对问题2,3,4来一步步研究CNN的反向传播算法。

在研究过程中,需要注意的是,由于卷积层可以有多个卷积核,各个卷积核的处理方法是完全相同且独立的,为了简化算法公式的复杂度,我们下面提到卷积核都是卷积层中若干卷积核中的一个。

(1)已知池化层的\large \delta^l,推导上一隐藏层的\large \delta^{l-1}

我们首先解决上面的问题2,如果已知池化层的\large \delta^l,推导出上一隐藏层的\large \delta^{l-1}

在前向传播算法时,池化层一般我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后的误差\large \delta^l,还原前一次较大区域对应的误差。

在反向传播时,我们首先会把\large \delta^l的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是MAX,则把\large \delta^l的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把\large \delta^l的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。

用一个例子可以很方便的表示:假设我们的池化区域大小是2x2。\large \delta^l的第k个子矩阵为:

\delta_{k}^{l}=\left( \begin{array}{ll}{2} & {8} \\ {4} & {6}\end{array}\right)

由于池化区域为2x2,我们先将δlk做还原,即变成:

\left( \begin{array}{llll}{0} & {0} & {0} & {0} \\ {0} & {2} & {8} & {0} \\ {0} & {4} & {6} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right)

如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:

\left( \begin{array}{llll}{2} & {0} & {0} & {0} \\ {0} & {0} & {0} & {8} \\ {0} & {4} & {0} & {0} \\ {0} & {0} & {6} & {0}\end{array}\right)

如果是Average,则进行平均:转换后的矩阵为:

\left( \begin{array}{cccc}{0.5} & {0.5} & {2} & {2} \\ {0.5} & {0.5} & {2} & {2} \\ {1} & {1} & {1.5} & {1.5} \\ {1} & {1} & {1.5} & {1.5}\end{array}\right)

 

这样我们就得到了上一层\frac{\partial J(W, b)}{\partial a_{k}^{L-1}}的值,要得到上一层的误差:

\delta_{k}^{l-1}=\frac{\partial J(W, b)}{\partial a_{k}^{l-1}} \frac{\partial a_{k}^{l-1}}{\partial z_{k}^{l-1}}=u p s a m p l e\left(\delta_{k}^{l}\right) \odot \sigma^{\prime}\left(z_{k}^{l-1}\right)

其中upsample函数表示池化层的误差传递,后面的求导是池化层前一层的误差传递

总结一下,对于\large \delta^l,有:

\delta^{l-1}=u p s a m p l e\left(\delta^{l}\right) \odot \sigma^{\prime}\left(z^{l-1}\right)

(2)已知卷积层的\large \delta^l,推导上一隐藏层的\large \delta^{l-1}

对于卷积层的反向传播,我们首先回忆下卷积层的前向传播公式:

a^{l}=\sigma\left(z^{l}\right)=\sigma\left(a^{l-1} * W^{l}+b^{l}\right)

在DNN中,我们知道\large \delta^{l-1}\large \delta^l的递推关系为:

\delta^{l}=\frac{\partial J(W, b)}{\partial z^{l}}=\frac{\partial J(W, b)}{\partial z^{l+1}} \frac{\partial z^{l+1}}{\partial z^{l}}=\delta^{l+1} \frac{\partial z^{l+1}}{\partial z^{l}}

因此要推导出\large \delta^l\large \delta^{l-1}的递推关系,必须计算\frac{\partial z^{l}}{\partial z^{l-1}}的梯度表达式。

注意到两者是有递推关系的:

z^{l}=a^{l-1} * W^{l}+b^{l}=\sigma\left(z^{l-1}\right) * W^{l}+b^{l}

因此可以得出:

\delta^{l-1}=\delta^{l} \frac{\partial z^{l}}{\partial z^{l-1}}=\delta^{l} * r o t 180\left(W^{l}\right) \odot \sigma^{\prime}\left(z^{l-1}\right)

这里的式子其实和DNN的类似,区别在于对于含有卷积的式子求导时,卷积核被旋转了180度。即式子中的rot180(),翻转180度的意思是上下翻转一次,接着左右翻转一次。在DNN中这里只是矩阵的转置。那么为什么呢?可以参考转置卷积。

(3)已知卷积层的\large \delta^l,推导该层的W,b参数的梯度

到现在为止,我们已经完成了最艰难的误差传递计算,接下来就需要对网络中的参数进行更新。对于全连接层,可以直接按照DNN的算法来求得参数的梯度。而对于池化层,没有参数,故也不用求。现在只剩下卷积层的参数需要我们计算。

在前向传播中,卷积层有:

z^{l}=a^{l-1} * W^{l}+b

因此我们有:

\frac{\partial J(W, b)}{\partial W^{l}}=\frac{\partial J(W, b)}{\partial z^{l}} \frac{\partial z^{l}}{\partial W^{l}}=a^{l-1} * \delta^{l}

\frac{\partial J(W, b)}{\partial b^{l}}=\sum_{u, v}\left(\delta^{l}\right)_{u, v}


推荐阅读
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 卷积神经网络(CNN)基础理论与架构解析
    本文介绍了卷积神经网络(CNN)的基本概念、常见结构及其各层的功能。重点讨论了LeNet-5、AlexNet、ZFNet、VGGNet和ResNet等经典模型,并详细解释了输入层、卷积层、激活层、池化层和全连接层的工作原理及优化方法。 ... [详细]
  • 大数据时代的机器学习:人工特征工程与线性模型的局限
    本文探讨了在大数据背景下,人工特征工程与线性模型的应用及其局限性。随着数据量的激增和技术的进步,传统的特征工程方法面临挑战,文章提出了未来发展的可能方向。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 图像分类:KNN算法(K—最近邻算法) 一.定义 定义:KNN是通过测量不同特征值之间的距离进行分类。它的的思路是ÿ ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深度学习理论解析与理解
    梯度方向指示函数值增加的方向,由各轴方向的偏导数综合而成,其模长表示函数值变化的速率。本文详细探讨了导数、偏导数、梯度等概念,并结合Softmax函数、卷积神经网络(CNN)中的卷积计算、权值共享及池化操作进行了深入分析。 ... [详细]
  • 《计算机视觉:算法与应用》第二版初稿上线,全面更新迎接未来
    经典计算机视觉教材《计算机视觉:算法与应用》迎来了其第二版,现已开放初稿下载。本书由Facebook研究科学家Richard Szeliski撰写,自2010年首版以来,一直是该领域的标准参考书。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 本文源自Coursera平台吴恩达教授的深度学习课程,重点探讨了卷积神经网络(ConvNets)从二维图像处理向一维信号及三维数据处理的拓展应用。 ... [详细]
  • 在《数字图像处理及应用(MATLAB)第4章》中,详细探讨了“逢七必过”游戏规则的实现方法,并结合数字图像处理技术进行了深入分析。本章通过丰富的实例和代码示例,展示了如何利用MATLAB实现这一游戏规则,并介绍了数字图像处理的基本原理和技术应用。内容涵盖了图像增强、滤波、边缘检测等多个方面,为读者提供了全面的技术支持和实践指导。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文探讨了利用MATLAB实现图像相似度分析的方法,重点介绍了余弦相似度算法的实现及其在实际应用中的效果。通过实验验证,该方法在图像匹配和检索任务中表现出较高的准确性和效率,为图像处理领域提供了有力的技术支持。 ... [详细]
  • 全连接神经网络应用于手写图像识别实践
    2019独角兽企业重金招聘Python工程师标准转载于:https:my.oschina.netliyangkeb ... [详细]
author-avatar
合约100年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有