深度学习:原理简明教程12-深度学习:计算机视觉问题与CNN——作者:Ling,作者链接: http://www.bdpt.net/cn
欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程12-深度学习:计算机视觉问题与CNN
深度学习的有两大利器:CNN和RNN
本文主要介绍:计算机视觉问题与CNN相关内容。
计算机视觉有很多子问题:
图片分类问题:
对象检测问题:
风格迁移问题:
人脸识别问题:
标界检测问题:
3D问题:
等等
以前做图像识别需要有经验的科学家,人工提取特征,然后应用机器学习技术进行识别,或者利用图像本身像素值,结合多层神经网络,进行识别。当有了深度学习技术之后,人们发现CNN在图像识别上效果非常好。下面我们首先介绍普通多层神经网络做法及其存在问题,然后介绍有关CNN的基础知识。
多层神经网络识别图像:
实例:
数据表示:
一张64*64的图片,有红黄蓝三个channel,每个像素点取值0-255,这样总共有64*64*3=12288个数值(x输入特征)
一般图远不止64*64个像素点,假设一张1000*1000*3的图片,将有300w也就是3million个数值。
我们构建一个三层神经网络,隐含层,每层1000个节点,输出层一个节点,图示如下:
总共参数至少超过1000*3m = 30亿(3billion)
1)要学习这么多参数,将十分困难。
2)这还只是三层的神经网络。
于是研究者们提出了CNN,我们首先看看什么是CNN,为什么可以用CNN,然后分析为什么CNN可以减少参数,使得训练成为可能。
CNN包含主要内容:
Convolution
Filter(Kernel)
Padding
Stride
Pooling
MaxPooling
AveragePooling
Convolution:卷积
Input:
1)5*5*3 的图,其中h高为5,w宽为5,channel为3
2)图中最左边的三幅图分别是三个channel的图,注意这个图外围打了padding,待会介绍padding。
2)x[:,:,0]表示第一个channel的像素值,其他类似
Padding:
1)在input周围加了一圈,padding=1,使得input变成7*7*3
2)作用:为了让最后的output符合一定大小
3)类别:
- 自定义padding大小
- Valid Padding:无padding
- Same Padding:为了让output size等于input size
Filter:
1)也称Kernel
2)图中有两个Filter:Filter W0 Bias b0和Filter W1 Bias b1
3)其中Filter W0:3*3*3 b0: 1*1*1
4)Kernel size:(3,3) ,最后的那个3实际上由input的channel决定,所以不算在kernel size中。一般为正方形kernel。
5)Filter中的每个具体参数值是要通过学习获得。
Stride:
Kernel在input上每次移动的步数,本图每次移动两个格子,所以stride=2
Output:
1)每个filter在input上操作,产生output一个channel的结果,本图有两个filter,所以产生了两个channel的结果。
2)对于一个output产生过程为:
input 蓝色框内容和filter 红色框内容,按位相乘,然后相加在一起,加上bias,生成output中绿色框内容:
我们看看这些参数之间的关系:
以上就是Convolution。
Convolution在做什么?
图:
1)0是黑色,255是白色。
2)看最上方的filter:第一列是1,相对白,第二列是0,相对黑,第三列是-1,相对很黑,所以该filter可以提取这种模式的小方块特征,如果符合,则值越大,不符合,值越小。
3)看最上方input:第一个3*3方块不符合,所以output第一个为0,第二个3*3方块比较符合,所以output第二个值为30,同理第三个值是30,第四个值是0
4)最终经过上方filter,提取出了符合这个filter的特征,整体看,像是发现了vertical edge
5)不同filter可以提取不同的特征
实际上,经过各层Convolution的神经网络可以达到如下效果:
先提取了各种edge特征,然后组合出更复杂特征,然后再组合出比较接近人脸的特征。
Pooling:
1)对Convolution结果进一步处理
2)种类:
- Max Pooling
取每个小块中的最大值作为结果,如果多个channel会跨channel取最大
- Average Pooling
取小块中所有值平均值作为结果
Filter size,Stride:类似convolution
CNN一般结构:
一个或者多个Convolution之后跟一个Pooling,反复多次之后,最后跟一个Fully Connected层
例如:
为什么CNN可以减少参数?
我们统计一下该CNN所有参数数目:
发现网络比之前的更加复杂,但是参数却不到5w(是3billion),所以CNN可以大幅度减少参数。
CNN之所有有效在于:
参数共享:
我们可以看到一个filter的一点点参数,就可以作用于整个图片提取特征,从而大大减小参数,从而可以构建更加复杂的网络。提取更多特征。
稀疏连接:
在每一层,每个输出结果,都是依赖原图的一小部分,从而大大增加泛化能力。
(如果你依赖整张图片,给你一个新图片,只要有点不同,就会分类不准,但是整个CNN每个特征都是对图片一小部分总结的,所以换一个新图片,只有类似,就可以有很好地效果。)
总结: