李宏毅机器学习课程笔记05 | 卷积神经网络Convolutional Neural Network(CNN)
文章目录
- Image Classification
- 问题:怎么将一张图片当作一个模型的输入
- 全连接网络Fully Connected Network
- 版本1神经元角度:观察1 Receptive Field
- Typical Setting
- 版本1神经元角度:观察2 parameter sharing共享参数
- 总结 Convolutional Layer的好处
- Convolutional Layer的版本2:filter角
- comparison of Two Stories
- 总结:Convolutional Layer
- Convolutional Layer用于影像辨识的观察3:Pooling
- pooling - Max Pooling
- Convolutional Layers + Pooling
- The whole CNN => pooling可有可无
- CNN最常见的应用之一: Alpha Go
- 与影像辨识比较
- CNN近年来的应用:语音,文字处理NLP
- To Learn More:CNN的缺陷——空间变换 ⇒data augmentation
本章提要
- 为什么设计NetWork的架构设计会让Network结果做得更好。
- 透过CNN,看NetWork架构的设计有什么想法。
Image Classification
在下面的讨论里,假设输入的图片大小是100*100的,这里的目标是分类,我们将每一个图片表示为One-Hot
的向量,将其称为
y
^
\hat y
y^。
目前做影响辨识的时候,往往都有这样的假设。如果输入的不一样,常见的处理方式是把所有图片都先Rescale成大小一样
模型通过soft-max
后输出为
y
′
y'
y′,我们希望
y
′
y'
y′和
y
^
\hat y
y^的Cross Entropy
越小越好。
补充1:soft-max的作用
①归一化normalization
每一个分量,并且和为1。
② 原本大的值跟小的值的差距更大
补充2: cross-entropy loss function 是在机器学习中比较常见的一种损失函数。
问题:怎么将一张图片当作一个模型的输入
对于机器来说,一张图片其实是一个三维的Tensor
(维度大于2的矩阵就是Tensor
)。其中一维表示图片的宽、另外一维表示图片的高、最后一维表示图片的Channel
数目。
图片中每个像素都是由RGB三个颜色所组成,3个Channel
就代表了RGB的三个颜色,也就是说3个Channel
表示一个像素点。长*宽表示图片的像素数量。
将三维Tensor
拉直后丢到一个Network
里,拉直后的向量维度为100*100*3
,每一维是某个pixel
像素的某个颜色强度。
全连接网络Fully Connected Network
我们之前课程学习的网络是全连接网络,每一个Neuron
跟每一个特征都有一个权重Weight
。在本例中输入向量的每一个维度都是一个特征,那么每一个Neuron
跟输入向量的每一个数值都有一个Weight
。
假设第一层的Neuron
数目有1000个,这里的特征有100*100*3,那么一共有
3
∗
1
0
7
3*10^7
3∗107 个Weight
。
之前的例子补充理解
其实当天的观看人数可以和前几天的有关,模型可以表示为
=
b
+
∑
i
s
i
g
m
o
i
d
(
b
i
+
∑
j
w
i
j
x
j
)
=b+\sum_isigmoid(b_i+\sum_jw_{ij}x_j)
=b+∑isigmoid(bi+∑jwijxj) i是不同的function函数数量,j表示当前日期的前j天,
w
i
j
w_{ij}
wij第i个sigmoid给第j个特征的权重。
问题:模型的参数过多,可以增加模型的弹性,同时也增加了Overfitting的风险
之前学习的例子,方便理解
补充说明:为什么模型参数越多,增加Overfitting的风险
版本1神经元角度:观察1 Receptive Field
影像辨识的类神经网络的Neuron
任务就是侦测输入的图片里有没有出现一些特别重要的Pattren
,这个Pattern
代表了某种物件。
识别的目标变成了:让Neuron
判断有没有某种Pattern
出现
不需要每个Neuron
都去看一整张图(连接所有特征),也就是说对于每个Neuron
其实不需要将整个图片当作输入,只需要把图片的一小部分当作输入就足够让它们侦测某些特别关键的Pattern
。
Typical Setting
在CNN中会设定一个Receptive Field
区域,每一个Neuron
都只关心自己的Receptive Field
里面发生的事情。
假设下图中Receptive Field
有3(长)*3(宽)*3(深)数值,下图蓝色neuron
只需要关心这个范围就可以了。将这333的数值拉直成27维向量(27个特征)作为neuron的输入,Neuron
会给每一维一个weight
,所以这里有3*3*3=27个weight
(每一维是某个pixel
像素的某个颜色强度,可以看成一个特征)
问题:如何选出Receptive Field
?
自己设置
1.每个Neuron
的守卫区域可以重叠
2.不同的Neuron
可以守卫同一个区域
每一个
Receptive Field
区域的大小可不可以不一样? => 可以不一样有些
Pattern
可能只会在蓝色的 Channel出现,可不可以只考虑一个Channel => 可以怎么确保一个
Pattern
没有被拆分给不同的Neuron
Typical Setting:最经典的设计是什么样的?
- 会看所有的Channel(RGB一起),而不是单一颜色 => 所以在描述
Receptive Field
时只需要将宽高(被称为kernel size),因为深度就是3。
一般kernel size
不会设太大,影像辨识中一般3*3就足够了
- 同一个
Receptive Field
会有一组Neuron
去守备这个范围,比如64或者128 => 使用一组的Neuron
为了识别不同的模式 - 将一个
Receptive Field
往其他方向移动一点(移动范围被称为stride
)制造一个新的Receptive Field
=>stride
是一个超参数,需要自己调大小,一般不会设置太大,通常设置为1或者2
希望不同的Receptive Field
之间有重叠(高度重叠),某个Pattern
可能被拆分给不同的Neuron
。如果Receptive Field
没有重叠,那么会没有Neuron
去侦测它。
问题:如果一个范围为3*3,移动到最右侧时部分区域超出影像范围怎么办?
解决办法:超出的部分采用Padding补值,可以补0或者采用其他策略补值
版本1神经元角度:观察2 parameter sharing共享参数
观察到:同一个Pattern
可能出现在图片的不同区域
不管在哪里,Pattern
都应该在某一个Neuron
的Receptive Field
区域,所以鸟嘴都会被侦测出来。 => 这些侦测鸟嘴的Neuron
做的事情是一样的,只是守备的范围不一样。
每一个守备范围都去放一个侦测鸟嘴的Neuron
吗?
结果:让不同Receptive Field
的Neuron
共享参数,两个Neuron
的Weight
完全一样
不会让两个守备一模一样范围的Neuron共享参数,因为它们的输出肯定是一样的(输入和参数都一样)
问题:共享参数后只能检测一种Pattern
吗?
解答:多个神经元对同一个Receptive Field
进行侦测,其中一个神经元因为共享了参数所以具备检测鸟嘴的能力
在影像辨识中常见的参数共享方式:怎么共享是自己决定的
共享参数的神经元被叫做filter
(一组weight)
总结 Convolutional Layer的好处
Full Connected Layer弹性最大 => Full Connected的network可以选择看一张图片还是看图片的部分,如果需要看图片的部分只需要将weight
设置成0
不需要看整张图,只需要看图片的一小部分就可侦测出重要的Pattern
=> 这一小部分被称为Receptive Field
=> 弹性会变小
Model的弹性很高时容易导致Overfitting
,Full Connected Layer
弹性很好可以做各式各样的事情但没办法在每个任务表现很好。
CNN存在Larger model bias
(模型的限制变大不灵活或者理解成模型的弹性变小) => CNN专门为影像设计的(Receptive Field+ Parameter Sharing),模型的限制也是为了更好的融合影像特征,所以在影像上效果很好。
Convolutional Layer的版本2:filter角
Convolution
里面有很多Filter
,每个Filter
的大小为33channel
的tensor
。每个Filter
的作用是抓取某个Pattern
- 如果是彩色图片,channel=3(RGB)
- 如果是黑白图片,channel=1(black and white)
问题:Filter怎么在图片中抓取Pattern?
假设Channel=1 => 黑白图
假设Filter里的参数已知 => 实际上Tensor
里面的数值是Model
里面的Parameter
,这里的数值其实是未知的,要通过训练训练集找出。
解
1.先将Filter1(3*3*1)放在图片的左上角
2.将Filter里的九个值跟图片左上角范围内的9个值相乘(9个参数与特征相乘),然后结果累加起来(向量内积)。 => 模型中的 ∑ w x \sum wx ∑wx
3.将Filter1右移Stride
步(如果扫完就先往下移算完继续往右), 重复过程2。
4.图片全部扫完
开始Filter2
,Filter2
侦察中间1列都为1的Pattern,重复上述过程。
每一个Filter都会给出一组数字,比如Filter1给出一组橙色的数字,Filter2给出一组蓝色的数字。这组数字被称为Feature Map
。
第一层的Convolutional Layer => 输入图片,输出Feature Map
我们将一张图片通过一个Convolutional Layer
,产生了一个Feature Map
。假设有64个filters,那么产生的Feature Map
就有64组数字。
可以将生成Feature Map
看成一张新的图片,只是图片的Channel=64(64组数据的叠加?类似RGB图的Channel=3)
第二层的Convolutional Layer => 输入Feature Map
第二层的Convolutional Layer
里面也有一堆Filter,由于我们将第一层生成的Feature Map
看成了一张新的图片,那么第二次的Convolutional Layer
将识别Feature Map
里的Pattern
。
这里的Filter大小也设为3*3*channel(这里3*3是自定义的),channel必须为64(因为新图片的channel=64) => Convolution Layer里filters设置的channel要和输入图片的channel相同
问题:如果filter的大小一直设置为3*3,会不会让Network没有办法看较大范围的Pattern呢?
第二次Convolution layer的filter大小设为33,其实在原图上考虑的是55的范围 => Network叠的越深同样是3*3的filter其实看的原图范围越来越大。
comparison of Two Stories
Convolution
:将filter扫过一张图片这件事被称为Convolution
- 版本1里讲守备不同Receptive Field的
Neuron
会共用参数,这里共用的参数是版本2里的filter
卷积运算中也有Bias ,一般忽视
- 在版本1中,不同的
Neuron
可以share weight
去守备不同的区域,share weight
这件事就是版本2的filter
扫过一张图
守备不同Receptive Field的Neuron可以共享参数来识别不同范围的特定pattern,相当于版本2中同一个filter不断的移动扫过整张图片来识别特定的pattern。 => 版本2中的filter就是共用参数的neuron
总结:Convolutional Layer
- | Neuron Version Story | Filter Version Story |
---|---|---|
观察1:不需要看整张图片 | Neuron只看图片一小部分 => Neuron只守备Receptive Field 区域 | 有一组filter,每个filter只侦测一个小的pattern |
观察2:同样的Pattern可能出现在图片的不同地方 | Neuron间可以共享参数 | 1个filter都要扫过一整张图 |
卷积核就是filter,一个卷积核用来筛选出一种频域特征
Convolutional Layer用于影像辨识的观察3:Pooling
观察:把一张较大的图片做Subsampling
二次抽样,比如将偶数的Column和奇数的row去掉,图片变为原来的
1
4
\frac{1}{4}
41,不会影响图片里的内容
pooling - Max Pooling
pooling本身没有参数,所以它不是一个Layer,它没有要学习的参数。pooling比较像是一个Activation Funciton,类似Sigmoid、ReLU,不需要从训练资料中学习什么,只是一个行为固定的操作。
Pooling有很多版本,这里介绍Max pooling
Max Pooling的运作原理
每个filter都产生一组数字,将这组数字分组(怎么分组自己决定)。比如以下例子就是2*2个数字一组,每一组里面选一个代表。
Max Pooling
方法是选择最大的一个为代表
具体的选择方法是自己定的,有各式各样pooling的方法,比如:mean pooling方法是选平均
Convolutional Layers + Pooling
Convolution
之后往往会搭配Pooling
,Pooling做的事情就是将图片变小。 => channel不变,长宽变小
在实际的操作上,一般Convolution
和Pooling
交替使用,比如几次Convolution
后接一次Pooling
Pooling
目的是减少运算量,但由于较少了图片信息可能会对影响模型性能。 如果运算资源足够,很多 Network 的架构设计往往就不做 Pooling,全Convolution。
The whole CNN => pooling可有可无
将输出(矩阵)Flatten
扁平化成一个向量,再把这个向量作为Full Connected Layer
的输入,可能还会有
softmax
最终得到影响辨识的结果。
CNN最常见的应用之一: Alpha Go
下围棋是一个分类的问题,由Network
去预测下一步落在哪里最好。
Network
的输入是棋牌上黑子、白字的位置,输出是下一步落子的位置。
问题:怎么讲棋盘上黑子、白字的位置表示成一个向量作为Network
的输入?
棋盘有19*19个位置,将棋盘表示为19*19维的向量(拉直后)。黑棋为1、白棋为-1,没有棋为0。
将其输入到网络中后,由网络预测19*19 classes中,选择哪个位置最好。
问题:可以用Full-connected network
解决,但使用CNN的效果最好,为什么?
解:可以将棋盘看成一张19*19的图片,图片上每一个Pixel像素代表棋盘上可以落子的位置。每一个棋盘上的Pixel用48个Channel描述,48个数字来描述那个位置发生了什么。
与影像辨识比较
共同点
问题:为什么CNN可以用在下围棋上
解:围棋和影像有共同的特点
-
不用看全局,只需要看小部分
-
Pattern会出现在棋盘的不同位置出现
不同点:下围棋是个精细的任务,没有使用Pooling
CNN近年来的应用:语音,文字处理NLP
语音和NLP中Receptive Field
的设置与影像识别中是不一样的,需要结合语音和文字的特性设计Receptive Field
To Learn More:CNN的缺陷——空间变换 ⇒data augmentation
CNN没办法处理影像放大、缩小、旋转的问题。 => 在做影像辨识时,往往都需要做Data Augmentation
Data Augmentation
:将训练资料的每一张图片都截一小部分放大,让CNN看过不同大小的Pattern
。将图片旋转,让CNN看物体旋转以后的样子…
network架构spacial transformer Layer
可以处理这个问题
CNN是按像素识别的
pooling的放大缩小是成比例放缩,这里的放大缩小类似剪裁。