引子:图像分类
对计算机来说图片是什么?
一张图片是一个三层的tensor
把tensor拉直成为一个向量就可以作为一个network的输入。
这里用全链接层,可以发现如果我们是对100*100大小的图片做分类,需要训练的参数weight个数高达3X10^7,这么多的参数很容易导致过拟合问题。
那么考虑到图片分类的问题上,可以发现其实不一定每个Neuron都需要考虑整张图片的每个位置也就是向量的每个x。
如何理解这个说法呢?
其实对于分类一张图片来说,其实可以理解成对图片每个部分的一个匹配,比如观察一张图片是不是鸟,可能会分别观察它的嘴、眼睛、爪子。。。并不是直观的从整张图片上来看(全链接层),也就是说每个Neuron其实可以负责图片的一部分特征的观察,也就是观察到了某些patter,综合这些信息就能对图片进行分类了。
-
第一次简化
那么从以上说法我们就可以对全链接做第一次简化,每一个Neuron我们设置一个Recptive field,也就是这个Neuron关心的区域,其他区域就不管了。
那Recptive field如何决定呢?这就需要自己来决定了,取决于你要观察什么位置,要观察什么范围。
需要注意的是Recptive field是可以重叠甚至可以是一样的(两个Neuron观察不同的pattern)
灵位Recptive field也可以覆盖不同的区Chanel,形状都是自己决定了,不一定是正方形,这些都取决于你想要识别什么样的Pattern。
那其实最经典的Recptive field如下
- 覆盖所有channels33大小
- 一个Recptive field一门会分配一组Neuron, 比如一个Rf分配64个Neuron
- Rf一般是设置一定的步长覆盖整个图片,而且相互会有重叠,这个目的是为了识别可能在两个Rf之间的Pattern。
-
按上面的方法Rf超过了图片的范围一般用padding,进行补值(一般是0)
8E52838F-F328-4852-B630-203CC636965F.png
第二个问题,同样的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
网友评论