「训练阶段」:因为3 x 3卷积是大多数网络的基础组件,因此ACNet的实验都是针对3 x 3卷积进行的。训练阶段就是将现有网络中的每一个3 x 3卷积换成3 x 1卷积+1 x 3卷积+3 x 3卷积共三个卷积层,最终将这三个卷积层的计算结果进行融合获得卷积层的输出。因为这个过程中引入的1 x 3卷积和3 x 1卷积是非对称的,所以将其命名为Asymmetric Convolution。
为什么ACNet这个看起来十分简单的操作能为各种网络带来涨点?论文中提到,ACNet有一个特点是「它提升了模型对图像翻转和旋转的鲁棒性」,例如训练好后的1 x 3卷积和在图像翻转后仍然能提取正确的特征(如Figure4左图所示,2个红色矩形框就是图像翻转前后的特征提取操作,在输入图像的相同位置处提取出来的特征还是一样的)。那么假设训练阶段只用3 x 3卷积核,当图像上下翻转之后,如Figure4右图所示,提取出来的特征显然是不一样的。
因此,引入1 x 3这样的水平卷积核可以提升模型对图像上下翻转的鲁棒性,竖直方向的卷积核同理。
下面的Table4则继续从实验角度解释了这种鲁棒性:
推理阶段的卷积核融合
推理阶段的融合操作如Figure3所示,在论文中提到具体的融合操作是和BN层一起的,然后融合操作时发生在BN之后的。但是其实也可以把融合操作放在BN层之前,也就是三个卷积层计算完之后就开始融合。论文对这两种融合方式进行了实验,在上面的Table4中BN in branch这一列有√的话表示融合是在BN之后,可以看到这种方式使得效果确实会更好一些。
Pytorch代码实现
我们来看一下作者的ACNet基础结构Pytorch实现,即将原始的3 x 3卷积变成:3 x 3 + 3 x 1 + 1 x 3:
# E.g., (-1, 0) means this layer should crop the first and last rows of the feature map. And (0, -1) crops the first and last columns def__init__(self, crop_set): super(CropLayer, self).__init__() self.rows_to_crop = - crop_set[0] self.cols_to_crop = - crop_set[1] assert self.rows_to_crop >= 0 assert self.cols_to_crop >= 0
从实验结果中可以看到,在推理阶段即使融合操作放在BN层之前,相比原始网络仍有一定提升(AlexNet的56.18% vs 55.92%,ResNet-18的70.82% vs 70.36%),作者没有讲解这部分的原理,某位大佬提出的观点,如下:
这部分的原因个人理解是来自梯度差异化,原来只有一个3 x 3卷积层,梯度可以看出一份,而添加了1 x 3和3 x 1卷积层后,部分位置的梯度变为2份和3份,也是更加细化了。而且理论上可以融合无数个卷积层不断逼近现有网络的效果极限,融合方式不限于相加(训练和推理阶段一致即可),融合的卷积层也不限于1 x 3或3 x 1尺寸。