一、结构概述神经元的三维排列。卷积神经网络机构基于一个假设——输入数据是图像。所以这种特有属性,使得前向传播函数实现起来更高效,并且大幅度降低了网络中参数的数量。在神经网络中:输入是一个向量,然后每个隐层由若干的神经元组成,每个神经元都与前一层中的所有神经元连接。常规的神经网络对于大尺寸图像效果不尽人意,因为在全连接下, 权重和偏差参数会变得很多,导致网络过拟合等问题。与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度、和深度(这里的深度指的是激活数据体的第三个维度,而不是整个网络的深度,整个网络的深度指的是网络的层数)。左边是一个3层的神经网络。右边是一个卷积神经网络,图例中网络将它的神经元都排列成3个维度(宽、高和深度)。卷积神经网络的每一层都将3D的输入数据变化为神经元3D的激活数据并输出。在这个例子中,红色的输入层装的是图像,所以它的宽度和高度就是图像的宽度和高度,它的深度是3(代表了红、绿、蓝3种颜色通道)。二、用来构建卷积网络的各种层一个简单的卷积神经网络是由各种层按照顺序排列组成,网络中的每个层使用一个可以微分的函数将激活数据从一个层传递到另一个层。卷积神经网络主要由三种类型的层构成:卷积层,汇聚(Pooling)层和全连接层(全连接层和常规神经网络中的一样)。通过将这些层叠加起来,就可以构建一个完整的卷积神经网络。网络结构例子:这仅仅是个概述,下面会更详解的介绍细节。一个用于CIFAR-10图像数据分类的卷积神经网络的结构可以是【输入层-卷积层-ReLU层-汇聚层-全连接层】。细节如下:输入[32x32x3]存有图像的原始像素值,本例中图像宽高均为32,有3个颜色通道。卷积层中,神经元与输入层中的一个局部区域相连,每个神经元都计算自己与输入层相连的小区域与自己权重的内积。卷积层会计算所有神经元的输出。如果我们使用12个滤波器(也叫作核),得到的输出数据体的维度就是[32x32x12]。ReLU层将会逐个元素地进行激活函数操作,比如使用以0为阈值的max(0,x)作为激活函数。该层对数据尺寸没有改变,还是[32x32x12]。汇聚层在在空间维度(宽度和高度)上进行降采样(downsampling)操作,数据尺寸变为[16x16x12]。全连接层将会计算分类评分,数据尺寸变为[1x1x10],其中10个数字对应的就是CIFAR-10中10个类别的分类评分值。正如其名,全连接层与常规神经网络一样,其中每个神经元都与前一层中所有神经元相连接。由此看来,卷积神经网络一层一层地将图像从原始像素值变换成最终的分类评分值。其中有的层含有参数,有的没有。具体说来,卷积层和全连接层(CONV/FC)对输入执行变换操作的时候,不仅会用到激活函数,还会用到很多参数(神经元的突触权值和偏差)。而ReLU层和汇聚层则是进行一个固定不变的函数操作。卷积层和全连接层中的参数会随着梯度下降被训练,这样卷积神经网络计算出的分类评分就能和训练集中的每个图像的标签吻合了。小结:简单案例中卷积神经网络的结构,就是一系列的层将输入数据变换为输出数据(比如分类评分)。卷积神经网络结构中有几种不同类型的层(目前最流行的有卷积层、全连接层、ReLU层和汇聚层)。每个层的输入是3D数据,然后使用一个可导的函数将其变换为3D的输出数据。有的层有参数,有的没有(卷积层和全连接层有,ReLU层和汇聚层没有)。有的层有额外的超参数,有的没有(卷积层、全连接层和汇聚层有,ReLU层没有)。2.1 卷积层卷积层的参数是由一些可学习的滤波器集合构成的。每个滤波器在空间上都比较小,但深度和输入数据一致。举例来说就是卷积神经网络第一层的一个典型滤波器尺寸就是5x5x3。在前向传播的时候,让每个滤波器都在输入数据的宽度和高度上滑动,然后计算整个滤波器和输入数据任一处的卷积(内积)。当滤波器沿着输入数据的宽度和高度滑过后,会生成一个2维的激活图(activation map),它给出了在每个空间位置处滤波器的反应。直观地说,网络会让滤波器学习到当它看到某些类型的视觉特征时就激活,具体视觉特征可以是某些方位上的边界,或者第一层上某些颜色的斑点。
每个卷积层上,我们会有一整个集合的滤波器(比如12个),每个都会生成一个不同的二维激活图,将这些激活映射在深度方向上层叠起来就生成了输出数据。现在开始讨论神经元的连接,它们在空间中的排列,以及它们参数共享的模式。局部连接在处理图像这样的高维度输入时,让每个神经元都与前一层中的所有神经元进行全连接是不现实的。相反,我们让每个神经元只与输入数据的一个局部区域连接。该连接的空间大小叫做神经元的感受野(receptive field),它的尺寸是一个超参数(其实就是滤波器的空间尺寸)。在深度方向上,这个连接的大小总是和输入量的深度相等。需要再次强调的是,我们对待空间维度(宽和高)与深度维度是不同的:连接在空间(宽高)上是局部的,但是在深度上总是和输入数据的深度一致。例1:假设输入数据体尺寸为[32x32x3](比如CIFAR-10的RGB图像),如果感受野(或滤波器尺寸)是5x5,那么卷积层中的每个神经元会有输入数据体中[5x5x3]区域的权重,共5x5x3=75个权重(还要加一个偏差参数)。注意这个连接在深度维度上的大小必须为3,和输入数据体的深度一致。例2:假设输入数据体的尺寸是[16x16x20],感受野尺寸是3x3,那么卷积层中每个神经元和输入数据体就有3x3x20=180个连接。再次提示:在空间上连接是局部的(3x3),但是在深度上是和输入数据体一致的(20)。左边:红色的是输入数据体(比如CIFAR-10中的图像),蓝色的部分是第一个卷积层中的神经元。卷积层中的每个神经元都只是与输入数据体的一个局部在空间上相连,但是与输入数据体的所有深度维度全部相连(所有颜色通道)。在深度方向上有多个神经元(本例中5个),它们都接受输入数据的同一块区域(感受野相同)。至于深度列的讨论在下文中有。右边:神经网络章节中介绍的神经元保持不变,它们还是计算权重和输入的内积,然后进行激活函数运算,只是它们的连接被限制在一个局部空间。空间排列共有3个超参数控制着输出数据体的尺寸:深度(depth),步长(stride)和零填充(zero-padding)。下面是对它们的讨论:首先,输出数据体的深度是一个超参数:它和使用的滤波器的数量一致,而每个滤波器在输入数据中寻找一些不同的东西。举例来说,如果第一个卷积层的输入是原始图像,那么在深度维度上的不同神经元将可能被不同方向的边界,或者是颜色斑点激活。我们将这些沿着深度方向排列、感受野相同的神经元集合称为深度列(depth column),也有人使用纤维(fibre)来称呼它们。其次,在滑动滤波器的时候,必须指定步长。当步长为1,滤波器每次移动1个像素。当步长为2(或者不常用的3,或者更多,这些在实际中很少使用),滤波器滑动时每次移动2个像素。这个操作会让输出数据体在空间上变小。在下文可以看到,有时候将输入数据体用0在边缘处进行填充是很方便的。这个零填充(zero-padding)的尺寸是一个超参数。零填充有一个良好性质,即可以控制输出数据体的空间尺寸(最常用的是用来保持输入数据体在空间上的尺寸,这样输入和输出的宽高都相等)。输出数据体在空间上的尺寸可以通过输入数据体尺寸(W),卷积层中神经元的感受野尺寸(F),步长(S)和零填充的数量(P)的函数来计算,输出数据体的空间尺寸为 (W−F+2P)/S+1(W−F+2P)/S+1

