ACNet——涨点且不增加耗时的技巧

2023-05-16

论文:ACNet: Strengthening the Kernel Skeletons for Powerful CNN via Asymmetric
Convolution Blocks
论文链接:https://arxiv.org/abs/1908.03930
代码链接:https://github.com/DingXiaoH/ACNet

图像分类领域,从VGG到DenseNet那几年是比较活跃的,最近两年这个领域的论文越来越少见了,要做出有影响力的工作也越来越难。而这两年这个领域的主要方向集中在:1、网络结构搜索,比如EfficientNet算目前效果比较好的代表作。2、更好的特征表达,这部分跟第一部分并不是完全独立的,主要是把特征复用、特征细化做得更加极致,代表作有HRNet、Res2Net等。

当然,以上这些不是这篇博客要讲的内容,这篇博客要介绍的是ICCV2019上的一篇论文:ACNet,全称是Asymmetric Convolution Net,翻译过来就是非对称卷积网络。这篇论文也是从更好的特征表达角度切入实现效果提升,不过更重要的是:没有带来额外的超参数,而且在推理(或者叫验证、部署,本质上都是只执行前向计算)阶段没有增加计算量,在我看来后者更有吸引力

在开始介绍ACNet之前,先来看一个关于卷积计算的式子,式子中I表示一个二维矩阵,可以看做是卷积层的输入,也就是输入特征图,K(1)和K(2)分别表示2个二维卷积核,这2个卷积核的宽和高是一样的,那么下面这个式子的意思就是:先进行K(1)和I卷积,K(2)和I卷积后再对结果进行相加,与先进行K(1)和K(2)的逐点相加后再和I进行卷积得到的结果是一致的。这是ACNet能够在推理阶段不增加任何计算量的原因
在这里插入图片描述

接下来直接通过Figure1来看ACNet的思想。整体上ACNet的思想分为训练和推理阶段,训练阶段重点在于强化特征提取,实现效果提升;推理阶段重点在于卷积核融合,实现0计算量增加

训练阶段:因为3 × \times × 3尺寸的卷积核是目前大部分网络的标配,所以这篇论文的实验都是针对3 × \times × 3尺寸进行的。训练阶段简单来说就是将现有网络(假设用Net_origin表示,比如ResNet)中每一个3 × \times × 3卷积层替换成3 × \times × 3+1 × \times × 3+3 × \times × 1共3个卷积层,如Figure1左图所示,最后将这3个卷积层的计算结果进行融合得到卷积层输出。因为引入的1 × \times × 3和3 × \times × 1卷积核尺寸是非对称的,所以取名Asymmetric Convolution。

推理阶段:这部分主要就是做3个卷积核的融合。依据就是前面我们介绍的公式:先分别对输入进行卷积后融合结果,与先融合卷积核再对输入进行卷积,结果是一样的。这部分在实现上是用融合后的卷积核参数初始化现有网络:Net_origin,因此在推理阶段,网络结构和原始网络是一模一样的(没有1 × \times × 3和3 × \times × 1卷积层了),只不过网络参数采用特征提取能力更强的参数(融合后的卷积核参数),因此在推理阶段不会增加计算量
在这里插入图片描述

到此其实ACNet的内容就基本介绍完了,总结下来就是训练阶段强化特征提取能力,推理阶段融合卷积核达到不增加计算量的目的,虽然训练时间会增加一些,但推理阶段不费一兵一卒就能提升效果,方便且适用于现有的分类网络,何乐而不为。

当然,我觉得这篇论文的精彩之处不仅仅是以上这些思想,论文中关于训练阶段将1个3 × \times × 3卷积层替换成3 × \times × 3、1 × \times × 3和3 × \times × 1这3个卷积层的组合可以提升效果的讨论依然言之有理。
在公开数据集上其实ACNet并没有非常明显的效果提升,比如Table3,对于常用的ResNet和DenseNet而言,提升不到1个百分点,只不过至少是白赚的:
在这里插入图片描述

