【李宏毅机器学习】CNN卷积神经网络

2021-06-23  本文已影响0人  jenye_

引子:图像分类

对计算机来说图片是什么?

一张图片是一个三层的tensor

把tensor拉直成为一个向量就可以作为一个network的输入。


这里用全链接层,可以发现如果我们是对100*100大小的图片做分类,需要训练的参数weight个数高达3X10^7,这么多的参数很容易导致过拟合问题。

那么考虑到图片分类的问题上,可以发现其实不一定每个Neuron都需要考虑整张图片的每个位置也就是向量的每个x。

如何理解这个说法呢?
其实对于分类一张图片来说,其实可以理解成对图片每个部分的一个匹配,比如观察一张图片是不是鸟,可能会分别观察它的嘴、眼睛、爪子。。。并不是直观的从整张图片上来看(全链接层),也就是说每个Neuron其实可以负责图片的一部分特征的观察,也就是观察到了某些patter,综合这些信息就能对图片进行分类了。


那其实最经典的Recptive field如下

第二个问题,同样的Patterns可能在图片的不同位置,比如鸟嘴可能会出现在图片的不同位置,那么是不是每个位置都需要有一个Neuron来识别鸟嘴呢?这样嘴其实是很低效的()。


这就引出了第二个简化:共享参数




让不同rf的Neuron共享参数。
让不同rf的Neuron能够识别同一个Pattern

常见的共享参数的方法:



共享参数的Neuron我们叫它filter1,filter2...
实际上,回到图片分类的问题,就是每个Rf我们要对图片的每个Pattern进行识别(每一个区域我们都需要判断是鸟嘴、爪子、眼睛...)

加上参数共享之后,这个过程可以说是卷积层了。

那么卷积层和全链接层有什么联系呢?



其实按我自己的理解Neuron反而变多了,但是Neuron的拟合能力变差了,也就是w变少了。全链接层就是可以自定义rf大小没用参数共享的卷积层,而卷积就是全链接层做了针对图像问题的一些限制。

如果之前有学过CNN,其实是另一种描述方法

其实不管是哪种方式,只是换一个角度描述而已。
Filter 理解成抓取特征的一个模块



通过filter抓取特征之后生成featrue map



我们可以再加一层卷积层,也就是对featrue map再做一次特征抓取,使用同样大小的filter抓取的范围就变大了。



对比两个版本对于卷积层的描述


其实所谓filter里面的数字,就是前版本描述的neuron的权重,只是在描述的时候忽略掉了bias的描述,其实两者是完全一样的。

第二个版本的Filter的滑动抓取,其实就是第一个版本的共享参数。



这个滑动的过程其实就是所谓卷积



池化


比如把偶数的像素拿掉,只会影响图片的大小,不会影响图片是什么东西。

Max Pooling


Max Pooling 之后


Pooling的目的其实就是把图片变小

Pooling实际上没有w需要学习,所以不称为一个层,Pooling的方式,和大小都是可以自己根据实际问题选择的

实际上,如果需要侦测的pattern比较小,Pooling可能会导致某些特征消失,尤其是现在计算能力不断变强,很多架构在做卷积的时候都去掉了Pooling的过程。

完整的CNN架构

Playing Go 用来下棋的CNN

把棋盘作为一个19X19分类的问题,选择下一步落子的位置。
这个问题完全可以用全链接层,但其实CNN的效果更好,也就是把一个棋盘看作一张图片。

直观看怎么理解?


其实在下棋的问题上,从局部也可以发现一些Pattern

但是Pooling呢?



实际上在alpha go的CNN架构中,并没有用到Pooling。
所以实际上,CNN不一定要有Pooling

今年来其实也用在一些其他的领域



这些Respective field会有不一样的设计。

More

实际上,CNN是没法解决图片放大、缩小、旋转的问题。
所以我们在训练的时候需要做augmentation,也就是在数据集加上旋转、放大缩小的问题。
那有什么架构可以解决这些问题吗 》 Spatial Transformer Layer


上一篇下一篇

猜你喜欢

热点阅读