比如输入是7x7,滤波器是3x3,步长为1,填充为0,那么就能得到一个5x5的输出。如果步长为2,输出就是3x3。下面是例子:空间排列的图示。在本例中只有一个空间维度(x轴),神经元的感受野尺寸F=3,输入尺寸W=5,零填充P=1。左边:神经元使用的步长S=1,所以输出尺寸是(5-3+2)/1+1=5。右边:神经元的步长S=2,则输出尺寸是(5-3+2)/2+1=3。注意当步长S=3时是无法使用的,因为它无法整齐地穿过数据体。从等式上来说,因为(5-3+2)=4是不能被3整除的。本例中,神经元的权重是[1,0,-1],显示在图的右上角,偏差值为0。这些权重是被所有黄色的神经元共享的(参数共享的内容看下文相关内容)。使用零填充:在上面左边例子中,注意输入维度是5,输出维度也是5。之所以如此,是因为感受野是3并且使用了1的零填充。如果不使用零填充,则输出数据体的空间维度就只有3,因为这就是滤波器整齐滑过并覆盖原始数据需要的数目。一般说来,当步长 S=1S=1

时,零填充的值是 P=(F−1)/2P=(F−1)/2

,这样就能保证输入和输出数据体有相同的空间尺寸。这样做非常常见,在介绍卷积神经网络的结构的时候我们会详细讨论其原因。步长的限制:注意这些空间排列的超参数之间是相互限制的。举例说来,当输入尺寸W=10W=10

