李宏毅机器学习系列-卷积神经网络

为什么要用卷积神经网络(CNN)

如果我们用一般的全连接神经网络来做图片的分类的话,应该是这样,我们将图片转换为一个向量,然后用很多层进行特征提取,最后输出一个向量,好像没啥问题:
在这里插入图片描述
但是仔细想想如果我们的图片很大每个像素是一维向量,假设一张200x200的图,就有一个40000维的输入,如果只用一层隐藏层,有1000个神经元,那我们的参数已经是40000x1000=4000万了,已经非常多了,如果图片大的话,层数深的话参数更加多,所以有没有其他方法呢:
在这里插入图片描述
我们会考虑参数能不能减少呢,可以共享么,还有我们要识别的模式可能只是图片的一部分,也许没必要考虑整张图,就像下图一样,我们要识别出鸟嘴,他在图片里可能只是很小的一部分,所以不需要整个图片去做,只要一部分图片特征就可以了:
在这里插入图片描述
另外很多相同的图片特征可能出现在不同的区域,我们可不可以让他们用相同的参数,不需要每一个去训练一组参数:
在这里插入图片描述
还有,对于图片来说,如果适当缩小了,特征还是很明显的,所以不需要处理尺寸很大的图,可以进行缩放,这样参数也就减少了:
在这里插入图片描述

卷积神经网络(CNN)基本结构

卷积神经网络的基本结构可以简单的归结为输入图片,卷积核池化,全连接层。卷积核池化是可以出现多次的,因为卷积是在提取特征,可以看成对特定纹理的响应,池化可以看成是缩放特征,是在模拟感受野:
在这里插入图片描述
其中卷积层可以非常好的处理那些小于图片的特征,还有多个相同特征在不同的区域的情况,池化层则是在进行缩放,但是不会改变目标特征:
在这里插入图片描述

卷积层

来看看卷积层是做什么的,如果下图,左边的6x6的图片,假设每个像素点就两个值0和1,右边的是一堆过滤器,每个过滤器是一个3x3的矩阵,且上有自己的像素点值:
在这里插入图片描述
然后我们进行卷积操作:其实就是把过滤器放在图片上,从左到右,从上到下的移动,假设我们移动的步调stride=1,我们最开始的情况是这样:
在这里插入图片描述
然后我们把这个红框里矩阵和过滤器Filter1做点积,得到结果为3:
在这里插入图片描述

然后再向右边移动一步,做点积得到结果为-1:
在这里插入图片描述
于是我们得到了两个结果:
在这里插入图片描述
如果继续这样做,直到过滤器到图片的最后,我们可以得到:
在这里插入图片描述
我们可以观察下原图和我们过滤器的图,有什么相同点,那就是斜对角线是一样的,所以我们可以看到,我们卷积后的结果在左上角和左下角的值比较大,因为他们是图片中左下角和左上角和过滤器最相似的,如下图:
在这里插入图片描述
同理,我们拿Filter2也进行这样的处理,然后和第一个处理的结果合起来,叫做Feature Map:
在这里插入图片描述
那如果是输入彩色的图呢,当然也可以啦,彩色的图无非就是RGB三通道,可以把每个通道都分离出来,变成了3个的矩阵:
在这里插入图片描述
同样我们也用相同维度的过滤器来进行处理,过滤器也是3个矩阵,三个矩阵分别对图片的三个通道做卷积:
在这里插入图片描述

卷积层的特点

我们拿一张图来跟两个过滤器进行卷积,得到结果如下图,是两个4x4的矩阵叠加:
在这里插入图片描述
如果是全连接呢,如下图:
在这里插入图片描述
其实我们如果把卷积的结果给平展开,就是全连接的样子,只是连接数少了,因为过滤器就是参数,而且共享了。

我们可以看下面这张图,我们拿过滤器1对第一个地方进行卷积操作,获得到的结果是3,就是图片右图所示,我们把图片像素按行展开了,总共36个,和他连接的9条彩色的线就是过滤器的参数,从图片的9像素点连接到结果3,没有连接的就是没进行卷积的像素,都是0,连接到的就是红框里的像素的位置,这么做参数是不是少了很多呢:
在这里插入图片描述
再来看看移动一步进行卷积的结果,跟上面一样,我们可以看到还是9条线,因为是同一个过滤器,参数值是一样的,也就是参数共享了,层和层之间只有9个参数:
在这里插入图片描述
从上面的例子可以看出卷积层有参数共享和连接稀疏的特点,使得参数相比全连接层少很多。

最大池化层

