内容纲要

欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程12-深度学习:计算机视觉问题与CNN

深度学习的有两大利器:CNN和RNN

本文主要介绍:计算机视觉问题与CNN相关内容。

 

计算机视觉有很多子问题

图片分类问题

dl_12_001

对象检测问题:

dl_12_002

风格迁移问题:

dl_12_003

人脸识别问题:

dl_12_004

标界检测问题:

dl_12_005

3D问题:

dl_12_006

等等

 

以前做图像识别需要有经验的科学家,人工提取特征,然后应用机器学习技术进行识别,或者利用图像本身像素值,结合多层神经网络,进行识别。当有了深度学习技术之后,人们发现CNN在图像识别上效果非常好。下面我们首先介绍普通多层神经网络做法及其存在问题,然后介绍有关CNN的基础知识。

 

多层神经网络识别图像

实例

dl_12_007

数据表示

一张64*64的图片,有红黄蓝三个channel,每个像素点取值0-255,这样总共有64*64*3=12288个数值(x输入特征)

一般图远不止64*64个像素点,假设一张1000*1000*3的图片,将有300w也就是3million个数值。

我们构建一个三层神经网络,隐含层,每层1000个节点,输出层一个节点,图示如下:

dl_12_008

总共参数至少超过1000*3m = 30亿(3billion)

1)要学习这么多参数,将十分困难。

2)这还只是三层的神经网络。

于是研究者们提出了CNN,我们首先看看什么是CNN,为什么可以用CNN,然后分析为什么CNN可以减少参数,使得训练成为可能。

 

CNN包含主要内容:

Convolution

Filter(Kernel)

Padding

Stride

Pooling

MaxPooling

AveragePooling

 

Convolution:卷积

dl_12_009

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中绿色框内容:

dl_12_010

 

我们看看这些参数之间的关系

dl_12_011

以上就是Convolution。

 

Convolution在做什么?

图:

dl_12_012

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的神经网络可以达到如下效果:

dl_12_013

先提取了各种edge特征,然后组合出更复杂特征,然后再组合出比较接近人脸的特征。

 

Pooling

1)对Convolution结果进一步处理

2)种类:

  • Max Pooling

取每个小块中的最大值作为结果,如果多个channel会跨channel取最大

dl_12_014

  • Average Pooling

取小块中所有值平均值作为结果

dl_12_015

Filter size,Stride:类似convolution

 

 

CNN一般结构

一个或者多个Convolution之后跟一个Pooling,反复多次之后,最后跟一个Fully Connected层

例如

dl_12_016

为什么CNN可以减少参数?

我们统计一下该CNN所有参数数目:

dl_12_017

发现网络比之前的更加复杂,但是参数却不到5w(是3billion),所以CNN可以大幅度减少参数。

 

CNN之所有有效在于

参数共享

我们可以看到一个filter的一点点参数,就可以作用于整个图片提取特征,从而大大减小参数,从而可以构建更加复杂的网络。提取更多特征。

稀疏连接

在每一层,每个输出结果,都是依赖原图的一小部分,从而大大增加泛化能力。

(如果你依赖整张图片,给你一个新图片,只要有点不同,就会分类不准,但是整个CNN每个特征都是对图片一小部分总结的,所以换一个新图片,只有类似,就可以有很好地效果。)

 

总结

dl_12_018