,不使用零填充则P=0P=0

,滤波器尺寸F=3F=3

,这样步长S=2S=2

就行不通,因为(W−F+2P)/S+1=(10−3+0)/2+1=4.5(W−F+2P)/S+1=(10−3+0)/2+1=4.5

,结果不是整数,这就是说神经元不能整齐对称地滑过输入数据体。因此,这些超参数的设定就被认为是无效的,一个卷积神经网络库可能会报出一个错误,或者修改零填充值来让设置合理,或者修改输入数据体尺寸来让设置合理,或者其他什么措施。在后面的卷积神经网络结构小节中,读者可以看到合理地设置网络的尺寸让所有的维度都能正常工作,这件事可是相当让人头痛的。而使用零填充和遵守其他一些设计策略将会有效解决这个问题。真实案例:Krizhevsky构架赢得了2012年的ImageNet挑战,其输入图像的尺寸是[227x227x3]。在第一个卷积层,神经元使用的感受野尺寸F=11,步长S=4,不使用零填充P=0。因为(227-11)/4+1=55,卷积层的深度K=96,则卷积层的输出数据体尺寸为[55x55x96]。55x55x96个神经元中,每个都和输入数据体中一个尺寸为[11x11x3]的区域全连接。在深度列上的96个神经元都是与输入数据体中同一个[11x11x3]区域连接,但是权重不同。有一个有趣的细节,在原论文中,说的输入图像尺寸是224x224,这是肯定错误的,因为(224-11)/4+1的结果不是整数。这件事在卷积神经网络的历史上让很多人迷惑,而这个错误到底是怎么发生的没人知道。我的猜测是Alex忘记在论文中指出自己使用了尺寸为3的额外的零填充。参数共享在卷积层中使用参数共享是用来控制参数的数量。就用上面的例子,在第一个卷积层就有55x55x96=290,400个神经元,每个有11x11x3=364个参数和1个偏差。将这些合起来就是290400x364=105,705,600个参数。单单第一层就有这么多参数,显然这个数目是非常大的。作一个合理的假设:如果一个特征在计算某个空间位置(x,y)的时候有用,那么它在计算另一个不同位置(x2,y2)的时候也有用。基于这个假设,可以显著地减少参数数量。换言之,就是将深度维度上一个单独的2维切片看做深度切片(depth slice),比如一个数据体尺寸为[55x55x96]的就有96个深度切片,每个尺寸为[55x55]。在每个深度切片上的神经元都使用同样的权重和偏差。在这样的参数共享下,例子中的第一个卷积层就只有96个不同的权重集了,一个权重集对应一个深度切片,共有96x11x11x3=34,848个不同的权重,或34,944个参数(+96个偏差)。在每个深度切片中的55x55个权重使用的都是同样的参数。在反向传播的时候,都要计算每个神经元对它的权重的梯度,但是需要把同一个深度切片上的所有神经元对权重的梯度累加,这样就得到了对共享权重的梯度。这样,每个切片只更新一个权重集。注意,如果在一个深度切片中的所有权重都使用同一个权重向量,那么卷积层的前向传播在每个深度切片中可以看做是在计算神经元权重和输入数据体的卷积(这就是“卷积层”名字由来)。这也是为什么总是将这些权重集合称为滤波器(filter)(或卷积核(kernel)),因为它们和输入进行了卷积。Krizhevsky等学习到的滤波器例子。这96个滤波器的尺寸都是[11x11x3],在一个深度切片中,每个滤波器都被55x55个神经元共享。注意参数共享的假设是有道理的:如果在图像某些地方探测到一个水平的边界是很重要的,那么在其他一些地方也会同样是有用的,这是因为图像结构具有平移不变性。所以在卷积层的输出数据体的55x55个不同位置中,就没有必要重新学习去探测一个水平边界了。注意有时候参数共享假设可能没有意义,特别是当卷积神经网络的输入图像是一些明确的中心结构时候。这时候我们就应该期望在图片的不同位置学习到完全不同的特征。一个具体的例子就是输入图像是人脸,人脸一般都处于图片中心。你可能期望不同的特征,比如眼睛特征或者头发特征可能(也应该)会在图片的不同位置被学习。在这个例子中,通常就放松参数共享的限制,将层称为局部连接层(Locally-Connected Layer)。卷积层演示:下面是一个卷积层的运行演示。因为3D数据难以可视化,所以所有的数据(输入数据体是蓝色,权重数据体是红色,输出数据体是绿色)都采取将深度切片按照列的方式排列展现。输入数据体的尺寸是W1=5,H1=5,D1=3W1=5,H1=5,D1=3

,卷积层参数K=2,F=3,S=2,P=1K=2,F=3,S=2,P=1

。就是说,有2个滤波器,滤波器的尺寸是3⋅33⋅3

,它们的步长是22

.因此,输出数据体的空间尺寸是(5−3+2)/2+1=3(5−3+2)/2+1=3

。注意输入数据体使用了零填充P=1P=1

,所以输入数据体外边缘一圈都是00

。**下面的例子在绿色的输出激活数据上循环演示,展示了其中每个元素都是先通过蓝色的输入数据和红色的滤波器逐元素相乘,然后求其总和,**最后加上偏差得来。例如:o[0,0,0]=np.sum(X[:3,:3,:] * W0)+b0动图见这里:http://cs231n.github.io/convolutional-networks/用矩阵乘法实现:卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。卷积层的常用实现方式就是利用这一点,将卷积层的前向传播变成一个巨大的矩阵乘法:输入图像的局部区域被im2col操作拉伸为列。比如,如果输入是[227x227x3],要与尺寸为11x11x3的滤波器以步长为4进行卷积,就取输入中的[11x11x3]数据块,然后将其拉伸为长度为11x11x3=363的列向量。重复进行这一过程,因为步长为4,所以输出的宽高为(227-11)/4+1=55,所以得到im2col操作的输出矩阵X_col的尺寸是[363x3025],其中每列是拉伸的感受野,共有55x55=3,025个。注意因为感受野之间有重叠,所以输入数据体中的数字在不同的列中可能有重复。卷积层的权重也同样被拉伸成行。举例,如果有96个尺寸为[11x11x3]的滤波器,就生成一个矩阵W_row,尺寸为[96x363]。现在卷积的结果和进行一个大矩阵乘np.dot(W_row, X_col)是等价的了,能得到每个滤波器和每个感受野间的点积。在我们的例子中,这个操作的输出是[96x3025],给出了每个滤波器在每个位置的点积输出。结果最后必须被重新变为合理的输出尺寸[55x55x96]。这个方法的缺点就是占用内存太多,因为在输入数据体中的某些值在X_col中被复制了多次。但是,其优点是矩阵乘法有非常多的高效实现方式,我们都可以使用(比如常用的BLAS API)。还有,同样的im2col思路可以用在汇聚操作中。

