引入
假设我们要在某一张图像中找到一个物体,直观地感受来说,当我们在看一张图片的时候,寻找某个人或某样东西,无论它在哪里,我们都只关注目标,常常是扫描整张图片,期望把它找出来。因此,我们可以设计一个“目标检测器”扫描图像,该监测器将图像分割成多个区域,并为每个区域包含目标的可能性打分。
卷积神经网络就是将“空间不变性”这一概念系统化,从而基于这个模型使用较少的参数来学习游泳的表示。
检测器主应该有两个特性——
- 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
- 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,在后续神经网络,整个图像级别上可以集成这些局部特征用于预测。
平移不变性
对于二维输入的全连接,每一个隐藏表示都与所有的输入变量相关,参数w的行数与输出的个数相关,列数则与输入的个数相关(因为每一个输入都要与参数做内积,即对应元素相乘再相加。在我们的线性模型中,假设我们有n个输入x,它作为一个列向量nx1大小,我们期望得到10个输出,那么参数的大小就应该是一个10xn大小的矩阵。每一行参数都与输入列向量对应元素相乘再相加得到一个输出。
现在将输入重新排列为二维矩阵形式,大小为kxl,那么我们每一行的参数也可以变成与它同样大小的形式kxl,然后执行对应元素相乘再相加,因为这样统计起来方便。如果我们要求输出也是二维ixj的,那相当于建立一个ixj大小的参数矩阵,它的每一个元素参数都是一个大小为kxl的矩阵,每个元素参数矩阵与输入矩阵进行对应元素相乘再相加,得到ixj对应位置的输出。这样的全连接层可以被形式化地表示为——
平移不变性,意味着检测对象在输入X中的平移,应该仅仅导致隐藏表示H中的平移,V和U实际上不依赖于(i,j)的值。(假设x的位置发生变化,不应该引起v即权重的变化,才满足平移不变性)。
那么——
就能得到——
这被称为二维交叉相关。
局部性
为了收集用来训练参数 [H]i,j 的相关信息,我们不应偏离到距 (i,j) 很远的地方。这意味着在 |a|>Δ 或 |b|>Δ 的范围之外,我们可以设置 [V]a,b=0。因此,我们可以将 [H]i,j 重写为——
卷积神经网络是包含卷积层的一类特殊的神经网络。 在深度学习研究社区中, V 被称为 卷积核 (convolution kernel) 或者 滤波器 (filter),它仅仅是可学习的一个层的权重。
二维卷积层
输入
X
X
X:
n
h
n_h
nh x
n
w
n_w
nw (高x宽)
核
W
W
W:
k
h
k_h
kh x
k
w
k_w
kw (高x宽)
偏差
b
∈
R
b∈R
b∈R
输出
Y
Y
Y:
(
n
h
−
k
h
+
1
)
(n_h-k_h+1)
(nh−kh+1) x
(
n
w
−
k
w
+
1
)
(n_w-k_w+1)
(nw−kw+1)
Y
=
X
☆
W
+
b
Y = X ☆ W + b
Y=X☆W+b
☆代表二维交叉相关计算,W和b都是可以学习的参数
卷积层就是将输入和核进行交叉相关,加上偏移后得到输出。核矩阵的大小是超参数,决定了它的局部性。
填充
更大的卷积核可以更快地减小输出大小
假设给定32x32大小图像,应用5x5大小的卷积核
到第7层的输出为4x4,无法再应用卷积核
但深度学习神经网络往往需要更深层次的学习,该如何解决这个问题?
填充——在输入周围添加额外的行/列
如图所示,在input的上下左右分别填充0。可以使得输出的大小变大。
填充
p
h
p_h
ph行和
p
w
p_w
pw列,输出形状为
(
n
h
−
k
h
+
p
h
+
1
)
(n_h-k_h+p_h+1)
(nh−kh+ph+1) x
(
n
w
−
k
w
+
p
w
+
1
)
(n_w-k_w+p_w+1)
(nw−kw+pw+1)
通常取
p
h
=
k
h
+
1
p_h=k_h+1
ph=kh+1,
p
w
=
k
w
−
1
p_w=k_w-1
pw=kw−1
当
k
h
k_h
kh为奇数:在上下两侧填充
p
h
/
2
p_h/2
ph/2行
当
k
h
k_h
kh为偶数:在输入顶部填充 ⌈
p
h
/
2
p_h/2
ph/2⌉ 行,在底部填充 ⌊
p
h
/
2
p_h/2
ph/2⌋ 行。同理,我们填充宽度的两侧。
步幅
填充减小的输出大小与层数线性相关
假设给定输入大小224x224,在使用5x5卷积核的情况下,需要44层将输出降低到4x4,需要大量计算才能得到较小输出。
步幅可以使得输出大小与层数指数相关。
如图,取宽度为2高度为3的步幅,原本4x4的输出直接变成2x2。
给定高度
s
h
s_h
sh和宽度
s
w
s_w
sw,输出形状为——
⌊
(
n
h
−
k
h
+
p
h
+
s
h
)
/
s
h
⌊(n_h-k_h+p_h+s_h)/s_h
⌊(nh−kh+ph+sh)/sh x
(
n
w
−
k
w
+
p
w
+
s
w
)
/
s
w
⌋
(n_w-k_w+p_w+s_w)/s_w⌋
(nw−kw+pw+sw)/sw⌋
如果填充
p
h
=
k
h
−
1
,
p
w
=
k
w
−
1
p_h=k_h-1,p_w=k_w-1
ph=kh−1,pw=kw−1
⌊
(
n
h
+
s
h
−
1
)
/
s
h
⌊(n_h+s_h-1)/s_h
⌊(nh+sh−1)/sh x
(
n
w
+
s
w
−
1
)
/
s
w
⌋
(n_w+s_w-1)/s_w⌋
(nw+sw−1)/sw⌋
如果输入高度和宽度可以被步幅整除
(
n
h
/
s
h
)
(n_h/s_h)
(nh/sh) x
(
n
w
/
s
w
)
(n_w/s_w)
(nw/sw)
填充和步幅是卷积层的超参数;
填充在输入周围添加额外的行/列(通常都是0),来控制输出形状的减少量;
步幅是每次滑动核窗口时的行/列的步长,可以成倍的减少输出形状。
多输入多输出通道
多个输入通道
例如一张彩色图片,三个通道才不会丢失信息。多个输入通道的卷积计算如下:
每个通道都有一个卷积核,结果是所有通道卷积结果的和——
输入
X
X
X:
c
i
c_i
ci x
n
h
n_h
nh x
n
w
n_w
nw
核
W
W
W:
c
i
c_i
ci x
k
h
k_h
kh x
k
w
k_w
kw
输出
Y
Y
Y:
m
h
m_h
mh x
m
w
m_w
mw
多个输出通道
无论有多少输入通道,到目前为止只用到单输出通道。我们可以有多个三维卷积核,每个核生成一个输出通道。
作用
每个输出通道可以识别特定模式。(我们设置不同的卷积核来进行不同的操作,就像是不同的模式,通过学习不一样的核的参数,来匹配不同的模式),而输入通道核识别并组合输入中的模式。
1x1卷积层
卷积核的高和宽都为1。它不识别空间模式,只是融合通道。
相当于将每一个通道上的
n
h
n_h
nh x
n
w
n_w
nw输入,拉成一个向量,
n
h
n
w
n_hn_w
nhnw成为这个向量的行数,通道数
c
i
c_i
ci成为列数,变成一个
n
h
n
w
n_hn_w
nhnw x
c
i
c_i
ci的输入,权重为
c
0
c_0
c0 x
c
i
c_i
ci,从卷积层变成一个全连接层。
1x1卷积层的作用
首先需要区分输入通道数与输出通道数,当输入通道数为k,则每一个卷积核通道与输入对应,才能计算。我们控制卷积核的个数,可以得到所需的输出通道数。但1x1卷积核的作用是不改变输入图像的大小,并起到全连接的作用。
假设输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数(一般理解为,卷积核的权值共享只在每个单独通道上有效,至于通道与通道间的对应的卷积核是独立不共享的,所以这里是192x128)
可以对通道数量进行升维降维,且不变更图像大小。全连接的图像理解——
总结二维卷积层
超参数——卷积核矩阵大小、填充、步幅、输出通道数
每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果
每个输出通道有独立的三维卷积核。
池化
卷积层对位置非常敏感。解释——目前我们所说的检测都是基于像素的基础进行的数学运算。实际图像中,我们感兴趣的物体不会总出现在固定像素位置,即使我们用三脚架固定相机去连续拍摄一个物体也极有可能出现像素位置上的偏移,这会导致同一个物体的边缘对应的输出可能出现在卷积输出的不同位置,进而对后面的模式识别造成不便。此外,绝大多数计算机视觉任务对图像处理终极目标是识别图片内的物体,所以不需要细致到对每个像素进行检测,只需要找到图片中物体的大致轮廓就好了。
池化层的目的——降低卷积层对位置的过度敏感性,同时降低对空间降采样表示的敏感性。不同于卷积层中的输入与卷积核之间的互相关计算,池化层不包含参数,它的运算是确定的,通常计算池化窗口所有元素的最大值或平均值。
二维最大池化
返回滑动窗口中的最大值
平均池化层
将最大池化层中的“最大”操作替换成“平均”。
超参数
与卷积层类似,都有填充和步幅、窗口大小
对每个输入通道应用池化层以获得相应的输出通道
输入通道数=输出通道数
它没有可学习的参数