第五节 Convolutional Neural Network (CNN)

第五节 Convolutional Neural Network (CNN)

1. image classification 图像分类

首先假设输入模型的所有图片的大小都是固定的。如果图像不一样就线rescale成一样的再放进去。

因为是分类,所以每一个目标label y ^ \bm{\hat y} y^ 都以one-hot向量的形式表示。这个向量的长度就表示了总共有多少个类。

对于一个RGB图像,是一个三维的tensor,一个维度代表长,一个维度代表宽,一个维度代表channel(通道),channel就是RGB三个颜色。

先把这个三维的tensor拉直成一个向量。然后放进network中。(课程到目前为止所讲的network的输入都是一个向量,所以只要把图片看作一个向量,就可以把他当作是network的输入。)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6IwLdSf-1648377128963)(./imgs/CNN1.png)]

假如每个图片的尺寸是100100,那么输入的向量就有100100*3维的长度。在采用fully connected network(全连接神经网络)的情况下:如果第一层layer中有1000个神经元的话,那总共会有 3 ∗ 1 0 7 3*10^7 3107个weight。随着参数的增加,虽然模型弹性增加,但是也增加了over fitting的风险。

Simplifiction 1 - receptive field RF

所以,为了避免参数过多,要减少每个neural所观察的范围,就是让他们少和输入向量相连接一点。

如下图,具体的做法是,设一个receptive field(感受野),每个neural只关注自己的receptive field即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PbhDzBBH-1648377128965)(./imgs/receptive%20field.png)]

receptive fiel彼此之间,可以重叠可以交叉,甚至可以两个不同的neural有同一个receptive field,不同的receptive field也可以大小不同,receptive field也不必观察所有的channel,可以只观察一个,也可以观察全部(虽然不常见),receptive field也可以不必非得是正方形。对于一个neural来说receptive field内部也不一定相连。

最经典的receptive field安排方式是:看所有的channel,所以在此基础上描述这个receptive field就只用说他的高和宽即可eg:kernel size: 3 ∗ 3 3*3 33。一般kernel size不会设太大(一般3*3都够用)。一般同一个receptive field会有一组neural来守备这个范围。下一个receptive field则是在上一个的基础上移动一个stride(比如两个像素点stride=2)得到一个新的receptive field。这个stride也是一个hyper parameter,人为决定大小。(一般设stride 1或2就足够,因为希望receptive field之间有overlap重叠,因为不重叠的话有的pattern有可能正好出现在两个receptive field的交界处,不重叠的话则没有neural可以识别他们。)

当在同一行内不断向右移的时候,有可能右移后超出图片范围,但是不能因为超出了范围就舍弃这个receptive field,因为它还包括了没有识别的部分,所以对待超出了范围的位置就做padding补零、或者补全图的平均值或者边上是什么就补一个一样的都可以。

向下stride同理。使图片中的每一个位置都被receptive field覆盖。

此外,对于不同的图片,同样的pattern可能出现在不同的位置。但是这并不会构成问题,当这个pattern出现在不同的位置后,该receptive field所守备的神经元会来识别这个pattern。

但是需要在不同的receptive都放对应识别所有pattern的数量的neural吗,这样不会导致参数太多吗?

为了解决这个问题,提出的方法是,让不同的receptive field的neural之间parameter sharing共享参数。

所谓共享参数就是两个neural神经元的weight是一样的。在这里就是需要让两个守备不同receptive field的neural的参数是一模一样的。但是因为输入不一样(不同的receptive field)即使参数一样,输出也不会一样,所以没必要让两个观察同一个receptive field的neural来parameter sharing。

Simplifiction 2 - Typical Setting

常见的在影像辨识的方法:

每一个receptive field都有一组neural(eg:64)。

然后让每一个receptive field(RF)都是同用一组参数。

举例:
第一个receptive field的的1个neural与第二个receptive field的neural第1个neural参数相同,
第一个receptive field的的2个neural与第二个receptive field的neural第2个neural参数相同,
第一个receptive field的的3个neural与第二个receptive field的neural第3个neural参数相同,

