重磅干货,第一时间送达
导言
上文深度学习的卷积算法指南[1] 卷积和池化简介,简单介绍了深度学习中卷积和池化的内容。本文将详细介绍了卷积神经网络(CNN)中的卷积算法,包括 零填充(zero padding)和单位步长(unit-stride)等参数在不同设置下计算推导。
作者:Vincent Dumoulin&Francesco Visin
编辑: Amusi
校稿: Amusi
部分名词翻译
discrete convolution:离散卷积
kernel:核
pooling:池化
padding:填充
zero-padding:以零填充
stride:步长
feature map:特征图
input feature map:输入特征图
output feature map:输出特征图
subsampling:子采样
translated:平移
average pooling:平均池化
max pooling:最大池化
unit-stride:单位步长
non-unit stride:非单位步长
2 Convolution arithmetric
The analysis of the relationship between convolutional layer properties is eased by the fact that they don’t interact across axes, i.e., the choice of kernel size, stride and zero padding along axis j only affects the output size of axis j.本章将重点介绍以下简化的设置:
二维(2-D)离散卷积(N=2)
方形(square)输入(i1=i2=i)
方形卷积核(k1=k2=k)
沿着每条轴相同的步长(s1=s2=s)
沿着每条轴相同的zero padding(p1=p2=p)
这有助于分析和可视化(visualization),但请记住,这里概述的结果也推广到N-D和非方形的情况。
注:上述默认采用方形(square),一方面便于计算,一方面是在大量实验验证下得到的结论。
2.1 No zero padding,unit strides
分析最简单的情况是 kernel 在输入上的每个位置滑动(即s = 1和p = 0)。图2.1 提供了一个i = 4和k = 3的例子。
在这种情况下定义输出大小的一种方法是通过 kernel 在输入上可能的位置(placement)数量。(即有多少种位置,输出特征图就有多少个输出元素)。让我们考虑宽度轴(width axis):kernel 从输入特征图的最左侧开始,并以步长1滑动,直到它触及输入的最右侧。 输出的大小等于所执行的步数,再加上1,因为要算上kernel 的初始位置(图2.8a)。同样的逻辑适用于高度轴(height axis)。
更规范地说,可以推断出以下关系:
关系1:对于任意 i 和 k,s = 1 且 p = 0时,有 o = (i - k) + 1
图2.1:(无填充,单位步长)利用单位步长在4×4的输入上使用包含 3×3 的卷积核(convolutional kernel)(即i = 4,k = 3,s = 1和p = 0)。
2.2 Zero padding,unit strides
为了考虑零填充(即仅限于s = 1),让我们考虑它对有效输入大小的影响:用 p个zero padding将有效输入大小从 i 改变为 i + 2p。在一般情况下,可以使用关系1来推断以下关系:
关系2:对于任意 i,k,p和 s = 1时,o = (i - k) + 2p + 1
图2.2 介绍了 i = 5,k = 4,p = 2的示例。
实际上,由于它们各自的属性,两个具体的zero padding被广泛使用。下面让我们更加详细地讨论它们。
图2.2:(Arbitrary padding,unit strides)利用单位步长在包含 2×2 零边界的5×5的输入上使用4×4的卷积核(即i = 5,k = 4,s = 1和p = 2)。
2.2.1 Half(same)padding
使输出大小与输入大小相同(即,o = i)是理想的属性:
关系3:对于任意 i 和 奇数k(k=2n+1,n属于N),s = 1,p = [k/2] = n([]表示向下取整), o = i+p[k/2] - (k-1) = i+2n-2n = i。
这有时被称为一半half(或相同)的填充。图2.3提供了一个i = 5,k = 3和(因此)p = 1的例子。
图2.3:(Half padding,unit strides)利用半填充和单位步长在 5×5的输入上使用3×3的卷积核(即i = 5,k = 3,s = 1和p = 1)。
2.2.2 Full padding
虽然卷积kernel 通常会减小输出大小(相比于输入大小),但有时需要相反。这可以通过适当的 zero paddings 来实现:
关系4:对于任意i 和k,p = k-1和 s = 1,o = i+2p -k + 1 = i+2(k-1) - (k-1) = i + (k-1)。
这有时被称为全填充(full padding),因为在此设置中,每个可能的部分或完整的kernel在输入特征图上的叠加(superimposition)都被考虑在内。图2.4 为i = 5,k = 3和(因此)p = 2提供了一个示例。
图2.4:(Full padding,unit strides)利用全填充和单位步长在 5×5的输入上使用3×3的卷积核(即i = 5,k = 3,s = 1和p = 2)。
2.3 No zero padding,non-unit strides
到目前为止,推导的(derived)所有关系仅适用于单位步长(unit-strided)卷积。在考虑非单位步长(non unitary strides)时中需要另一个推导过程。为了便于分析,我们暂时忽略 zero padding(即s > 1和p = 0)。图2.5 提供了一个 i = 5,k = 3和s = 2的例子。
同样的,输出大小可以根据kernel 在输入上可能的位置数量来定义。让我们考虑宽度轴:kernel在输入的最左边部分像往常一样开始,但是这次它按步长s滑动,直到它接触输入的最右侧。输出的大小再次等于所执行的步数,再加上1,因为还要包括 kernel的初始位置(图2.8b)。同样的逻辑适用于高度轴。
由此可推断出以下关系:
关系5:对于任意i,k,s和 p=0,o = [(i - k) / s] + 1([]表示向下取整)
Floor 函数(其功能是向下取整)说明了这样一个事实,即有时最后一个可能的步骤(step)与 kernel 到达输入末尾不一致,即某些输入单位被省略(参见图2.7中这种情况的一个例子)。
图2.5:(No zero padding,arbitrary strides)利用2x2 步长在 5×5的输入上使用3×3的卷积核(即i = 5,k = 3,s = 2和p = 0)。
2.4 Zero padding,non-unit strides
最常见的情况(使用非单位步长(non-unit strides)对零填充(zerp padded)输入进行卷积)可以通过将关系5应用于大小为i + 2p的有效输入来推导出,类似于关系2所做的:
关系6(最通用的关系):对于任意 i,k,p和s,o = [(i +2p - k) / s] + 1。
如前所述,floor 函数意味着在某些情况下,卷积将为多个输入尺寸生成相同的输出尺寸。更具体地说,如果i + 2p-k是 s的倍数,那么任何输入大小 j = i + a,a属于 将产生相同的输出尺寸。请注意,这种情况仅适用于s > 1。
图2.6 显示了一个i = 5,k = 3,s = 2和p = 1的示例,而图2.7提供了i = 6,k = 3,s = 2和p = 1的示例。有趣的是, 尽管具有不同的输入大小,但这些卷积共享相同的输出大小。虽然这不影响对卷积(convolution)的分析,但这会使反/转置卷积(transposed convolutions)的分析复杂化。
图2.6:(Arbitrary padding 和 strides)利用2x2 步长在具有1x1 padding的5×5的输入上使用3×3的卷积核(即i = 5,k = 3,s = 2和p = 1)。
图2.7:(Arbitrary padding 和 strides)利用2x2 步长在具有1x1 padding的6×6的输入上使用3×3的卷积核(即i = 6,k = 3,s = 2和p = 1)。在这种情况下,由零填充输入的底行(bottom row)和右列(right column)不被 kernel覆盖。
(a)步长(stride)为1的情况:kernel 必须向右滑动 2步才能到达输入的最右侧(等效向下)。还要加1,因为有初始位置,所以输出尺寸为(2+1)x(2+1),即3×3。
(b)步长(stride)为2的情况:kernel 必须向右滑动 1步才能到达输入的最右侧(等效向下)。还要加1,因为有初始位置,所以输出尺寸为(1+1)x(1+1),即2×2。
图2.8:计算 kernel位置数量。
领取专属 10元无门槛券
私享最新 技术干货