Py学习  »  机器学习算法

深度学习的卷积算法指南[2] 卷积详解

CVer • 5 年前 • 521 次点击  

点击上方“CVer”,选择“置顶公众号”

重磅干货,第一时间送达

导言

本文详细介绍了卷积神经网络(CNN)中的卷积算法,包括 零填充(zero padding)和单位步长(unit-stride)等参数在不同设置下计算推导。


CVer

作者:Vincent Dumoulin & Francesco Visin 

编辑: Amusi 

校稿: Amusi


前戏

上篇整理了深度学习的卷积算法指南[1] 卷积和池化简介,其介绍了《A guide to convolution arithmetic for deep learning》原论文中的第一章 Introduction内容。本文为“深度学习的卷积算法指南[2] 卷积详解”,重点介绍原论文中第二章 Convolution arithmetric 内容。


部分名词翻译

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属于{0,...,s-1} 将产生相同的输出尺寸。请注意,这种情况仅适用于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位置数量。


【论文速递】专题回顾


[1] [计算机视觉论文速递] 2018-06-15 人脸专场

[2] [计算机视觉论文速递] 2018-06-13 图像分割专场

[3] [计算机视觉论文速递] 2018-06-11

推荐文章


[1] GitHub:目标检测最全论文集锦

[2] 重磅 | 吴恩达的机器学习书籍又双叒更新啦!

[3] 重磅:TensorFlow实现YOLOv3(内含福利)

[4] [计算机视觉论文速递] 2018-06-06

[5] 重磅 | TensorFlow学习资料最全集锦

[6] 人工智能 | 中国计算机学会推荐国际学术刊物/会议

[7] 计算机视觉 | 中国计算机学会推荐国际学术刊物/会议

【刷题笔记】专题


[1] 刷题笔记 | 剑指Offer 03 二维数组中的查找


-------我是可爱的分割线-------      

若喜欢Amusi 推送的文章,请扫描下方二维码关注CVer公众号


看完记得点赞哟


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6vZd8Tplwi
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13747
 
521 次点击