卷积神经网络的学习笔记1相关推荐

  1. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  2. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  3. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点

    转载自:http://blog.csdn.net/niuwei22007/article/details/47399913 <CNN基础知识点>From:Convolutional Neu ...

  4. 吴恩达深度学习之四《卷积神经网络》学习笔记

    一.卷积神经网络 1.1 计算机视觉 举了几个例子,可以完成什么样的任务 最重要的是特征向量太大了,比如分辨率1000 x 1000 的彩色图片,三个颜色通道,维数是 3000000 意味着隐藏层第一 ...

  5. 《卷积神经网络》学习笔记

    参考资料:零基础入门深度学习(4) - 卷积神经网络 后文是小编在学习如上资料时写的一些东西(给自己看的). 另外的参考资料:http://neuralnetworksanddeeplearning. ...

  6. Python深度学习(使用预训练的卷积神经网络)--学习笔记(十一)

    5.3 使用预训练的卷积神经网络 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已经在大型数据 ...

  7. 卷积神经网络(CNN)学习笔记1:基础入门

    卷积神经网络(Convolutional Neural Networks, CNN)是多层感知机(MLP)的变种.由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来.由纽约大学的Yann Le ...

  8. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算

    原文地址可以查看更多信息:http://blog.csdn.net/niuwei22007/article/details/48025939         源代码分析:(注意,如果直接保存以下代码, ...

  9. 吴恩达《卷积神经网络》精炼笔记(2)-- 深度卷积模型:案例研究

    AI有道 不可错过的AI技术公众号 关注 1 Why Look at Case Studies 本文将主要介绍几个典型的CNN案例.通过对具体CNN模型及案例的研究,来帮助我们理解知识并训练实际的模型 ...

最新文章

  1. 一文看尽 27 篇 CVPR 2021 2D 目标检测论文
  2. 【每日一题】二分查找
  3. 《OpenGL编程指南》一第2章 着色器基础
  4. 分享:我是怎么在github上找到优秀的仓库的?
  5. 【C】——常用C时间库函数
  6. 超牛逼的异步协程爬虫
  7. 技术人凭什么那么骄傲?谢然:给自己开发工具
  8. 聊聊Top2计算机博士2021年就业选择
  9. ubuntu 18.04安装与配置 Redis
  10. scala 判断字段 是不是 日期类型_scala 使用指南,降低新手入门难度
  11. 邀请人数排行榜代码 php,成功邀请好友人数排行榜.PDF
  12. SQLServr添加数据列
  13. Android 上哪个更好:除以 2 还是位移 1?
  14. DataRowView 笔记
  15. Android 系统各个版本上https的抓包
  16. main.cpp first defined here 解决
  17. listview控件在php的使用方法,VBA窗体之ListView控件的基本应用 | VBA实例教程
  18. 各种把妹法——太强大了!
  19. Android 开源项目分类汇总(下)
  20. 从小程序快速扫码进微信群聊

热门文章

  1. H3C CAS 5.0 虚拟机备份与还原
  2. substratum android8,如何在没有root的情况下在Android Oreo上安装Substratum主题
  3. 肿瘤免疫疗法 | 细胞治疗和PD1/PDL1 | Tumor immunotherapy | cell therapy
  4. Js中身份证验证及社会统一信用代码验证
  5. Java基础学习九 多线程
  6. 2006高端IT技术图书点评(首发《中华读书报》)
  7. Android-模块化-面向接口编程深度解析,值得收藏
  8. python线性回归预测pm2.5_李宏毅 线性回归预测PM2.5
  9. 从0到1构建计算机(3/12)--组合逻辑芯片:逻辑门、加法器、ALU
  10. HDLBITS笔记15:组合逻辑之7420芯片