1 引言
在前文中, 我们重点研究了ResNext blcok的原始表现形式(下图a),并给出了详细的阐述;
在本文中, 我们将继续研究ResNeXt block块的其他两种表现形式,它们分别利用Concat(下图b)和分组卷积(下图c)来构造对应的block块。
不再累述,让我们直接开始吧!
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卷积将通道数加倍。如下所示:
直观地说,上述方法从表现形式上来看更接近于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=[x1、x2、x3、x4]
并对结果求和记做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=a1∗x1+a2∗x2+a3∗x3+a4∗x4
同时,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=b1∗y1+b2∗y2+b3∗y3+b4∗y4
最后,将两个操作的结果求和作为最终结果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=a1∗x1+a2∗x2+a3∗x3+a4∗x4+b1∗y1+b2∗y2+b3∗y3+b4∗y4
达到上述结果的另一种方法如下:
- 首先我们将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=a1∗x1+a2∗x2+a3∗x3+a4∗x4+b1∗y1+b2∗y2+b3∗y3+b4∗y4
请注意,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个组大小的卷积运算示例。
如上图所示,有4个组,每个组中有2个通道,这表示每个过滤器采用2=8/4通道。因为组的数量等于输出通道的数量,所以每个组有一个过滤器,但是如果输出的通道数乘以f,那么过滤器的数量也将同时乘以f。
5 Form C: Grouped Convolutions
最后,我们介绍ResNeXt block块的第三种也是最后一种形式,它是最简洁的。
首先,在形式B中我们将32个3X3输出通道数为4的卷积通过concat操作后将通道数进行合并,这等效于使用一个3X3输出通道为128=4X32,分组数目为32的分组卷积,经过这样的操作后,形式B将被转化为如下右侧形式:
很接近了!请注意,在上面的块中,我们先从1 X 1卷积开始,然后conccat将通道数合并,这相当于从连接开始,然后应用1个1 X 1卷积将输入256通道减小到128个通道,如下所示:
这是ResNeXt块的第三种也是最后一种形式,也是ResNeXt 原文采用的实现方式。
当然,这个网络可以探讨的点还有要多,我强烈建议大家阅读以下原文具体的细节.
6 结论
在这篇文章中,我们学习了ResNeXt中block的其他两种实现方式,同时我们重点介绍了分组卷积,即一种新的卷积类型,可以将一个张量视为多个单张量,并分别对每个单张量执行卷积操作。
您学废了吗?
关注公众号《AI算法之道》,获取更多AI算法资讯。