目录
人类视觉原理
1整体描述
2基本理论
2.1卷积(convolution)
2.2步长(stride)
2.3填充(padding)
Valid卷积
Same卷积
Full卷积
2.4三维卷积
2.5 1x1卷积
2.6偏置(bias)
2.7池化(pooling)
2.8全局池化 (Global Pooling)
2.9激活函数(activation functions)
3特性
3.1局部感知
3.2参数共享
3.3分层提取
3.4感受野(Receptive field)
3.5多核卷积
4局部卷积
5卷积层和池化层的实现
5.1卷积实现
5.2池化实现
6可视化
7神经网络的本质
参考文章
深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。
1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是“发现了视觉系统的信息处理”,可视皮层是分级的。
人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:
我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,让计算机来逐层提取图像中的特征,最终在顶层做出分类呢?答案是肯定的,这也是卷积神经网络的灵感来源。
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积运算且具有深度结构的前馈神经网络(Feedforward Neural Networks)。相比早期的BP神经网络,卷积神经网络最重要的特性在于“局部感知”与“参数共享”,自2012年的AlexNet开始,卷积神经网络就多次成为ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)的优胜算法,至此,卷积神经网络开始大放异彩,成为了众多科学领域的研究重点之一。
如图1所示,一个完整的卷积神经网络可包含卷积层、池化层、全连接层等。其中卷积层用来进行特征提取,池化层用于降低维数,全连接层可用于结果预测(也可使用全卷积网络进行预测)。
注:卷积运算也属于一种线性运算,故需要进行非线性处理,即添加激活函数(示例中为修正线性单元的函数,即 Relu 激活函数)。
对于卷积层,其详细描述如图1.2所示
其运算过程主要由以下4步组成:
注:对于某一个卷积层,其不同特征图所使用的激活函数相同,但不同卷积层所使用的激活函数可以不同,该步骤在整体描述中为突出与神经网络的相似性而单独提出,但实际上其仍属于卷积层的一部分。
对于池化层,其详细描述如图1.3所示:
承接上例,对于 的特征图,其池化过程仅需通过池化核对该特征图进行池化运算即可得到输出。
然后将得到的特征图经过全连接层进行处理并由softmax算法进行回归即可得到最终的输出结果。
注:全连接层即为机器学习中常见的由神经元构成的神经网络。
(关于神经网络及softmax回归可参考:神经网络的前向及反向传播、深度学习笔记)
卷积神经网络中的核心即为卷积运算,其相当于图像处理中的“滤波器运算”。
对于一个 大小的卷积核 ,其对某一原图像 进行卷积运算的过程为:卷积核 中的每一个权值 分别和覆盖的原图像 中所对应的像素 相乘,然后再求和。计算公式为:
如图2.1所示,对一幅图像的一个完整的卷积运算过程为:卷积核以一定的间隔滑动,并对所覆盖的区域进行卷积运算得到值 ,直至遍历完整幅图像。
一个标准的卷积运算以图2.2为例,其卷积核每次覆盖原图像的9个像素,共滑动4次,得到了一个 的二维数据。对于一个大小为 的原图像,经过大小为 的卷积运算后,其输出图像的尺寸为 。
滑动一定的间距,但这个间距该如何定义呢? 这个概念就是卷积的 “步长”(stride),设置卷积的步长可使卷积过程跳过原图像中的某些像素。结合步长 操作后,其输出图像的尺寸为 。stride = 1 表示卷积核滑过每一个相距是 1 的像素,是最基本的单步滑动,作为标准卷积模式。Stride 是 2 表示卷积核的移动步长是 2,跳过相邻像素,输出图像缩小为原来的 1/2。Stride 是 3 表示卷积核的移动步长是 3,跳过 2 个相邻像素,图像缩小为原来的 1/3,以此类推。
在标准的卷积过程中,存在两个问题:
对于这个问题,可以采用额外的 “假” 像素(通常值为 0, 因此经常使用的术语 ”零填充“ )填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于其中心,同时延伸到边缘之外的假像素。假设填充的像素大小为 ,则 就变成了 ,故其输出图像的尺寸为 。
至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。
Valid 卷积意味着不填充,如之前所述,图像会经历卷积运算后逐渐缩小,输出的图像尺寸即为上述公式:。
Same卷积意味填充后,输出图像的尺寸与输入图像的尺寸相同,根据上述公式,令 ,可得到。当 时,。
注:一般卷积核 的大小会选择一个奇数,如 3 \ 5 \ 7 等。主要因为:
- 如果 是一个偶数,那么只能使用一些不对称填充。只有当 是奇数时,Same 卷积才会有自然的填充,即可以选择同样的数量填充四周。
- 当卷积核 是奇数时,其只有一个中心点,在具体的程序实现过程中会便于指出卷积核的位置。
卷积的三种模式:full, same, valid:https://blog.csdn.net/leviopku/article/details/80327478
matlab中的conv2函数:https://ww2.mathworks.cn/help/matlab/ref/conv2.html?#bvhtlhr-1
如何理解深度学习中的deconvolution networks?:https://www.zhihu.com/question/43609045
此处可分为两种,一种是常见的多通道图像(如RGB彩色图像)的三维卷积(也是实际中最常用的卷积方式),与之前所举的二维卷积例子原理相似只是通道数不为1,具体如下图所示:
在该卷积过程中,卷积核n(包含3个小卷积核) 中的每个小卷积核分别与原图像中所对应的图层进行卷积运算(如卷积核1中左边的小卷积核与原图像中左边的红色图层进行卷积运算,得到红色的单通道特征图;卷积核1中中间的小卷积核则与原图像中间的绿色图层进行卷积运算,得到绿色的单通道特征图,以此类推),分别生成3个单通道特征图,然后将这3个特征图按元素对应相加,即可得到卷积核n 生成的单通道特征图,最后将 n 个特征图相叠加即可得到最终的 n通道特征图。
注:该类卷积方式也是图像识别与检测中最常见的运算方式。其维度计算如下。
对于第 层卷积,定义符号如下:
卷积核尺寸(filter)
填充尺寸(padding)
步长(stride)
图像的高度(height)
图像的宽度(width)
通道数(channel number)
定义输入图像(第 层图像)的尺寸为:
定义共有 个 卷积核(程序中定义尺寸为 )对输入图像进行卷积(卷积核的通道数与输入图像一致)
则输出图像(第 层图像)的高度 ,宽度,通道数为卷积核的个数 。即输出图像尺寸为:。
注:通过卷积网络中的权重所指的就是卷积核的参数,也就是也就是所有卷积核的集合再乘以卷积核的总数量,即,此处关于高度,宽度和通道的顺序并没有完全统一的标准。
第二种三维卷积优点类似于卷积的局部连接,但该类卷积运算的卷积核并非只与原图像中的某几层相连接(在一个固定平面内滑动),而是以空间滑动的方式与原图像的所有像素进行卷积。
以上图为例, 的卷积核在 原图像上以步长为1的方式在空间上滑动遍历所有像素进行卷积,最终生成一个 的特征图。该类卷积常用于视频的事件检测、三维医学影像等领域。
卷积也称作 “Network in Network”,其本质上相当于全连接层,以一个 的输入图像为例,卷积(通道数与输入图像一致,即尺寸为 )所实现的功能就是依次遍历这28个单元格作乘积再求和,增加偏置后应用激活函数(输出图像的高和宽不变,通道数为卷积核的数量)。这时,输入图像的28个不同通道的数据可看作是神经网络的输入向量 ,而卷积核则可看作是权重 ,而多个卷积核即构成了神经网络中的隐藏层。
其主要有2个功能:
参考图1.2,每个卷积核都有一个偏置参数 ,它是一个实数。偏差包含了这些变量,它是该维度上的一个向量,其在代码中表示为一个 的四维向量或四维张量。如图2.6所示,三维卷积中,偏置中的每一个单元分别作用于特征图中的每一个图层。
其具体计算过程如图2.7所示(以二维卷积为例,也可理解为图2.6中的某一个偏置单元与特征图中对应图层的计算过程)。
注:神经网络为什么需要添加偏置 ?,在机器学习中,以一个单变量的线性回归为例,若其假设函数 ,用其对如下数据进行拟合:
图2.6.3 没有偏置的线性回归 图2.6.4 带有偏置的线性回归从图2.6可以看出,在仅含有权重参数 的情况下,假设函数必须经过原点,但这将使其无论如何也无法回归出一条完美拟合的直线,而当添加偏置 后,假设函数变为 ,直线将可以通过任意点,进而对数据进行拟合,这个原理可引申到深度学习的前向传播算法中( ),即给网络增加了平移的能力(激活函数则可以改变网络拟合的形状),无论在回归还是分类问题中,都可以使网络更好的拟合数据。
在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,但这样做会面临巨大计算量的挑战。并且容易出现过拟合 (over-fitting)。
为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的特征的最大值 (或平均值)。这些统计到的特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling)。
除了最大值池化(Max Pooling)之外,还有平均值池化(Average pooling)等。相对于Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值。如图2.6.1所示的即为Max池化的运算过程,Average池化依此类推。
池化有4个重要特性:
注:在图像识别领域,主要使用Max池化。所以通常所说的“池化层”,指的就是Max池化。
既然全连接网络可以使feature map的维度减少,进而输入到softmax(NIN论文),但是又会造成过拟合,是不是可以用pooling来代替全连接。
答案是肯定的,Network in Network工作使用GAP来取代了最后的全连接层,直接实现了降维,更重要的是极大地减少了网络的参数(CNN网络中占比最大的参数其实后面的全连接层)。GAP的结构如下图所示:
虽然说GAP就是把池化的窗口大小设置成输入图像的大小,但这并不是GAP内涵的全部。GAP的意义是对整个网络从结构上做正则化防止过拟合。既降低参数避免了全连接带来的过拟合风险,又达到了全连接一样的转换功能。
【注】:“global pooling”在滑窗内的具体池化方法可以是任意的,所以就会被细分为“global average pooling”、“global max pooling”等。
为什么神经网络需要非线性激活函数?事实证明:为了使神经网络能够拟合出各种复杂的函数,必须使用非线性激活函数。在神经网络的正向传播过程中(, ),如果我们去掉激活函数 ,则 ,这个有时被叫做线性激活函数(更学术点的名字是恒等激励函数,因为它们就是把输入值输出),具体公式如下:
第一层:
第二层:
将 带入可得第二层:,令 ,,则第二层变为:
依此类推,网络的输出仅仅只是输入特征的线性组合。实际上,无论网络有多少层,整体完全可以仅使用1层表示。同理,引入其他线性函数 (如)仍然起不到任何作用,因为线性函数的组合本身仍是线性函数。
注:某些特殊情况可能会用到线性激活函数,如机器学习中回归问题的输出层(不在隐藏层)或是压缩问题(可以在隐藏层)。
常用的激活函数主要有:
(1)sigmoid函数 (2)tanh 函数
图2.9.1 sigmoid函数 图2.9.2 tanh函数
注:tanh函数的效果总是优于 sigmoid 函数。因为函数值域在-1 和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用 tanh 函数代替sigmoid 函数中心化数据,会使得数据的平均值更接近 0 而不是 0.5。
注:sigmoid 函数和 tanh 函数两者共同的缺点是,在 特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。
(3)修正线性单元的函数(ReLu) (4)Leaky Relu函数
图2.9.3 relu函数 图2.9.4 leaky relu函数,一般
注:Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题。
一般认为,人对外界的认知是从局部到全局的,而对于图像来说,空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。
在全连接神经网络中(如图3.1所示),相邻层的神经元全部连接在一起,由于其输入数据是一维结构,故图像需先转换为一维向量,而这个过程,也导致图像完全丢失了“形状”,即像素间的空间信息,从理论上来讲,神经网络几乎能解决所有深度学习问题,但是在处理复杂问题时,往往难以达到理想的效果。
该类网络不仅参数量巨大,且学习速度较慢,即使是一个简单的问题,一般也需要几百次甚至上千次的学习才能收敛,而且易产生过拟合问题,泛化能力较弱。
而卷积层则可以保持形状不变。当输入图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以正确理解图像等具有形状的数据,而且由于局部连接,大大降低了参数量,节省了内存。
也可理解为“平移不变性”。卷积神经网络在图像的某一区域学到某个模式之后,它就可以在图像的任何地方识别这个模式。
如图3.2所示,假设使用某一特征过滤器(检测器)提取 “手写5” 的特征,那么图片的右下角区域,以及旁边的各个区域都可以使用这个过滤器。每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取特征 “5”。而对于全连接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。这使得卷积神经网络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),只需要更少的训练样本就可以学到具有泛化能力的数据表示。
卷积神经网络可以学到模式的空间层次结构(spatial hierarchies of patterns)。
如图3.3。第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推,层数越高,学到的特征就越全局化。这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(视觉世界从根本上具有空间层次结构)。
感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,换句话说,即为每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。其中神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节,因此感受野的值可以用来大致判断每一层的抽象层次。
对于卷积核 Conv1 来说,其每个元素在原图像上所能看到的范围是 (感受野值为 3),又因为卷积核Conv1的大小为3,步长为2,且卷积核 Conv2的大小为2,步长为1,结合可知,Conv2中的每一个元素可包含 Conv1 中大小为2的元素,而2个 Conv1 所能覆盖原始图像的范围为 ,故Conv2的感受野值为 5。
一个卷积核只能提取某一种特征,而计算机对于一幅图像的 “理解” 过程中,往往需要对其多个特征进行学习,其每个卷积核都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。
如图3.3,我们人类对于猫的理解会包括猫的耳朵、鼻子和眼睛,故其可采取图示的三种卷积核来进行提取,而更底层的特征,如不同形状的曲线、图案等则由其他不同种类的卷积核来进行提取。
以LeNet网络举例,其结构如下图所示:
原始图像进来以后,先进入一个卷积层C1,由6个 5x5 的卷积核组成,卷积出28x28的图像,然后下采样到14x14(S2)。接下来,再进一个卷积层C3,由16个5x5的卷积核组成,之后再下采样到5x5(S4)。注意,这里S2与C3的连接方式并不是全连接,而是部分连接,如下图所示:
其中行代表S2层的某个节点,列代表C3层的某个节点。我们可以看出,C3的 0 和S2的 0、1、2 连接,C3的 1 和S2的 1、2、3 连接,不过从C3的6~13变为了每次连接4个节点,C3的14变为了5个节点,C3的15与S2的节点全部连接。
即用不同底层特征的组合,可以得到进一步的高级特征,例如:/ + \ = ,再比如,以图3.3为例,第一层的9个卷积核与输入图像 “猫” 是全部连接,从 “猫” 中得到了9种不同的底层特征图(各类底层曲线及图案),而第二层的卷积核1(将用于提取 “猫眼睛”)则只与第一层的特征图1~5相连接(即仅与特征图1~5进行卷积运算),同理,第二层的卷积核3(“猫耳朵”)则只与第一层的特征图7~9相连接。
注:此处所说的 “全部连接” 与BP神经网络中的 “全连接” 有着本质的不同,BP神经网络中的全连接表示网络中的每一个神经元都与上一层的所有神经元相连接,而卷积网络中的 “全部连接” 只是表示该层的卷积核与上一层特征图的所有通道进行卷积,但卷积运算的过程仍是 “局部连接”。
结合图3.3,以图4.3为例,第一层中卷积核1~9的通道数都与原图像的相同(值都为3),故此处属于卷积的 “全部连接”,也是卷积运算默认的连接方式,而第二层中卷积核1的通道数为5,卷积核3的通道数为3,而上层特征图的通道数为9,故此处属于卷积的 “局部连接”。
注:在此处,卷积核1与卷积核3分别仅与第1~5层特征图、7~9层特征图进行卷积运算,即分别仅在其所处的立体空间中的一个面内移动,分别输出的是一个二维的图像(通道数为1),其与处理视频序列的三维卷积概念不同。
如果以传统思维使用for循环来实现的话,则在巨大数据量的情况下,for循环进行计算和切换内存的时间消耗会非常大。而采用向量化的并行计算方式则可以大幅缩短计算时间。
如图5.1所示,首先对于输入数据,将应用滤波器的区域(3维方块)横向展开为1列以匹配卷积核(权重),然后将卷积核依次展开为1列,计算两者的矩阵乘积,最后将得到的2维数据reshape至4维。
注:为了便于观察,将步幅设置得很大,以使滤波器的应用区域不重叠。而在实际的卷积运算中,滤波器的应用区域几乎都是重叠的。在滤波器的应用区域重叠的情况下,展开后的元素个数会多于原方块的元素个数。因此该方法比普通的实现会消耗更多的内存。
注:在程序中,因为包含批处理数量(N幅图像同时处理),故输入数据是4维,卷积核也是所有共同展开,故也是4维。其中:N——批处理的图像数量(样本数);FN——滤波器数量;C——通道数;H——高度;W——宽度
注:im2col 是一个展开函数,名称是“image to column”的缩写,即 “从图像到矩阵” 的意思。Caffe、Chainer等深度学习框架中有名为im2col 的函数,并且在卷积层的实现中,都使用了 im2col。
池化层的实现和卷积层相同,都对输入数据进行展开。不过,池化的情况下,在通道方向上是独立的。如图5.2所示,池化的应用区域按通道单独展开。如图5.2所示,对于输入数据的每一层的池化区域分别展开为2维向量,然后对每一行求最大值得到一个1维向量,最后将该向量reshape为合适的维数。
学习前的卷积核是随机进行初始化的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。可以发现,通过学习,滤波器被更新成了有规律的滤波器,比如从白到黑渐变的滤波器、含有块状区域(称为blob)的滤波器等。
以图6.1为例,不同卷积核经过学习改变了自身对不同特征的响应程度,如边缘(颜色变化的分界线)和斑块(局部的块状区域)等,其中第2个卷积核对垂直边缘响应,第5个卷积核对水平边缘响应,第9个对倾斜边缘响应,第13个对中心斑块响应。
上面的结果是针对第1层的卷积层得出的。第1层的卷积层中提取了边缘或斑块等“低级”信息,而在堆叠了多层的CNN中,随着层次加深,提取的信息(准确说,是响应强烈的神经元))也越来越抽象。如图6.2所示,第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应。
也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
神经网络由大量的节点(或称“神经元”,卷积神经网络中为“特征图”)相互连接构成,每个节点代表一种特定的函数,称为激活函数(Activation Function)。节点之间的连接具有特定的权重,信号经过会进行加权,代表神经网络的记忆。网络的输出则依网络的连接方式、权重值和激活函数的不同而不同。网络本身则代表对自然界某种算法或者函数的逼近,也可以是一种逻辑策略的表达。
《吴恩达深度学习》
《深度学习入门:基于Python的理论与实现》
《Python深度学习》
《行人检测:理论与实践》
深度学习简介(一)——卷积神经网络
Receptive field(感受野)
Intuitively Understanding Convolutions for Deep Learning
一文读懂卷积神经网络中的1x1卷积核
Global average pooling (GAP)
深度学习笔记:三维图片分类与三维卷积神经网络