池化层思想很简单,就是把卷积之后的结果4x4的再分块,然后选最大的,比如2x2的池化就是这样分:
在这里插入图片描述
最后输出变成2x2了:
在这里插入图片描述
直观来看卷积层和池化层在做的就是提取特征,缩小尺寸,但是特征的维度其实是在增加的,这个跟过滤器的数量有关,很直觉的理解就是我们拿多少个不同的过滤器来提取特征应该就有多少个不同的特征响应维度也可以叫做通道:
在这里插入图片描述
之后我们会对特征图进行展开,给到我们的全连接层做处理:
在这里插入图片描述
展开是会按通道从头到尾,每个通道内按行连接,进行展开:
在这里插入图片描述

Keras里该怎么做CNN呢

其实就是两句话啦,一个是定义卷积层,是2D的,参数分别是过滤器数量,尺寸,输入维度,另一个是定义最大池化,输入尺寸即可:
在这里插入图片描述
每一个过滤器有9个参数,可以把输入理解成一张大饼,经过一层卷积后,尺寸变为25x26x26的粗面包了,经过池化后变成了截面缩小了一半,然后继续卷积继续池化,最后变成一个很长很细的面包:
在这里插入图片描述
最后展开送进全连接层里,激活函数是relu,分类函数是softmax:
在这里插入图片描述

CNN学到了什么

我们要衡量CNN学到了什么就要看经过两次卷积和池化后的结果程度,因为前面讲了,卷积的结果是跟过滤器的相似度成正比的,越相似数值越大,所以我们可以用11x11的矩阵的元素和来作为相似的程度,也就是说是某个过滤器激活的程度,如下,我们把所有的激活值都相加,求最大,也就是如果我们能找到一个最大的输入,使得这个激活值最大,也就是更过滤器最相似,那我们就能通过输入的图片知道过滤器长什么样子了:
在这里插入图片描述
结果如下,我们发现一些过滤器的图片是某种纹理的集合,也就是说某个过滤器在寻找跟他相似的纹理,越相似激活值越大:
在这里插入图片描述
同样,我们可以观察全连接里的神经元到底在做什么,我们定义第j个神经元的激活值为 a j a^j aj,我们要做的就是找出一个输入,使得 a j a^j aj越大越好,则 a j a^j aj这个神经元就是在找输入这样的特征,找出的9个图如下,好像挺奇怪的:
在这里插入图片描述
可以看到刚才过滤器所看到的图片是某中纹理,因为过滤器是看某个局部的信息,而神经元所看到的是某种完整的图形,他是看整个图片的信息。

同样我们想看看输出所看到的是什么样的图,用同样的方法,得出让输出最大的输入图片,我们得出结果0到8的图形,看起来貌似不像数字啊,像一堆噪声,跟我们人类学到的不一样:
在这里插入图片描述
那我们有没办法让这个图看起来更加像数字呢,或许我们可以限制一下输入x,让他把一些乱七八糟的图形给去掉,所以可以加上L1的正则化,对x的范围有所限制,最后发现结果好像有点看的出来了,可以看到那个6,4好像有点感觉,其实还可以用其他的技术,让他能看到更加清楚的东西,比如GAN,有兴趣的可以看看我的GAN系列文章:
在这里插入图片描述

Deep Dream

这个东西就是强化了CNN看到的东西,比如你有一张照片,把他丢入CNN,然后生成一个向量,你把这个向量里面的正的值加大,负的值变小,也就是在对CNN做强化:
在这里插入图片描述
之后你就会看到很奇怪的动物来了,这个或许就是加强后的结果,本来他觉得看到的石头样子像熊,现在又被加强了,所以就直接给显示出来熊了:
在这里插入图片描述

Deep Style

还有一个进阶版,也就是我们熟悉的图片风格转换,可以选择一个图片作为内容,一个图片作为风格:
在这里插入图片描述
结果就是这样:
在这里插入图片描述
这个的原理就是一张图片提取内容,一张图片提取风格,然后我们要生成一张图片,既要和内容图片相似又要和风格图片相似,因此就会融合在一起了:
在这里插入图片描述
当然AlphaG下围棋也有用到CNN,他看的就是整个棋谱19x19图:
在这里插入图片描述
然后训练的时候就是会看到一些固定的走法,然后给出响应的输出,做有监督学习:
在这里插入图片描述
为什么要用CNN呢,因为有一些常见的下棋样式出现的特别多,比如下面的这个样式:
在这里插入图片描述
不过貌似没有用到最大池化,可以看下他的一些介绍:
在这里插入图片描述

CNN的应用

我们可以把CNN用在语谱图上,根据频率的特征来识别出是什么内容:
在这里插入图片描述
还可以用在句子正负面的识别上,在词向量上用CNN有点类似RNN,可以保留一部分之前的词的特征:
在这里插入图片描述

总结

本篇主要介绍了CNN的特点,内部原理和一些应用,思维导图:
在这里插入图片描述
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值