1.从X说起
不知道大家是否听说过感受野这个名词 ,是在 60 年代 Hubel 等人通过对猫视觉皮层细胞进行研究提出来的一个概念 。到80年代,Fukushima 在感受野概念的基础之上提出了神经认知机的概念,可以看作是卷积神经网络的第一个实现网络,神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。
当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。
而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示
而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。
2.CNN 基本知识
我们已经知道神经网络结构是怎样的了 ,见下图 :
卷积神经网络与普通神经网络的区别在于 ,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器 。在卷积神经网络的卷积层中 ,一个神经元只与部分邻层神经元连接 。
卷积神经网络所必须要理解的操作有卷积和池化 ,两个必须了解的概念有局部连接和权值共享 ,下边将一一道来 。
3.卷积
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。
举个比较简单的例子,比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。
中间滤波器filter与数据窗口做内积,其具体计算过程则是:
卷积层是卷积神经网络中的核心 ,从命名也能够看出来 。主要有两个关键的操作 ,即局部关联和窗口滑动 。将每一个卷积核在输入窗口依次滑动 ,进行卷积计算得到卷积结果 。例如下图 :
当然 ,上述图片中的卷积计算和数学中学的略有不同 ,理论来说卷积计算需要将卷积核旋转 180 度再进行滑动计算 ,但在这省略了旋转操作这一步骤 。
上述图片基本上介绍了卷积计算的方式 ,还需要介绍的有几个概念 以在计算机视觉领域为例 ,包括概念 :输入图片大小 ,卷积核大小(就是感受野大小),卷积核滑动步长 ,填充值 。
3.1 输入图片尺寸大小
记作维 , 为图片大小 ,维表示图片通道信息 ,例如 RGB 三通道图片中为 3 。
3.2 卷积核大小
记作 维 ,也可以理解成感受野大小 ,即一个神经元连接的输入神经元个数或者说范围 。例如上图中为 22 ,即一个输出神经元通过卷积连接的输入神经元大小是 22 ,也就是局部连接的概念 !值得注意的是卷积核的维度必须和输入图片维度一致
3.3 滑动步长 stride
记作s 。代表的是卷积核在输入上单次滑动的幅度 ,例如上图即为 stride=1 ,表示一次卷积后水平或垂直移动一个位置 。
3.4 填充值 padding
以下图为例子,比如有这么一个55的图片(一个格子一个像素),我们滑动窗口取22,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?
我们可以在原先的矩阵加了一层填充值 ,使得变成 6*6 的矩阵 ,那么窗口就可以刚好把所有像素遍历完 ,这就是填充值 padding 的作用 。
值得一提的是 padding取值有两种 ,一个是 SAME ,一个是 VALID ,Same padding 时 ,卷积前后图片尺寸不变 ,padding = 0时即为 Valid padding 。
3.5 输出大小
如果我们用s表示stride长度,p表示padding长度,如果原始图片尺寸为,filter尺寸为,则卷积后的图片尺寸为:
其中 ,⌊⋯⌋表示向下取整。
然后就是多通道图片的卷积操作和多个卷积核的卷积操作 。
对于多通道图片的卷积操作 ,例如 RGB 三通道图片 ,只需要用同样三通道卷积核进行卷积操作然后累加得到卷积结果即可 。
至于多个卷积核的卷积操作 ,则可以理解成一个卷积核提取了图片的一种特征 ,多个卷积核分别对图片提取特征并得到多通道的输出结果 。
最后 ,关于卷积操作 。分享一张经典的动态图 ,很生动的描述了卷积层的操作过程 。
可以看到:
两个神经元,即depth=2,意味着有两个滤波器。
数据窗口每次移动两个步长取3*3的局部数据,即stride=2, zero-padding=1。
然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果
如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:
左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
中间部分是两个不同的滤波器Filter w0、Filter w1
最右边则是两个不同的输出, 随着左边数据窗口的平移滑动,滤波器对不同的局部数据进行卷积计算。值得一提的是:左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。
与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。
再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。
我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。
首先,我们来分解下上述动图,如下图
接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:
接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:
15504067264561550406734477
然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果
最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。
4.池化
池化层 Pooling layers 在 CNN 中能够减小数据大小 ,提高运算速度的 ,使用较多的池化方法有 max pooling 和 average pooling 两种 。max pooling是最常用的做法 。即取区域内的最大值 。同理 average pooling 即计算区域内的平均值作为特征 。计算示意图分别如下所示 :
max pooling
average pooling
码龙社
一个有趣,有料,专注于技术交流的公众号
领取专属 10元无门槛券
私享最新 技术干货