关于fcn技术点知识总结(conv和transconv的关系详解)

https://github.com/vdumoulin/conv_arithmetic

老师关于fcn的翻卷积后对浅层crop的计算细节地址https://zhuanlan.zhihu.com/p/367501459

这个链接下有关于各种conv的各种计算细节。以及各种情况下conv与对应deconv的对应关系。根据convolution这个文章的解读。以下是关于我阅读这篇文章中的一些中文细节注释(标红的是个人理解)。

文中开头提到一个conv层的输出形状受到他的输入形状、kernel形状的选择、零填充设置以及步长因素影响。而这些因素之间的关系不是那么容易解决的。与全连接不一样conv的输出大小独立于输入大小。另外conv会有一个pooling阶段这又增加了一层复杂关系相对于全连接来说。最后装置卷积(又叫做小步卷积)在最近受到越来越多的应用。转置卷积已经被不同程度的解释与卷积之间的关系。这篇英文指南有两个方面

  1. 解释了卷积和转置卷积的关系
  2. 直观理解了输入形状、kernel形状、0填充、步长和输出形状在卷积、池化、转置卷积之间的关系

为了保持广泛适用,本指南中显示的结果独立于实现细节,并适用于所有常用的机器学习框架

本章简要回顾了cnn的主要构造块,即离散卷积和池化。

  1. Discrete convolutions 离散卷积(其实就是我们常说的convolutions,但是实际conv的时候是数值离散的而不是连续数据)。神经网络的基本功能:一个向量被接收作为输入并且与一个矩阵相乘的到一个输出(一般在非线性激活之前还会加一个偏置),这一点适用于任何输入。一个声音片段或者图片或者特性的无序集合,不管怎样他们都可以被拉平成一个向量然后进行转换。图像、声音片段和其他同类的数据都有一个本质的结构。更通俗点讲他们具有以下共同点。
    1. 他们被保存为多维数组
    2. 他们有一个维度或多个维度(例如:图像的高度、宽度数轴,声音片段的时间数轴)
    3. 一个数轴叫做通道轴用来访问数据的不同视图(例如,彩色图像的红、绿、蓝通道,或立体声音轨的左、右通道)。

当应用仿射变换时,这些性质不会被利用;实际上,所有的轴都以相同的方式处理,并且没有考虑到拓扑信息。尽管如此,利用数据的隐式结构可能在解决一些任务时非常方便,如计算机视觉和语音识别,在这些情况下,最好保存它。这就是离散卷积发挥作用的地方。

离散卷积是一个线性变换它保持了有序的概念。它是稀疏的(只有几个输入单元构成一个给定的输出单元),并且可以重用参数(相同的权重应用于输入中的多个位置)。这里其实就是所谓cnn的权值共享,与全连接相比大幅度的减少了要学习的参数量。卷积其实就是拿一个固定大小的滑动窗口去扫描特征图提取特征,所以窗口对于特征图的每个位置都是公平的。稀疏的意思个人认为可以理解为写成矩阵形式后的样子。每一行矩阵都有特定几个位置才不是0,那几个位置与拉升后的向量相乘,得到了那几个位置映射后的输出单元。个人认为卷积的过程也可以看成一种数据降或者升维的过程一般转换后特征图变小了我们认为降维了数据特征图变大了我们可以认为升维了)

如下图figure1.1提供了一个案例。图中浅蓝色的网格称为输入特征图。在这里为了简单显示我们先假设只有一个特征图,实际上多个特征图叠加在一起也是很常见的。值的核是阴影区域。

图1.2计算N = 2, i 1 = i 2 = 5, k 1 = k 2 = 3, s 1 = s 2 = 2, p 1 = p 2 = 1的离散卷积的输出值的样例

