3. CNN(用于影像分类)
实操见刘二大人第9-11讲-从全连接到CNN-有代码9. 多分类问题 本节介绍如何用softmax解决多分类问题,以及具体解决 - 掘金
CNN用于image分类
注意:所有图片的大小都必须一样
一张输入的图片实际上是RGB三个通道的tensor
3.1 第一个版本故事-neural简化
3.1.1 简化1:提取特征不需要观察整张图
图片分类不需要看整个图片,而是一部分即可,我们设定区域,每个neural只需要关注自己的一个小范围即可
注意:neural之间的范围可以重叠,甚至可以一样(同一个范围可以多个neural)
常见问题:
可不可以不同的neural使用不同的size?可以
能不能只考虑某些channel?可以
可不可以是长方形的?可以
最经典的设置是:
- 侦测所有channel
- 一般都3*3正方形,高和宽都叫kernel size
- stride一般1或者2,希望有重叠
3.1.2 简化2:相同特征在不同图片所在区域不同
每个receptive field 都需要一个鸟嘴的检测器吗?不,可以让不同的neural之间共享参数
最经典的设置是:每一个区域都有多个neural检测,但是各个区域的neural的参数都共用一组,这一组参数叫filter
3.1.2.3 总结
Fully Connected Layer通过这两次简化,就有了Convolutional Layer。用Convolutional Layer的Neural Network就是CNN。
3.2 第二个版本故事-filter
一个Convolution中就是有很多的filter,每个filter就是用来检测图片中的特征的
3.2.1 filter的运算
将filter与区域做数乘(对应相乘)后相加,在按照stride移动运算。依次类推运算
这个运算中filter怎么检测特征?
如图举例:对角线三个1,其他都-1,此时区域中对角线三个1,其他都0时,计算结果最大,其他情况慢慢变小
说明左上角和左下角有出现特征,这样将所有channel扫描完成,就可以得到另外一群数字,叫Feature Map
3.2.2 多重Convolutional Layer
这串新的数字可以看作一张新的图片,就可以使用多重Convolutional Layer
上图举例第一层使用64个filter,这样输出就是64的通道的图片,在第二层中输入就是64通道的图片
3.2.3 问题:3*3的filter会不会不够用?
不会,因为在下一层的一个3*3就可以对应到上一层图片的5*5
只要够深,可以检测到一个很大的区域
3.3 两个故事比较
左边每一条权重就对应右边每一个数字,只是右边忽略了bias
为什么叫convolution?convolution就是指把一个filter扫过一个区域的过程
| neural版本故事 | filter版本故事 |
|---|---|
| 每个神经元只盯着一小块区域(receptive field)看 | 有一组filter,专门找图像里的小特征 |
| 不同receptive field的neural用的是同一套参数 | 每个filter都会在图像上一点点“扫过去”(卷积操作) |
其实说的是一回事!
3.4 下采样(池化)
对一个比较大的图像做下采样不会改变对象
Pooling没有参数,不需要学习
3.4.1 Max Pooling
在一组之中选择最大的
池化后为
问题:
一定要最大值吗?不一定,还有Mean Pooling等等
一定2*2吗?不是,只是这里设置一组为2*2
3.4.2 卷积+池化
3.4.3 问题
池化是压缩数据,一定会有损失,当特征比较精密时或者算力足够时,可以考虑不做池化,采用Full Convolution
不是所有的CNN都要用Pooling
3.5 应用举例:Alpha Go
3.5.1 怎么用CNN
查看论文附件发现Alpha Go 没有用Pooling
是将一个棋盘看作是一张48个channel的19*19图片
3.5.2 为什么可以用CNN
因为满足两个neural简化
3.6 完整的CNN
做完卷积+池化后,拉平交给全连接层,通过SoftMax实现多分类
3.7 CNN的问题
CNN不能处理影像放大缩小和旋转,比如上两张图放缩后内部数字差别很大,CNN就认不出来了。这时就需要data augmentation