这些每个神经元的参数有一个名字:filter!

所以综上来看,filter的用途就是,每一个filter用来识别一个pattern,每一个receptive field都要有全部的filter。

在这里插入图片描述

Convolutional Layer卷积层的好处

首先上面的处理就是建立一个卷积层的过程:

receptive field + parameter sharing = convolutional layer

这样做的好处有:

  1. 有的pattern可能远小于整个图片的尺寸(receptive field解决了这个问题)
  2. 相同的pattern可能出现在不同的位置(filter也就是parameter sharing解决了这个问题)

可以看出CNN的model bias比较大(因为CNN不是全连接网络,参数更少,能表示的函数更少)。但这并不一定是坏事,当model bias小,会容易出现over fitting的情况。

fully connected layerconvolutional layer
参数更多,model bias更小参数更少,model bias更大
可以做的事多,但是效果都不会最好专门为影像设计,model bias大但是正好适合影像,但是应用到别的领域效果会变差

Convolutional Layer

从另一个角度理解CNN

所谓convolutional layer,就是其中有很多的名字叫filter的tensor。例如每个filter的尺寸是 3 ∗ 3 ∗ c h a n n e l s ( 频 道 数 ) 3*3*channels(频道数) 33channels(),总共有64个filter即64个pattern。每个filter的作用就是去图片中识别一个pattern。每个filter里的数值就是用gradient descent来更新的parameter。

训练之后,filter的用法就是将这个filter从图片的一端开始,对应位置做inner product内积(两个矩阵A、B对应分量乘积之和,结果为一个标量,(与向量的内积/点积/数量积的定义相似)。 所以A、B的行数列数都应相同,且有结论=tr(A^T* B)。)

计算完一个之后,根据stride的大小移动对应的位数(即切换到下一个receptive field),先横着走,到图片尽头后再向下stride位从重复上述过程。

如此便可得到一个全是上述计算的内积的一组数字(因为假设的输入是黑白照片,只有一个通道,所以每个filter扫出来的是矩阵,且他的长宽和原图不一样大,会更小一点,因为啥呢自己画两个大小不一样的方框绕一圈就看出来了)。通过观察这个矩阵,哪里大,就说明对应图片的哪里有这个filter想要找的pattern。

然后对每一个filter做同样的处理。

这样就得到了filter数量的一堆成组(矩阵)的数字将其称之为:feature map(是一个tensor,每个filter计算的矩阵的长宽和filter数量是这个tensor的三维)!

可以将这个feature map看成一个新的图片,但是这个图片的channel数量是filter的数量,按照上面举例则是64个。他就是这个卷积层的输出。

可以在卷积层后再加卷积层,这样上面得到的feature map就是这下一个卷积层的输入图片。

第二层的convolution layer也有许多filter,假设这些filter的长宽仍然是 3 ∗ 3 3*3 33,但是他们的大小是 3 ∗ 3 ∗ 64 3*3*64 3364,因为输入的图片有64个channel(通道)。

filter的高度,即channels的数值与输入图片的channels保持相同。所以每个filter扫出来的那一组数字不再是矩阵,而是一个tensor张量,他的厚度或者高度或者channel就是输入图片的channels,64。

有一种担心,如果每层的filter长宽都是 3 ∗ 3 3*3 33会不会无法看到一些尺寸比较大的pattern呢?并不会,如下图所示:

在这里插入图片描述

个人理解: 首先如果是一个更大的pattern的话,这个pattern内的每一片区域也应该是极为相似的。对着这片区域用filter过滤一遍后的结果也会是相同或者非常相似的。也就是说通过第一轮的convolutional layer,即使filter较小,也会保留更大的pattern的特征。

在这样的情况下,下一层的filter所看到的是仍保留了原图的pattern特征的feature map。并且该filter他对应的每个元素还原回原图的话拼接起来就是一个更大的图片。如此就观察了更大的pattern。

也就是说可以通过增加卷积层数来观察更大的pattern。

上图便是表明这件事情。

