【卷积神经网络】李宏毅2021/2022春机器学习课程笔记EP8(P31)
从今天开始我将学习李宏毅教授的机器学习视频,下面是课程的连接(强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili。一共有155个视频,争取都学习完成吧。
那么首先这门课程需要有一定的代码基础,简单学习一下Python的基本用法,还有里面的NumPy库等等的基本知识。再就是数学方面的基础啦,微积分、线性代数和概率论的基础都是听懂这门课必须的。
本节课主要介绍了卷积神经网络CNN相关的知识。
CNN是一个用于影像分类的模型。它的主要过程如下图:
我们首先将一张需要影像辨识的图片放入模型当中,经过模型会输出一个y’,然后我们希望这个y’和我们训练集中的y label的交叉熵越小越好。这里y label的one-hot里的维度长度就决定了现在的模型可识别的种类的数量。然后这里提到的交叉熵在EP4(【类神经网络训练不起来怎么办】李宏毅2021/2022春机器学习课程笔记EP4(P19-P22) – -TobyKSKGD的个人博客-)里面提到过,如果忘记可以去查看。
接下来的问题就是怎么将一张图片放入模型当中。
这里举例一张100 x 100的图片,因为它是一张彩色的图片,它有红绿蓝三个图层(channel),所以我们说这是一张三维的张量(tensor)。我们将这个张量拉直成一个向量,在这个向量里,每一维的数值代表了某一个位置的某一个颜色的强度。
我们这里举例的是一个100 x 100的图片,将它直接放到模型里面很不现实,因为这里的向量里面有3 x 100 x 100个参数,每一个参数都有一个对应的权重,权重的数量越多,模型的弹性就越大,这样就很容易发生过拟合的问题。这里100 x 100的图片参数都已经巨多了,就更不用说实际上我们放入模型的图片了。
但其实我们放入模型中的参数其实并不需要那么多,只需要将图片中的特征提取下来,将局部放入神经网络即可。回想我们人类去辨别一只鸟的方法也是这样,也是只看它的局部特征,比如只看它的鸟嘴、眼睛和爪子就判断这是一直鸟。所以我们的影像分类模型也可以像这样去识别图像。
下面将通过两个不同的角度去讲述CNN的原理。
先看图:
这里先来解释感受野(Receptive field)这个名词,感受野就是我们在一张图片中要侦测的部分(特征提取的部分)。我们可以将感受野内的一个张量拉直成向量,输入到神经元中,在神经元中去识别图片。然后在这里说明:被感受野侦测的范围可以重叠;同一个感受野可以对应多个神经元。
这里你可能会有几个疑问:
不同的神经元是否可以有不同大小的感受野?
感受野可不可以只覆盖在一个图层(channel)上?
感受野的形状大小可不可以不规则?
这里的答案都是:可以!感受野可以根据实际问题去决定长什么样子。
这里介绍一个一般的设置方式:
你可能在前面会有一个疑问,就是如果只看一部分的特征,那每一张图片中出现特征的地方都不一样啊,要怎么精准的提取到特征呢?这里就引入了一个参数stride(步伐),这个步伐一般设置的都很小,它可以决定感受野移动距离的大小,那把它设置很小的原因主要是因为最好是overlap,最好移动的区域有重叠,这样我们的感受野可以完全地扫过整张图片,在每一个感受野中都有相对应的神经元去做判断,这样就可以精确的提取到特征了。然后如果感受野走到一排的边缘怎么办?解决的方法就是填充(padding),一般我们可以将感受野中出去的部分都填充成0。还有一个名词要解释,一般的影像识别都是识别彩色的图片,所以一般这里的channel都是3,我们就可以先不去考虑感受野的深度,只考虑它的长和宽,那这个长和宽的参数有一个名词叫做kernel size。
前面说了,因为同样的特征可能会出现在图片的不同位置,所以我们要将感受野扫过整个图片,这样总有一个感受野的神经元可以侦测到“鸟嘴”这个特征。但是这样你就会发现,像上面例子中的两张图片一样,两个神经元都在做同样的工作。但是我们真的需要给每一个感受野都放上侦测“鸟嘴”的神经元吗?
因此,我们需要权重共享!
你可能会问,如果把神经元中的权重共享了,那输出的东西不会变得都一样吗?
答案还是不会。因为不同的感受野,所以输入的参数不同,所以就算共享权重,最后的输出也会不同。因此,共享权重可以更加有效地提取特征。
接下去介绍一般权重共享的方法:
下面来解释权重共享的方法。
首先,每一个感受野都有一组神经元去侦测,这里一组是64个神经元。然后我们看上图两个权重共享的感受野,上面两个颜色一样的圆点表示两个神经元共享一组参数,那这组参数的名字叫做过滤器(filter)。
自此我们就解释完了CNN,我们再来梳理一下什么是卷积层。
我们之前学习到的神经网络层叫做全连接层,它的特点就是样样问题的可以使用,但是样样问题都不够精通。我们通过以上的两步简化,添加了感受野和权重共享的方法,就将全连接层变成了卷积层,它相对于影像来说,它的模型bias更大。
通过上面的解释,你可能会有点懵。没有关系,接下去是对CNN第二个版本的解释。
如果说上一个解释是基于感受野的,那么这个第二种解释就是基于滤波器的。
通过上面的解释,我们知道了:卷积层里有很多的滤波器。
和上面不同的是,这次我们用滤波器扫一遍图像。
我们每用一个滤波器扫过一片图像就会做一次inner product(对应位置相乘再相加)得到一个数字,这样滤波器扫过一整个图片就会得到一群数字。这里得到的数值大,说明图片种此区域与滤波器对应程度高。
那一层卷积层会有一组(这里举例64个一组)滤波器,我们用滤波器扫完之后就得到了有64个图层(channel)的图像,也就是说这是一个64维的图片。
我们将上一个卷积层的输出作为输入再输入到下一层的卷积层当中去。因为输入的图片是一个64维的图像,所以我们将这一层的滤波器大小设为3x3x64,这里我们直接将滤波器的长和宽设为3×3。你可能会问,3×3会不会太小?答案是不会。虽然滤波器的大小是3×3,但是在图像上侦测的大小就是5×5。然后只要卷积的层数够多,滤波器看的范围就会越来越大。
接下去我们也来说说这个版本的权重共享。
这个版本的权重共享是滤波器里的值共享,上一个版本里权重共享的权重就是这个版本里滤波器的值。
然后用滤波器扫过图片这件事就叫做卷积(convolutional)。
卷积层中会有64层的图像对计算机的计算能力是一个不小的考验,这里就引入了池化(Pooling)的感念。
我们可以减少一张图片的长和宽,将图片缩小,这样不会对我们的影像识别造成什么不好的影响。这一步叫做subsampling。
池化有很多的方法,这里介绍的是Max Pooling。这个方法就是将通过卷积层的图像中的数字分组,取每组中最大的数字组成新的图片。
注意!我们做池化主要是为了减少计算量,但是随着计算机计算能力的变强,很多时候可以不用池化层,这样可以让效果更好。因为池化的作用是将图像的长宽缩小,所以也要根据实际问题去决定要不要使用池化层。
介绍完了两个版本的CNN,我们来看看一整个CNN可能的样子。
我们先将一张图像放入卷积层和池化层的循环当中,最后我们把输出的矩阵拉直成向量,我们把向量再放入前面说的分类问题的全连接层中,最后得到输出的结果。
最后我们来谈谈CNN除了影响分类还可以干什么。
著名的阿尔法狗就用到了CNN,所以CNN还可以用在下围棋中。
你可能会问,CNN不是图像识别吗,怎么还可以下棋?
我们可以将这个棋盘看作一张19×19的图片,然后用48个channels去表示棋盘上一个点发生的事情。
下围棋和CNN相似的地方还有:
下棋看局部局势也可以判断下一步的走法。
同一个特征可以出现在图片的不同位置。
不过这里说阿尔法狗主要是想说明,CNN的池化层应该根据实际需要去决定要不要加入!像下棋这个例子中,我们就不能用到池化层,用来池化反而不行。具体就不继续展开了。
CNN还可以用在语音识别上面。
最后的最后要说明一下CNN的缺陷。
因为图片放大缩小后拉直成的向量不同,所以CNN不能处理影像的放大缩小或旋转。
所以在CNN训练时要数据增强,把一张图片放大缩小旋转后的样子都给CNN看一遍才行。
以上就是对CNN讲解的笔记。