kernel进行滑动的时候,对kernel窗口权重值以及对应位置特征图上的值进行权重相乘在相加的操作提取出对应窗口这一块的特征数值。我们也可以用不同的kernel窗口去进行提特征(从这里再次可以看出卷积的过程其实就是提取特征的过程,不同的卷积核其实就是从不同的角度去提取不同的特征。而训练的过程其实就是训练出我们需要的提特征的模式,根据不同的学习目的我们需要提取的特征也是不一样的,如何提特征我们进行训练就能够达到。另外注意一点一个kernel在特征图的不同维度他要学习的也是不一样的,理解了我前面说讲的那么一切就说的通了,那就是针对特征图的不同维度我们的kernel也是自动根据任务用不同的权重去提取不同层的特征层,然后将提取到的特征进行相加,也可以先不相加这一点在mobilenet的时候有所体现。所以可以kernel的大小是1*kernel宽*kernel高*特征图的通道数量。然后多个kernel其实就是多个提取特征的角度)下图1.3是可以使用不同的内核重复这个过程,以形成所需的任意多个输出特征映射。整个过程最后的输出我们可以称之为输出特征图。

图1.1中描述的卷积是一个二维卷积的实例,但它可以推广到N-D卷积。例如,在一个3-D卷积中,内核将是一个长方体,并将在输入特征图的高度、宽度和深度上滑动。

就比如1.2图展示了将一个3*3的卷积核以2*2的滑动步长在5*5的特征图上进行滑动,另外原来5*5的特征图上补了一圈0.