但正如论文中所述,ACNet有一个特点在于提升了模型对图像翻转和旋转的鲁棒性
Figure4从理论上解释这种鲁棒性,当在训练阶段引入1 × \times × 3卷积核时,即便在验证阶段将输入图像进行上下翻转,这个训练好的1 × \times × 3卷积核仍然能够提取正确的特征(如Figure4左图所示,2个红色矩形框就是图像翻转前后的特征提取操作,在输入图像的相同位置处提取出来的特征还是一样的)。
假如训练阶段只有3 × \times × 3卷积核,那么当图像上下翻转后,(如Figure4右图所示,2个红色矩形框就是图像翻转前后的特征提取操作,在输入图像的相同位置处提取出来的特征是不一样的)。
因此,引入类似1 × \times × 3这样的水平卷积核可以提升模型对图像上下翻转的鲁棒性,竖直方向卷积核同理
在这里插入图片描述

Table4从实验上解释这种鲁棒性。需要注意的是rotate 180°和左右翻转是不一样的,rotate 180°实际上是上下翻转+左右翻转,所以个人认为Table4中加上上下翻转的实验会更完整一些。
在这里插入图片描述

有一个点比较有意思,在论文中提到具体的融合操作是和BN层一起的,如Figure3所示,注意融合操作是在BN之后。但假其实也可以把融合操作放在BN之前,也就是3个卷积层计算完之后就进行融合。论文中关于这二者的实验可以参考Table4,在Table4中BN in branch这一列有√的话表示融合是在BN之后,可以看到效果上确实是在BN之后融合要更好一些(AlexNet的56.18% vs 57.44%,ResNet-18的70.82% vs 71.14%)。
不过论文中没有看到这部分的原理讨论,个人理解这部分效果的差异是因为增加了不同尺寸卷积核的权重导致的,统一的BN层没有更细化的针对每个特征图的BN来得极致

另外即便融合操作放在BN层之前,相比原始网络仍有一定提升(AlexNet的56.18% vs 55.92%,ResNet-18的70.82% vs 70.36%%),这部分的原因个人理解是来自梯度差异化,原来只有一个3 × \times × 3卷积层,梯度可以看出一份,而添加了1 × \times × 3和3 × \times × 1卷积层后,部分位置的梯度变为2份和3份,也是更加细化了。而且理论上可以融合无数个卷积层不断逼近现有网络的效果极限,融合方式不限于相加(训练和推理阶段一致即可),融合的卷积层也不限于1 × \times × 3或3 × \times × 1尺寸。
在这里插入图片描述

