详解ResNeXt网络(二)

1 引言

在前文中, 我们重点研究了ResNext blcok的原始表现形式(下图a),并给出了详细的阐述;
在本文中, 我们将继续研究ResNeXt block块的其他两种表现形式,它们分别利用Concat(下图b)和分组卷积(下图c)来构造对应的block块。
详解ResNeXt网络(二)_第1张图片

不再累述,让我们直接开始吧!

2 Concat形式

前文中,我们看到了ResNeXt分支利用Inception的拆分-变换-合并策略来构造对应的block块:减少通道数(split),运行3 X 3卷积(transform),重新调整宽度,并将每个分支的结果相加(merge)。

我们介绍的block块的Concat形式与其类似,即拆分和变换策略一样,但是合并的方式转化为了Concat形式,两种方式实质是等效的.

举例,以第一部分中的示例为例:32个分支输入为256维张量,它们将其缩小为4个通道。之后,他们继续使用3 X 3卷积变换数据,而不改变宽度。但是现在我们将合并方式转化为将分支的输出通过concat连接在一起,得到128=32*4个通道,并通过1 X 1卷积将通道数加倍。如下所示:

详解ResNeXt网络(二)_第2张图片
直观地说,上述方法从表现形式上来看更接近于Inception中的block块,其中变换(transform)的输出(例如,3 X 3和5 X 5卷积)简单地串联而不修改通道数。

Concat形式和形式a是完全一样的!从参数的数量到Flops,基本都保持一致,Concat形式B只是我们在前一篇文章中看到的block块形式a的另一种描述。

这两种形式的等效对于某些人来说似乎很明显,但是也有些人或许会存疑,那么接下来我们来证明二种形式是等效的.

3 Form A VS Form B

显然,这两种形式在拆分(Split)和转换(Transform)方面是相同的,因此我们将只关注合并(merge)方面。
在此之前,我们应该研究一个更简单的问题:
假设有两个四维向量A和B,其中 A = [ a 1 , a 2 , a 3 , a 4 ] A=[a1, a2, a3, a4] A=[a1,a2,a3,a4] B = [ b 1 , b 2 , b 3 , b 4 ] B=[b1, b2, b3, b4] B=[b1,b2,b3,b4]
我们想通过将A的元素乘以向量X中的值来转换A, X = [ x 1 、 x 2 、 x 3 、 x 4 ] X=[x1、x2、x3、x4] X=[x1x2x3x4]
并对结果求和记做z1,即:
z 1 = a 1 ∗ x 1 + a 2 ∗ x 2 + a 3 ∗ x 3 + a 4 ∗ x 4 z1 = a1*x1+a2*x2+a3*x3+a4*x4 z1=a1x1+a2x2+a3x3+a4x4
同时,B也将做类似的转换,但其权重向量是Y, Y的表示为:
Y = [ y 1 , y 2 , y 3 , y 4 ] Y=[y1,y2,y3,y4] Y=[y1,y2,y3,y4]
将求和结果记做z2,即:
z 2 = b 1 ∗ y 1 + b 2 ∗ y 2 + b 3 ∗ y 3 + b 4 ∗ y 4 z2 = b1*y1+b2*y2+b3*y3+b4*y4 z2=b1y1+b2y2+b3y3+b4y4

最后,将两个操作的结果求和作为最终结果z,即
z = a 1 ∗ x 1 + a 2 ∗ x 2 + a 3 ∗ x 3 + a 4 ∗ x 4 + b 1 ∗ y 1 + b 2 ∗ y 2 + b 3 ∗ y 3 + b 4 ∗ y 4 z = a1*x1+a2*x2+a3*x3+a4*x4+b1*y1+b2*y2+b3*y3+b4*y4 z=a1x1+a2x2+a3x3+a4x4+b1y1+b2y2+b3y3+b4y4

达到上述结果的另一种方法如下:

  • 首先我们将A和B连接起来,得到一个更大的8维向量C,即
    C = [ a 1 , a 2 , a 3 , a 4 , b 1 , b 2 , b 3 , b 4 ] C=[a1,a2,a3,a4,b1,b2,b3,b4] C=[a1,a2,a3,a4,b1,b2,b3,b4]
  • 接着我们将X和Y也可以连接成Z,即
    Z = [ x 1 , x 2 , x 3 , x 4 , y 1 , y 2 , y 3 , y 4 ] Z=[x1,x2,x3,x4,y1,y2,y3,y4] Z=[x1,x2,x3,x4,y1,y2,y3,y4]
  • 最后,我们可以将C和Z的点积记做z,即
    z = a 1 ∗ x 1 + a 2 ∗ x 2 + a 3 ∗ x 3 + a 4 ∗ x 4 + b 1 ∗ y 1 + b 2 ∗ y 2 + b 3 ∗ y 3 + b 4 ∗ y 4 z=a1*x1+a2*x2+a3*x3+a4*x4+b1*y1+b2*y2+b3*y3+b4*y4 z=a1x1+a2x2+a3x3+a4x4+b1y1+b2y2+b3y3+b4y4

