《动手学深度学习》之卷积神经网络

从全连接层到卷积

卷积神经网络(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法。

不变性

计算机视觉的神经网络结构:

  1. 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。
  2. 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,在后续神经网络,整个图像级别上可以集成这些局部特征用于预测。

限制多层感知机

首先,多层感知机的输入是二维图像 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 . \begin{aligned} \left[\mathbf{H}\right]_{i, j} &= [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathsf{W}]_{i, j, k, l} [\mathbf{X}]_{k, l}\\ &= [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathsf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}.\end{aligned} [H]i,j=[U]i,j+kl[W]i,j,k,l[X]k,l=[U]i,j+ab[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+ab[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:RdR)之间的“卷积”被定义为

( 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}. (fg)(x)=f(z)g(xz)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). (fg)(i)=af(a)g(ia).

对于二维张量,则为 f f f 的索引 ( a , b ) (a, b) (a,b) g g g 的索引 ( i − a , j − b ) (i-a, j-b) (ia,jb) 上的对应和:

( 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). (fg)(i,j)=abf(a,b)g(ia,jb).

通道

图像一般包含三个通道/三种原色(红色、绿色和蓝色)。实际上,图像不是二维张量,而是一个由高度、宽度和颜色组成的三维张量,比如包含 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). (nhkh+1)×(nwkw+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)。 (nhkh+ph+1)×(nwkw+pw+1)

在许多情况下,我们需要设置 p h = k h − 1 p_h=k_h-1 ph=kh1 p w = k w − 1 p_w=k_w-1 pw=kw1,使输入和输出具有相同的高度和宽度。

步幅

每次滑动元素的数量称为 步幅 (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. (nhkh+ph+sh)/sh×(nwkw+pw+sw)/sw.

如果我们设置了 p h = k h − 1 p_h=k_h-1 ph=kh1 p w = k w − 1 p_w=k_w-1 pw=kw1,则输出形状将简化为 ⌊ ( 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+sh1)/sh×(nw+sw1)/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 卷积层

我们可以将 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

总体来看,(LeNet(LeNet-5)由两个部分组成:)

  • 卷积编码器:由两个卷积层组成;
  • 全连接层密集块:由三个全连接层组成。

每个卷积块中的基本单元是一个卷积层、一个 sigmoid 激活函数和平均汇聚层。

总结

  • 多输入多输出通道可以用来扩展卷积层的模型。
  • 当以每像素为基础应用时, 1 × 1 1\times 1 1×1 卷积层相当于全连接层。
  • 1 × 1 1\times 1 1×1 卷积层通常用于调整网络层的通道数量和控制模型复杂性。
  • 填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。
  • 步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的 1 / n 1/n 1/n n n n 是一个大于 1 1 1 的整数)。
  • 填充和步幅可用于有效地调整数据的维度。
  • 多个输入和输出通道使模型在每个空间位置可以获取图像的多方面特征。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值