赞
踩
卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。
计算机视觉的神经网络结构:
首先,多层感知机的输入是二维图像 X \mathbf{X} X,其隐藏表示 H \mathbf{H} H 在数学上是一个矩阵,在代码中表示为二维张量。其中 X \mathbf{X} X 和 H \mathbf{H} H 具有相同的形状。为了方便理解,我们可以认为,无论是输入还是隐藏表示都拥有空间结构。
使用
[
X
]
i
,
j
[\mathbf{X}]_{i, j}
[X]i,j 和
[
H
]
i
,
j
[\mathbf{H}]_{i, j}
[H]i,j 分别表示输入图像和隐藏表示中位置(
i
i
i,
j
j
j)处的像素。
为了使每个隐藏神经元都能接收到每个输入像素的信息,我们将参数从权重矩阵(如同我们先前在多层感知机中所做的那样)替换为四阶权重张量
W
\mathsf{W}
W。假设
U
\mathbf{U}
U 包含偏置参数,我们可以将全连接层形式化地表示为
[
H
]
i
,
j
=
[
U
]
i
,
j
+
∑
k
∑
l
[
W
]
i
,
j
,
k
,
l
[
X
]
k
,
l
=
[
U
]
i
,
j
+
∑
a
∑
b
[
V
]
i
,
j
,
a
,
b
[
X
]
i
+
a
,
j
+
b
.
其中,从 W \mathsf{W} W 到 V \mathsf{V} V 的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系。我们只需重新索引下标 ( k , l ) (k, l) (k,l),使 k = i + a k = i+a k=i+a、 l = j + b l = j+b l=j+b, 由此可得 [ V ] i , j , a , b = [ W ] i , j , i + a , j + b [\mathsf{V}]_{i, j, a, b} = [\mathsf{W}]_{i, j, i+a, j+b} [V]i,j,a,b=[W]i,j,i+a,j+b。索引 a a a 和 b b b 通过在正偏移和负偏移之间移动覆盖了整个图像。对于隐藏表示中任意给定位置( i i i, j j j)处的像素值 [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j,可以通过在 x x x 中以 ( i , j ) (i, j) (i,j) 为中心对像素进行加权求和得到,加权使用的权重为 [ V ] i , j , a , b [\mathsf{V}]_{i, j, a, b} [V]i,j,a,b 。
简化 H \mathbf{H} H 定义为:
[ H ] i , j = u + ∑ a ∑ b [ V ] a , b [ X ] i + a , j + b . [\mathbf{H}]_{i, j} = u + \sum_a\sum_b [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}. [H]i,j=u+a∑b∑[V]a,b[X]i+a,j+b.
这就是 卷积 (convolution)。我们是在使用系数
[
V
]
a
,
b
[\mathbf{V}]_{a, b}
[V]a,b 对位置
(
i
,
j
)
(i, j)
(i,j) 附近的像素
(
i
+
a
,
j
+
b
)
(i+a, j+b)
(i+a,j+b) 进行加权得到
[
H
]
i
,
j
[\mathbf{H}]_{i, j}
[H]i,j。
注意,
[
V
]
a
,
b
[\mathbf{V}]_{a, b}
[V]a,b 的系数比
[
V
]
i
,
j
,
a
,
b
[\mathsf{V}]_{i, j, a, b}
[V]i,j,a,b 少很多,因为前者不再依赖于图像中的位置。这就是显著的进步!
现在引用上述的第二个原则:局部性。如上所述,为了收集用来训练参数 [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j 的相关信息,我们不应偏离到距 ( i , j ) (i, j) (i,j) 很远的地方。这意味着在 ∣ a ∣ > Δ |a|> \Delta ∣a∣>Δ 或 ∣ b ∣ > Δ |b| > \Delta ∣b∣>Δ 的范围之外,我们可以设置 [ V ] a , b = 0 [\mathbf{V}]_{a, b} = 0 [V]a,b=0。因此,我们可以将 [ H ] i , j [\mathbf{H}]_{i, j} [H]i,j 重写为
[ H ] i , j = u + ∑ a = − Δ Δ ∑ b = − Δ Δ [ V ] a , b [ X ] i + a , j + b . [\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}. [H]i,j=u+a=−Δ∑Δb=−Δ∑Δ[V]a,b[X]i+a,j+b.
在数学中,两个函数(比如 f , g : R d → R f, g: \mathbb{R}^d \to \mathbb{R} f,g:Rd→R)之间的“卷积”被定义为
( f ∗ g ) ( x ) = ∫ f ( z ) g ( x − z ) d z . (f * g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}. (f∗g)(x)=∫f(z)g(x−z)dz.
也就是说,卷积是测量
f
f
f 和
g
g
g 之间(把其中一个函数“翻转”并移位
x
\mathbf{x}
x 时)的重叠。
当我们有离散对象时,积分就变成求和。例如:对于由索引为
Z
\mathbb{Z}
Z的、平方可和的、无限维向量集合中抽取的向量,我们得到以下定义:
( f ∗ g ) ( i ) = ∑ a f ( a ) g ( i − a ) . (f * g)(i) = \sum_a f(a) g(i-a). (f∗g)(i)=a∑f(a)g(i−a).
对于二维张量,则为 f f f 的索引 ( a , b ) (a, b) (a,b) 和 g g g 的索引 ( i − a , j − b ) (i-a, j-b) (i−a,j−b) 上的对应和:
( f ∗ g ) ( i , j ) = ∑ a ∑ b f ( a , b ) g ( i − a , j − b ) . (f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b). (f∗g)(i,j)=a∑b∑f(a,b)g(i−a,j−b).
图像一般包含三个通道/三种原色(红色、绿色和蓝色)。实际上,图像不是二维张量,而是一个由高度、宽度和颜色组成的三维张量,比如包含
1024
×
1024
×
3
1024 \times 1024 \times 3
1024×1024×3 个像素。前两个轴与像素的空间位置有关,而第三个轴可以看作是每个像素的多维表示。
因此,我们将
X
\mathsf{X}
X 索引为
[
X
]
i
,
j
,
k
[\mathsf{X}]_{i, j, k}
[X]i,j,k 。由此卷积相应地调整为
[
V
]
a
,
b
,
c
[\mathsf{V}]_{a,b,c}
[V]a,b,c ,而不是
[
V
]
a
,
b
[\mathbf{V}]_{a,b}
[V]a,b 。
为了支持输入 X \mathsf{X} X 和隐藏表示 H \mathsf{H} H 中的多个通道,我们可以在 V \mathsf{V} V 中添加第四个坐标,即 [ V ] a , b , c , d [\mathsf{V}]_{a, b, c, d} [V]a,b,c,d 。综上所述,
[ H ] i , j , d = ∑ a = − Δ Δ ∑ b = − Δ Δ ∑ c [ V ] a , b , c , d [ X ] i + a , j + b , c , [\mathsf{H}]_{i,j,d} = \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} \sum_c [\mathsf{V}]_{a, b, c, d} [\mathsf{X}]_{i+a, j+b, c}, [H]i,j,d=a=−Δ∑Δb=−Δ∑Δc∑[V]a,b,c,d[X]i+a,j+b,c,
严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是 互相关运算 (cross-correlation),而不是卷积运算。
在卷积层中,输入张量和核张量通过(互相关运算)产生输出张量。
首先,我们暂时忽略通道(第三维)这一情况,看看如何处理二维图像数据和隐藏表示
输出张量的四个元素由二维互相关运算得到,这个输出高度为 2 2 2 、宽度为 2 2 2 ,如下所示:
0
×
0
+
1
×
1
+
3
×
2
+
4
×
3
=
19
,
1
×
0
+
2
×
1
+
4
×
2
+
5
×
3
=
25
,
3
×
0
+
4
×
1
+
6
×
2
+
7
×
3
=
37
,
4
×
0
+
5
×
1
+
7
×
2
+
8
×
3
=
43.
0\times0+1\times1+3\times2+4\times3=19,\\ 1\times0+2\times1+4\times2+5\times3=25,\\ 3\times0+4\times1+6\times2+7\times3=37,\\ 4\times0+5\times1+7\times2+8\times3=43.
0×0+1×1+3×2+4×3=19,1×0+2×1+4×2+5×3=25,3×0+4×1+6×2+7×3=37,4×0+5×1+7×2+8×3=43.
输出大小等于输入大小
n
h
×
n
w
n_h \times n_w
nh×nw 减去卷积核大小
k
h
×
k
w
k_h \times k_w
kh×kw,即:
( n h − k h + 1 ) × ( n w − k w + 1 ) . (n_h-k_h+1) \times (n_w-k_w+1). (nh−kh+1)×(nw−kw+1).
输出的卷积层有时被称为 特征映射 (Feature Map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。
在CNN中,对于某一层的任意元素
x
x
x ,其 感受野 (Receptive Field)是指在前向传播期间可能影响
x
x
x 计算的所有元素(来自所有先前层)。
为了防止丢失边缘像素,在输入图像的边界填充元素(通常填充元素是 0 0 0 ),这个简单方法即为填充(padding)。
通常,如果我们添加 p h p_h ph 行填充(大约一半在顶部,一半在底部)和 p w p_w pw 列填充(左侧大约一半,右侧一半),则输出形状将为
( n h − k h + p h + 1 ) × ( n w − k w + p w + 1 ) 。 (n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1)。 (nh−kh+ph+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,使输入和输出具有相同的高度和宽度。
每次滑动元素的数量称为 步幅 (stride)。
通常,当垂直步幅为 s h s_h sh 、水平步幅为 s w s_w sw 时,输出形状为
⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ . \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor. ⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋.
如果我们设置了
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,则输出形状将简化为
⌊
(
n
h
+
s
h
−
1
)
/
s
h
⌋
×
⌊
(
n
w
+
s
w
−
1
)
/
s
w
⌋
\lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor
⌊(nh+sh−1)/sh⌋×⌊(nw+sw−1)/sw⌋。
更进一步,如果输入的高度和宽度可以被垂直和水平步幅整除,则输出形状将为
(
n
h
/
s
h
)
×
(
n
w
/
s
w
)
(n_h/s_h) \times (n_w/s_w)
(nh/sh)×(nw/sw)。
一般情况下,步幅或填充是一致的。
例如,每个RGB输入图像具有 3 × h × w 3\times h\times w 3×h×w 的形状。我们将这个大小为 3 3 3 的轴称为 通道(channel) 维度。
演示一个具有两个输入通道的二维互相关运算的示例。阴影部分是第一个输出元素以及用于计算这个输出的输入和核张量元素: ( 1 × 1 + 2 × 2 + 4 × 3 + 5 × 4 ) + ( 0 × 0 + 1 × 1 + 3 × 2 + 4 × 3 ) = 56 (1\times1+2\times2+4\times3+5\times4)+(0\times0+1\times1+3\times2+4\times3)=56 (1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。
简而言之,我们所做的就是对每个通道执行互相关操作,然后将结果相加。
我们可以将 1 × 1 1\times 1 1×1 卷积层看作是在每个像素位置应用的全连接层,以 c i c_i ci 个输入值转换为 c o c_o co 个输出值。因为这仍然是一个卷积层,所以跨像素的权重是一致的。同时, 1 × 1 1\times 1 1×1 卷积层需要的权重维度为 c o × c i c_o\times c_i co×ci ,再额外加上一个偏置。
池化(pooling)层,它具有双重目的:降低卷积层对位置的敏感性,同时降低对空间降采样表示的敏感性。
计算池化窗口中所有元素的最大值或平均值。这些操作分别称为 最大汇聚层 (maximum pooling)和 平均汇聚层 (average pooling)。
![池化窗口形状为 2 × 2 2\times 2 2×2 的最大汇聚层。着色部分是第一个输出元素,以及用于计算这个输出的输入元素: max ( 0 , 1 , 3 , 4 ) = 4 \max(0, 1, 3, 4)=4 max(0,1,3,4)=4.]
这四个元素为每个池化窗口中的最大值:
max ( 0 , 1 , 3 , 4 ) = 4 , max ( 1 , 2 , 4 , 5 ) = 5 , max ( 3 , 4 , 6 , 7 ) = 7 , max ( 4 , 5 , 7 , 8 ) = 8. \max(0, 1, 3, 4)=4,\\ \max(1, 2, 4, 5)=5,\\ \max(3, 4, 6, 7)=7,\\ \max(4, 5, 7, 8)=8.\\ max(0,1,3,4)=4,max(1,2,4,5)=5,max(3,4,6,7)=7,max(4,5,7,8)=8.
平均池化也如此,相加求平均即可。
卷积层代替全连接层的另一个好处是:更简洁的模型所需的参数更少。
总体来看,(LeNet(LeNet-5)由两个部分组成:)
每个卷积块中的基本单元是一个卷积层、一个 sigmoid 激活函数和平均汇聚层。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。