整体上ACNet的创新点还是很棒的,相信对很多领域都会有启发意义,期待后面更多意思的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ACNet——涨点且不增加耗时的技巧 的相关文章

  • linux 最简单的模块的编写和运行

    第一次动手编写一个内核模块 xff0c 但是查找了许多资料没有一个可以完美通过编译的 xff0c 郁闷 xff0c 最后还是解决了 xff0c 分享出来 首先是hello c include lt linux kernel h gt Nee
  • 截获或替换linux系统调用

    直接上代码吧 xff1a hello c include lt linux kernel h gt Needed by all modules include lt linux module h gt Needed for KERN inc
  • oracle临时表实际应用

    xff08 这段是后面添加的 xff1a 临时表 xff0c 在实际应用中 xff0c 其实和nologging的固定表 xff0c 是差不多的 xff0c 都是中间表 xff0c 所以这里为什么添加这段话 xff0c 是让自己记得 xff
  • linux sys_call_table 初始化

    前几天看内核中系统调用代码 xff0c 在系统调用向量表初始化中 xff0c 有下面这段代码写的让我有点摸不着头脑 xff1a const sys call ptr t sys call table NR syscall max 43 1
  • Linux gcc 利用反汇编来研究C语言函数堆栈的分配方式

    越来越感觉学习C和汇编才是最能接近计算机本质的途径 所以 xff0c 今天开始研究汇编了 xff0c 先从gcc反汇编开始 首先是下面的C代码 xff1a include lt stdio h gt int sum int a int b
  • ubuntu linux GAIM QQ

    sudo add apt repository ppa lainme pidgin lwqq sudo apt get update sudo apt get install pidgin lwqq sudo apt get install
  • Ubuntu 14.10 播放avi视频闪屏的简单解决方案

    昨天将ubuntu升级到了14 10版本 xff0c 没有得到想象中的视觉效果 但是 xff0c 后来却发现不能播放avi视频了 xff0c 尝试了各种播放器 xff0c 都无解 xff0c 总是闪屏 xff0c 而播放flv格式的视频就没
  • Ubuntu删除Compiz之后 恢复方法

    因为ubuntu14 10不能播放avi的问题纠结了很久 xff0c 最终使用转码软件解决的 但是还是不甘心啊 xff0c 总想解决这个问题或者知道问题的原因 偶然看到了系统中的compiz软件 xff0c 想到在网上看到的有人说是因为系统
  • Ubuntu14.10 unity-tweak-tool 不能正常打开的解决方法

    新的系统 xff0c 风格都变了 xff0c 折腾了一晚上 xff0c 想安装个苹果主题 xff0c 可是unity tweak tool 这个东西就是死活打不开 这么晚了 xff0c 不想多说了 xff0c 直接给解决方法吧 xff1a
  • 安装ubuntu14.04后做的一些事情

    ubuntu又折腾坏了 xff0c 于是有重新装系统了 装完之后 xff0c 美化美化 xff1a 1 本来嫌每次都sudo麻烦 xff0c 于是想将我的帐号设置为sudo不用输入密码 xff0c 但是编辑sudoer文件的时候 xff0c
  • LFS编译GCC GNU_USER_TARGET_OS_CPP_BUILTINS not declared in this scope

    gcc v 发现使用的gcc版本是4 7 安装gcc 4 4 or 4 3 xff0c 重新链接 xff0c 问题解决 apt get install gcc 4 4 g 43 43 4 4 进入 usr bin cd usr bin 建个
  • 将LFS系统通过grub装到优盘上启动

    最近在搞LFS xff0c 就是通过自己动手 xff0c 亲自编译源代码的方式 xff0c 建立自己的linux发行版 通过这个过程可以详细的深入了解linux内部的工作方式 xff0c 对理解操作系统的机制有很大的帮助 做这个项目 xff
  • kali linux 解决风扇猛转

    之前玩ubuntu的时候 xff0c 就感觉风扇猛转个不停 xff0c 之前是通过安装nvidia的闭源驱动 xff0c 然后再安装一个管理双显卡的工具解决的 xff0c 确实风扇及立马安静了下来 http www linuxidc com
  • PHP下十六位数值转IP地址

    PHP函数提供的long2ip和ip2long是IP和整形数值之间的转换 xff0c 没有和十六位数值的转换 xff0c 所以写下这个函数 function ntoip iphex len 61 strlen iphex 得到16进制字符串
  • linux系统备份命令

    tar cvpzf backup tgz exclude 61 proc exclude 61 lost 43 found exclude 61 backup tgz exclude 61 mnt exclude 61 sys exclud
  • 硬盘寻址能力的变换

    1 8G限制 硬盘寻址的限制 硬盘最初使用的寻址方法是柱面 磁头 扇区CHS xff08 Cylinder Head Sector xff09 xff0c 也称为3D模式 xff0c 是硬盘最早采用的寻址模式 通过分别指定柱面 磁头 扇区来
  • 关于动态new二维数组的问题

  • Linux 调节并自动保存屏幕亮度,重启有效

    用过几个Linux的发行版 xff0c 发现在笔记本上每次调节亮度后 xff0c 不能固定下来 xff0c 重新开机后就又恢复最大亮度了 之前一直用的是网上流行的方法 xff0c 即往etc rc local文件写入命令 xff0c 使其每
  • kali linux 安装Pidgin QQ

    首先 xff0c 需要kali开启PPA源 PPA xff08 Personal Package Archives xff1a 个人软件包档案 xff09 是Ubuntu Launchpad网络提供的一项服务 xff0c 允许个人用户上传软

随机推荐