请注意,A和B可以被视为空间尺寸为1 X 1、通道为4的两个特征图,X和Y可以被视为具有4个通道数,尺寸为1 X 1的Filter。正如我们所证明的,将XA + YB的效果相当于就像将[A,B]和[X,Y]分别concat后再做对应的卷积运算.

换句话说,当我们对几个任意大小的特征图执行卷积,然后将结果相加等效于先将数据和卷积核分别concat起来,然后执行卷积操作一样。

形式B和形式A的等效还是很容易理解的,接下来我们来分析不太直观的形式C, 分组卷积实现.

4 Grouped Convolutions

在AlexNet中,分组卷积最初被用作在两个GPU上进行训练的工程辅助工具,但ResNeXt表明,如果使用得当,分组卷积可以使模型获得更高的性能。

与前文一样,我们将使用一个示例来研究分组卷积:
假设我们有一个由128个通道组成的特征图,我们希望在不改变宽度的情况下对其进行变换,这可以使用1 X 1卷积来完成。具体地说,对于输入中的128个通道,每个卷积核将接受128个通道作为输入,而对于输出中的128个通道,总共需要128个这样的卷积核(为了简单起见,省略了空间维度)。请注意,卷积核的输入为整个128个通道,而不仅仅是其中的一半或四分之一;换句话说,输入没有被分成多个组,只有一个组。

如果有两组,会发生什么?输入将被分成两个较小的张量,每个张量有64个通道。因此,滤波器也将被分成两组,其中64个将对应于第一组,其余将对应于另一组。因此,每个滤波器将有64个通道,因为它只在一半的输入上工作,也就是滤波器的输入有64个通道。

对于4个组大小,输入将被四分之一,每个部分有32个通道,滤波器也将被分成4组,每组32个滤波器,每个滤波器有32个通道。

简单概括,如果输入通道数为 n i n n_{in} nin , 输出通道数为 n o u t n_{out} nout , 我们分组数目为 g g g, 那么

  • 每个组的输入通道数为 n i n / g n_{in}/g nin/g,这样每个滤波器的通道数也为 n i n / g n_{in}/g nin/g
  • 每个组的输出通道数为 n o u t / g n_{out}/g nout/g,总的输出也就是 n o u t n_{out} nout
  • 每个滤波器仅在 n i n / g n_{in}/g nin/g上工作,不同组之间不进行任何交互.

如下图所示,我们有一个具有8个输入通道、4个输出通道和4个组大小的卷积运算示例。

详解ResNeXt网络(二)_第3张图片
如上图所示,有4个组,每个组中有2个通道,这表示每个过滤器采用2=8/4通道。因为组的数量等于输出通道的数量,所以每个组有一个过滤器,但是如果输出的通道数乘以f,那么过滤器的数量也将同时乘以f。

5 Form C: Grouped Convolutions

最后,我们介绍ResNeXt block块的第三种也是最后一种形式,它是最简洁的。

首先,在形式B中我们将32个3X3输出通道数为4的卷积通过concat操作后将通道数进行合并,这等效于使用一个3X3输出通道为128=4X32,分组数目为32的分组卷积,经过这样的操作后,形式B将被转化为如下右侧形式:

详解ResNeXt网络(二)_第4张图片

很接近了!请注意,在上面的块中,我们先从1 X 1卷积开始,然后conccat将通道数合并,这相当于从连接开始,然后应用1个1 X 1卷积将输入256通道减小到128个通道,如下所示:
详解ResNeXt网络(二)_第5张图片

这是ResNeXt块的第三种也是最后一种形式,也是ResNeXt 原文采用的实现方式。
当然,这个网络可以探讨的点还有要多,我强烈建议大家阅读以下原文具体的细节.

6 结论

在这篇文章中,我们学习了ResNeXt中block的其他两种实现方式,同时我们重点介绍了分组卷积,即一种新的卷积类型,可以将一个张量视为多个单张量,并分别对每个单张量执行卷积操作。

您学废了吗?

关注公众号《AI算法之道》,获取更多AI算法资讯。
在这里插入图片描述

你可能感兴趣的:(深度学习,计算机视觉,opencv,深度学习)