跨步操作构成了一种采样形式(stride>=2).除了将strides解释为内核被转换的程度之外,还可以将strides看作是保留了多少输出.例如,按两跳移动内核相当于按一跳移动内核,但只保留奇数输出元素(这个理解的意思其实是:stride等于2的时候是滑动窗口滑动的时候每次偏移2个格子,也可以看成是先按照一个格子一个格子滑动最后提取的时候只提取奇数位置上的信息如下图展示)

  1. 池化。除了离散卷积,池化操作也是cnn工作模块的重要组成部分。Pooling操作通过使用一些函数来总结子区域,例如取平均值或最大值来减小feature map的大小。(我觉得pooling有一个很大的作用是减少了运算量。这也是一般进行语义分割的时候我们要先把特征图缩小,然后在上采样回去的重要原因。我们为啥不一直保持固定的特征图大小呢,那样岂不是更直观提取的分割的更精确,运算量大呀。不过我认为还有一个重要原因pooling能够让我们的感受野直接变大,下一层特征提取的时候直接视野变得更大了有利于语义层的学习。
  2. 池化的工作原理和conv很像也是在特征图上滑动一个窗口,并将窗口中的内容提供给池函数。从某种意义上说,池化的工作原理很像离散卷积,但是用其他函数代替了核函数描述的线性组合。图1.5提供了一个平均池化的案例,图1.6同样提供了最大池化的例子

接下来介绍以下卷积的计算细节

卷积层之间关系是比较容易的,因为不同的数轴之间不会互相影响。输出特征层的宽度或者长度只受到对应方向上的padding和步长影响(特征层的高度方向的大小不会被宽度上的填充或者步长影响)。所以我们可以以以下简单的方式来分析

  1. 2d的离散卷积
  2. square的输入层
  3. square的kernel
  4. 数轴方向上一样大小的步长
  5. 数轴方向上一样的0填充

以上设置有助于分析和可视化,同时他们的推算结果也适用于n维的和非square的情况

  1. 我们来看以下不填充,步长为1的情况。卷积核在输入的每个位置上滑动。比如在宽度数轴上,我们认为滑动窗口从输入特征层次上进行滑动。输出的尺寸会等于滑动的步数+1.公式可以写成o=(i-k)+1
  2. 0填充,步长为1的情况。我们可以认为padding操作影响了input的尺寸,将原来的尺寸加了padding*2.通过上面的公式可以得到。o=(i-k)+2*p+1。事实上0填充经常被用到。
  3. 半padding。就是通过padding的方式让输出的尺寸大小等于输入的padding大小。对于任意input和kernel。k要求是一个奇数。我们让padding的尺寸等于k/2,注意这里是奇数padding尺寸向下取整通过下面计算过程带入得到:o=i+2(k/2)-(k)+1=i
  4. 全padding。虽然对内核进行卷积通常会减少相对于输入大小的输出大小,但有时需要相反的结果。这有时被称为完全填充,因为在这个设置中,每个可能的内核在输入特征映射上的部分或完全重叠都被考虑在内
  5. 不填充,步长大于1的情况。区别与以上不同与以上的分析方式我们需要更进一步。为了简单点分析,我们先考虑没有padding的情况:
    1. 同样,输出大小可以根据内核在输入上可能放置的数量来定义。让我们考虑一下宽度轴:内核像往常一样从输入的最左边开始,但这一次它按大小s的步长滑动,直到接触到输入的右侧。输出的大小同样等于所做的步骤数,加上1,考虑到内核的初始位置。我们可以得到以下公式推断(当s不能被整除的时候我们向下取整,kernel无法滑动到input的最右侧边,部分的信息会被丢失掉):
    2. 0填充和多步长。这种在实际应用中比较多。输出的公式可以写成以下(与前面一样,floor函数意味着在某些情况下,一个卷积将为多个输入大小产生相同的输出大小。也就是这种情况下就算输入层大小不一样但是他们的输出的大小尺寸是一样的。虽然这不会影响卷积的分析,但这将使转置卷积的分析复杂化。我对于这里的理解是这里有一个多对1的情况,卷积能够将多个不同尺寸对应到一个尺寸,转置卷积是卷积的一个相当于取反操作就是一个1对多的操作,所以这里会导致反置卷积增加了复杂程度):

池化计算。在神经网络中,池化层为输入的小转换提供了不变性。最常见的是最大池化,他是将特征层分割成一小块一小块。然后取这些小块上的最大值。(一般情况下 这些小块是不重叠的。)还有其他种类的池化平均池化,例如,平均池化或平均池化,它们都有一个共同的想法,即通过对一些补丁的内容应用非线性来局部聚合输入。

一些读者可能已经注意到,卷积算法的处理仅仅依赖于假设某些函数被重复应用到输入的子集上。这就导致上面卷积推算出来的过程也可以被利用到pooling计算上。只不过pooling层没有padding操作罢了。所以满足以下公式:

转置卷积的计算方法。转置卷积的需求通常来自于希望使用与普通卷积相反方向的变换,比如,从具有某个卷积输出形状的物体到具有其输入形状的物体同时保持与该卷积兼容的连通性模式。例如,可以使用这种转换作为卷积自动编码器的解码层或将特征映射投射到高维空间

同样,卷积的情况要比完全连通的情况复杂得多,完全连通的情况只需要使用一个变换了形状的权重矩阵。然而,由于每个卷积都归结为矩阵运算的有效实现,因此从完全连通情况中获得的见解对解决卷积情况很有用。就像卷积运算一样,转置卷积运算的论文由于转置卷积性质不跨轴相互作用而得到简化。我们假定是以下那种情况设定

  1. 2d的转置卷积
  2. square的输入
  3. square的kernel
  4. 在不同数据数轴上相同的步长
  5. 相同的补0在数据数轴上。

这个结果可以被使用到其他情况的转置卷积。

如果输入和输出可以向右向下次序展开成为一个vector,卷积可以写成一个举证C,如下图

将这个矩阵和展开的输入vector进行相乘操作会得到另外一个vector。然后把输出的vector进行reshape操作。如上图矩阵是和一个16维的向量相乘得到1个4维的向量。在把四维的向量reshape成为2*2的.通过这种矩阵的方式只要将loss和C的转置相乘就得到我们想要的误差反向传播(这个优点厉害了,很容易手推出来或者用雅克比矩阵进行证明),该操作以一个4维向量作为输入,产生一个16维向量作为输出,其连通性模式通过构造与C兼容。值得注意的是,内核w同时定义了用于向前和向后传递的矩阵C和C T。

转置卷积又可以称为小步卷积或者反卷积。通过转换向前或者向后来工作的。一种说法是,核定义了一个卷积,但它是直接卷积还是转置卷积取决于前向和后向传递是如何计算的。

例如,虽然核w定义了一个卷积,它的前向和后向传递分别通过与C和C T相乘来计算,但它也定义了一个转置卷积,它的前向和后向传递分别通过与C T和(C T) T = C相乘来计算。

所以我们可以直接用一个卷积来表达出一个反置卷积。他的缺陷是我们通常需要各种补0,增加了编码的复杂程度。在前面介绍的基础上,这一章将从卷积算法这一章向后推进,通过引用与它共享核的直接卷积来推导每个转置卷积的性质,并定义等价的直接卷积。

  1. 不填充、单步长、转置。考虑一个给定输入上的转置卷积的最简单方法是把这个输入想象成一个直接卷积应用于某个初始特征映射上的结果。然后转置卷积就是把它转换回原来输入的形状大小的一种常规卷积。我们来考虑一个3*3的卷积在一个4*4的特征层上以单步长进行滑动,没有补0的情况下得到2*2的输出特征大小。那么它的转置应该是输入一个2*2的得到回一个4*4的特征层结果。另一种获得转置卷积结果的方法是应用等效的——但效率低得多——直接卷积。到目前为止所描述的例子可以通过卷积处理一个3×3内核在一个2×2的输入填充一个2×2 0边境使用单位的进步(例如,0 = 2 k 0 = k, p和s 0 = 1 0 = 2),如图4.1所示。值得注意的是,内核的大小和步幅的大小保持不变,但是转置卷积的输入现在是零填充。理解零填充背后的逻辑的一种方法是考虑转置卷积的连通性模式,并使用它来指导等效卷积的设计。比如原特征图左上角的点只联通了结果左上角的点,右下角的点只联通了右下角的点。为了在等效卷积中保持相同的连接模式,必须对输入进行零填充,这样内核的第一个(左上角)应用程序只接触左上角的像素,也就是说,填充必须等于内核的大小减1。(这里我解释以下,就是说原来的卷积输入左上角的点只映射到输出左上角的点,而输出左上角的点能够对应这里9个输入的点。那么他的反向操作也应该是第一次滑动窗口的时候,左上角的点只链接到输出左上角的点。如过这里不填充0的化是9个点都链接到原来那个点,那么之前的链接关系就不成立了,所以要填充k-1个0)以同样的方式进行,也可以对图像的其他元素进行类似的观察,从而产生以下关系(这里其实就是把之前转置卷积的i和o反以下就能推算出来的公式
  2. 有padding、单步长、转置。我们知道一个未填充的卷积的转置等价于对一个填充了零的输入进行卷积,我们可以合理地假设一个填充了零的卷积的转置等价于对一个填充了较少零的输入进行卷积。
  3. 半填充(尺度不变填充)、单步长、转置。如果半填充的卷积的输出大小与其输入大小相同,那么应用与前面相同的归纳推理,可以合理地认为半填充的卷积的转置的等价卷积本身就是半填充的卷积。因此,以下关系适用:
  4. 全填充、转置。我们知道一个非填充的卷积的转置的等价卷积涉及到完全填充,因此完全填充的卷积的转置的等价是一个非填充的卷积就不足为奇了
  5. 0填充多步长转置。使用与零填充卷积相同的归纳逻辑,可以认为一个与s > 1的卷积的转置涉及到一个与s < 1等价的卷积。正如我们将要解释的,这是一个有效的直觉,这就是为什么转置卷积有时被称为部分跨距卷积(我觉的叫小步长卷积更合适,填充了k-1个0来达到)。图4.5举了一个输入5,kernel3,步长2的例子。我们理解可以通过在特征图之间填充0的方式来。这让k在移动的时候以一个比1还慢的速度进行。现在我们假设卷积是0填充,输入的尺寸i减去核的尺寸k能够被步长整除,这种情况下以下关系成立
  6. 有0填充,非1步长,转置。这个是前面两种情况的结合。i+2p-k能够被s整除。那么可以表达如下
  7. 对输入i大小的约束可以通过引入另一个参数a∈{0,…,s−1},允许区分所有导致相同I 0的s不同情况:另一个参数a∈{0,…,s - 1}不同的情况,都导致相同的I之前卷积多个输入能够导致一个结果。

还有一种卷积叫膨胀卷积。接下来等几天在介绍

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值