想要得到这一层convolutional layer的输出feature map,就要和上一个卷积层一样将每个feature的算出来的张量在channel也就是高度上叠加在一起。

比较两个理解CNN的角度

前者后者
receptive field。weight也有biasfilter的参数(也有bias)
parameter sharingfilter扫描全图。即卷积convolution

在这里插入图片描述

视角3 pooling 池化

把一张比较大的图片做subsampling降采样,变小。

1. Pooling-Max Pooling

pooling本身没有参数,里面没有weight。不需要learn。比较像activation function。

以Max-Pooling为例,按照之前的做法,每一个filter对图片扫描一遍都会获得一组数字。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cYud9bA-1648377128968)(imgs/Max%20Pooling.png)]

pooling就是把这些数字几个几个分成一组,上图就是 2 ∗ 2 2*2 22一组,每一组里选一个代表,在max-pooling中就是选最大的那一个。min pooling就是最小的那个。mean就是取平均。

所以昨晚convolution之后,往往后面还会跟着一个pooling。pooling做的事情就是把图片变小。,但是保持原channel不变。

实践中往往convolution与pooling交替使用。比如做几次convolution后做一次pooling这样的。

但是pooling对与模型的表现会带来负面效果,比如比较细节的pattern会被pooling给抹除。所以最近时期的CNN都已经在减少pooling的使用,使用full convolution。

pooling最主要的目的就是减少运算量,但是随着电脑算力的增加往往就不做pooling了。

在一个最普通的CNN中如何得到结果呢?

在最后的pooling(或者没有pooling的convolutional layer)之后,进行flatten,即把上一层输出的矩阵或者张量tensor的东西拉直成一个向量,再把这个向量输入道一个fully connected layer中,可能还要再进行softmax。然后最终得到影像辨识的结果。这就是经典的流程。

在这里插入图片描述

CNN Application: Playing GO

除了影像辨识,CNN的另一个常见用处就是下围棋。

下围棋本质就是一个分类的问题。输入是棋盘上黑子和白子的位置。输出就是下一步落子的位置。

但是对于一个network来说,输入的要求是一个向量。棋盘是有 19 ∗ 19 19*19 1919个位置。所以可以把这个棋盘表示成一个 19 ∗ 19 19*19 1919的向量。在向量中,黑子可以表示为1,白子可以表示为-1,没有子可以为0(也可以选择别的数字表示)。这样输入神经网络就可以明确棋盘的样子。

这个问题可以用fully connected network解决,但是用CNN的效率会更高。

因为首先,可以将棋盘视作一个分辨率 19 ∗ 19 19*19 1919的图片,每一个像素就是一个可以落子的位置,按照alpha GO的论文,这个图片的channel(通道)有48个,也就是说要用48个数字来描述一个位置的信息(比如这个位置是不是要被吃掉、旁边有没有不一样颜色的子之类的)。

为什么用CNN下围棋更好呢?

  1. 满足一些pattern比整个图片的尺寸小很多
  2. 满足一些pattern在会出现在不同的位置region。
  3. 没有pooling,因为围棋比较精细,pooling会损失细节。

近年来CNN也可以用于语音识别、文字处理等。但是他们的receptive field的设计就和在图片处理上不再相同。

但是CNN也有一些弱点,比如本来识别是狗的图片,放大或者旋转后,就不能识别出来了。所以事实上CNN并不能处理图片的放大缩小,或者旋转之类的问题。所以在CNN训练之前都要对数据进行data augmentation(数据加强)来对数据进行放大、旋转等处理。有一种网络可以处理:special transformer layer。

为什么用了validation set,还是会overfitting

首先复习什么是validation set以及他的作用。

对于不同的模型,在训练集上选出每个模型最好的function。

然后将每个模型的选出的最好的function在监督集validation set上计算loss。选择其中最小的。

其中在validation set上做出选择也可以看作是一个训练过程。将上述得到的每个最好的方程也都放到一个集合中,在这个集合里寻找最好的方程。

所以即使有监督集也会出现过拟合的原因有可能是,待选择的模型太多了,也有可能是监督集的数据集太小了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值