jjzjj

递归门控卷积HorNet(gn_conv)阅读笔记

赫瑟尔 2023-08-09 原文

HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions ECCV2022
程序
视觉 Transformers 的最新进展在基于点积 self-attention 的新空间建模机制驱动的各种任务中取得了巨大成功。在本文中,我们展示了视觉 Transformer 背后的关键要素,即输入自适应、远程和高阶空间交互,也可以通过基于卷积的框架有效实现。我们提出了递归门控卷积(gnConv),它通过门控卷积和递归设计执行高阶空间交互。新操作具有高度的灵活性和可定制性,它兼容各种卷积变体,并将自注意力中的二阶交互扩​​展到任意阶,而不会引入大量额外的计算。 gnConv 可以作为一个即插即用的模块来改进各种视觉 Transformer 和基于卷积的模型。基于该操作,我们构建了一个新的通用视觉骨干家族,名为 HorNet。在 ImageNet 分类、​​COCO 对象检测和 ADE20K 语义分割方面的大量实验表明,在整体架构和训练配置相似的情况下,HorNet 的性能明显优于 Swin Transformers 和 ConvNeXt。 HorNet 还显示出对更多训练数据和更大模型大小的良好可扩展性。除了在视觉编码器中的有效性外,我们还展示了 gnConv 可以应用于特定任务的解码器,并以更少的计算量持续提高密集预测性能。我们的结果表明,gnConv 可以成为一个新的视觉建模基础模块,它有效地结合了视觉 Transformer 和 CNN 的优点。代码可在 https://github.com/raoyongming/HorNet 获得。

我们的主要思想的插图。我们展示了执行不同交互顺序的代表性空间建模操作。在本文中,我们专注于研究特征(红色)与其相邻区域(浅灰色​​)之间的显式空间交互。 (a) 标准卷积运算没有明确考虑空间交互。 (b) 动态卷积 [27, 4] 和 SE [25] 引入了动态权重,以通过额外的空间交互来提高卷积的建模能力。 © 自注意力操作 [52] 通过两个连续的矩阵乘法执行二阶空间交互。 (d) gnConv 使用具有门控卷积和递归设计的高效实现来实现任意阶空间交互。
Transformer[41] 对采用视觉 Transformer 的元架构来改进 CNN 进行了深入研究,并提出使用大型 7×7 内核来构建现代 CNN。 [44] 和 [14] 分别建议使用更大的内核来学习具有全局滤波器和高达 31×31 卷积的远程关系。 [20] 表明,输入自适应权重在视觉 Transformer 中起着关键作用,并与具有动态卷积的 Swin Transformer [4, 27] 实现了相似的性能。然而,尚未从高阶空间交互的角度分析点积自注意力在视觉任务中的有效性。
虽然由于非线性,在深度模型中的两个空间位置之间存在复杂且通常是高阶的交互,但自注意力和其他动态网络的成功表明,架构设计引入的显式和高阶空间交互有利于提高视觉模型的建模能力。如图 1 所示,普通卷积操作没有明确考虑空间位置(即红色特征)与其相邻区域(即浅灰色区域)之间的空间交互。动态卷积 [4, 27, 20] 等增强卷积操作通过生成动态权重引入了显式空间交互。 Transformers [52] 中的点积自注意力操作由两个连续的空间交互组成,通过在查询、键和值之间执行矩阵乘法。视觉建模的基本操作趋势表明,网络容量可以通过增加空间交互的阶数来提高。
在本文中,我们总结了视觉 Transformers 成功背后的关键因素是空间建模的新方法,该方法具有输入自适应、远程和高阶空间交互,由 self-attention 操作执行。虽然之前的工作已经成功地将视觉 Transformers 的元架构 [41、20、44、14]、输入自适应权重生成策略 [20] 和大范围建模能力 [44、14] 迁移到 CNN 模型,但更高阶的空间相互作用机制尚未研究
我们表明,所有三个关键要素都可以使用基于卷积的框架有效地实现。我们提出了递归门控卷积(gnConv),它与门控卷积和递归设计执行高阶空间交互。 gnConv 不是简单地在 self-attention 中模仿成功的设计,而是有几个额外的优点:
1)高效。基于卷积的实现避免了自注意力的二次复杂度。在执行空间交互期间逐渐增加通道宽度的设计也使我们能够实现具有有限复杂性的高阶交互;
2) 可扩展。我们将自注意力中的二阶交互扩​​展到任意阶,以进一步提高建模能力。由于我们不对空间卷积的类型做出假设,因此 gnConv 兼容各种内核大小和空间混合策略,如 [44, 14];
3) 平移等变。 gnConv 完全继承了标准卷积的平移等效性,为主要视觉任务引入了有益的归纳偏差,并避免了局部注意力带来的不对称性 [40, 33]。
基于 gnConv,我们构建了一个新的通用视觉骨干家族,名为 HorNet。我们对 ImageNet 分类 [13]、COCO 对象检测 [37] 和 ADE20K 语义分割 [67] 进行了广泛的实验,以验证我们模型的有效性。凭借相同的 7×7 内核/窗口以及相似的整体架构和训练配置,HorNet 在不同复杂程度的所有任务上都大大优于 Swin 和 ConvNeXt。通过使用全局内核大小[44],可以进一步扩大差距。 HorNet 还显示出对更多训练数据和更大模型大小的良好可扩展性,在 ImageNet 上达到 87.7% 的 top-1 准确率,在 ADE20K val 上达到 54.6% mIoU,在使用 ImageNet-22K 预训练的 COCO val 上达到 55.8% 的边界框 AP。除了在视觉编码器中应用 gnConv 之外,我们还进一步测试了我们设计在特定任务解码器上的通用性。通过将 gConv 添加到广泛使用的特征融合模型 FPN [35] 中,我们开发了 HorFPN 来建模来自不同层次级别的特征的高阶空间关系。我们观察到 HorFPN 还可以以较低的计算成本持续改进各种密集预测模型。我们的结果表明,gnConv 可以成为视觉建模中自我注意的一种有前途的替代方案,并有效地结合了视觉 Transformer 和 CNN 的优点。
3.1 gnConv:递归门控卷积
在本节中,我们将介绍 gnConv,这是一种实现长期和高阶空间交互的有效操作。 gnConv 是使用标准卷积、线性投影和元素乘法构建的,但具有与自注意力相似的输入自适应空间混合功能。
与门控卷积的输入自适应交互:视觉变形金刚最近的成功主要取决于对视觉数据中空间交互的正确建模。与简单地使用静态卷积核聚合相邻特征的 CNN 3 不同,视觉 Transformer 应用多头自注意力来动态生成权重以混合空间标记。然而,二次复杂度w.r.t。自注意力的输入大小在很大程度上阻碍了视觉转换器的应用,尤其是在需要更高分辨率特征图的分割和检测等下游任务上。在这项工作中,我们没有像以前的方法 [40,9,53] 那样降低自注意力的复杂性,而是寻求一种更有效的方法来通过卷积和全连接层等简单操作执行空间交互。
我们方法的基本操作是门控卷积(gConv)。设 x ∈ RHW ×C 为输入特征,门控卷积的输出 y =gConv(x) 可以写成:

与大内核卷积的长期交互。视觉 Transformer 和传统 CNN 之间的另一个区别是感受野。传统的 CNN [47, 22] 通常在整个网络中使用 3×3 卷积,而视觉变换器在整个特征图 [16, 50] 或相对较大的局部窗口(例如 7×7)内计算自注意力。视觉 Transformers 的大感受野更容易捕捉长期依赖关系,这也被认为是视觉 Transformers 的关键优势之一。受这种设计的启发,最近有一些努力将大核卷积引入 CNN [14,41,44]。为了使我们的 gnConv 能够捕获长期交互,我们对深度卷积 f 采用了两种实现
1)7×7 卷积。 7×7 是 Swin Transformers [40] 和 ConvNext [41] 的默认窗口/内核大小。 [41] 中的研究表明,内核大小在 ImageNet 分类和各种下游任务上产生了良好的性能。我们遵循这种配置来公平地与视觉变形金刚和现代 CNN 的代表性工作进行比较。
• 2)全局过滤器(GF)。 GF层[44]将频域特征与可学习的全局滤波器相乘,这相当于空间域中的卷积,具有全局内核大小和圆形填充。我们使用 GF 层的修改版本,使用全局滤波器处理一半通道,另一半使用 3×3 深度卷积处理,并且仅在后期使用 GF 层以保留更多局部细节。
视觉模型中的空间交互。我们从空间交互的角度回顾了一些具有代表性的视觉模型设计,如图 1 所示。具体来说,我们对特征 xi 与其相邻特征 xj 之间的交互感兴趣,j ∈ Ωi。通过使用 [32, 1] 中为解释交互效应 (IE) 而设计的工具,我们在附录 B 中提供了对显式空间交互顺序的直观分析。我们的分析揭示了视觉 Transformer 与以前的架构之间的关键区别。新视图,即视觉变形金刚在每个基本块中都有高阶空间交互。这一结果启发我们探索一种能够实现更高效、更有效的空间交互的架构,其中包含两个以上的订单。如上所述,我们提出的 gnConv 可以实现具有有限复杂度的任意阶交互。还值得注意的是,类似于深度模型中的其他比例因子,如宽度 [65] 和深度 [22],简单地增加空间交互的顺序而不考虑整体模型容量不会导致良好的权衡 [49] .在本文中,我们专注于基于对精心设计的模型的空间交互顺序的分析,开发更强大的可视化建模架构。我们相信对高阶空间相互作用进行更彻底和正式的讨论可能是未来的一个重要方向。

图 2:使用 gnConv 概述 HorNet 中的基本构建块。我们采用 Transformers [52] 的块设计,并用 gnConv 替换自注意力子层来开发我们的 HorNet(左)。我们还提供了 g3Conv 的详细实现(中)和任意顺序的 Pytorch 样式代码(右)。
3.2 Model Architectures
HorNet。 gnConv 可以替代视觉 Transformers [50, 40] 或现代 CNN [41] 中的空间混合层。我们遵循与 [52, 40] 相同的元架构来构建 HorNet,其中基本块包含空间混合层和前馈网络 (FFN)。根据模型大小和我们 gnConv 中深度卷积 fk 的实现,我们有两个系列的模型变体,分别称为 HorNet-T/S/B/L7×7 和 HorNet-T/S/B/LGF。我们将流行的 Swin Transformer [40] 和 ConvNeXt [41] 作为视觉 Transformer 和 CNN 基线,因为我们的模型是基于基于卷积的框架实现的,同时具有像视觉 Transformer 这样的高阶交互。为了与基线进行公平比较,我们直接遵循 Swin Transformers-S/B/L [40] 的块数,但在第 2 阶段插入一个额外的块以使整体复杂度接近,从而得到 [2, 3, 18 , 2] 所有模型变体中每个阶段的块。我们简单地调整基础通道数 C 来构建不同大小的模型,并按照惯例将 4 个阶段的通道数设置为 [C, 2C, 4C, 8C]。对于 HorNet-T/S/B/L,我们分别使用 C = 64、96、128、192。我们将每个阶段的交互顺序(即 gnConv 中的 n)默认设置为 2,3,4,5,使得最粗阶 C0 的通道在不同阶段是相同的
HorFP:除了在视觉编码器中使用 gnConv 之外,我们发现我们的 gnConv 可以成为标准卷积的增强替代方案,该标准卷积考虑了各种基于卷积的模型中的高阶空间交互。因此,我们用我们的 gnConv 替换 FPN [36] 中用于特征融合的空间卷积,以改善下游任务的空间交互。具体来说,我们在融合了不同金字塔级别的特征之后添加了我们的 gnConv。对于目标检测,我们将自顶向下路径之后的 3×3 卷积替换为每个级别的 gnConv。对于语义分割,我们只需将多级特征图连接后的 3×3 卷积替换为 gnConv,因为最终结果是直接从该连接特征预测的。我们还有两个实现,称为 HorFPN7×7 和 HorFPNGF,由 fk 的选择决定。
5 结论 我们提出了递归门控卷积 (gnConv),它与门控卷积和递归设计执行高效、可扩展和平移等变的高阶空间交互。 gnConv 可以作为各种视觉 Transformer 和基于卷积的模型中空间混合层的替代品。基于该操作,我们构建了一个新的通用视觉骨干系列 HorNet。大量实验证明了 gnConv 和 HorNet 在常用视觉识别基准上的有效性。我们希望我们的尝试能够激发未来的工作,以进一步探索视觉模型中的高阶空间交互。

有关递归门控卷积HorNet(gn_conv)阅读笔记的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. ruby - 递归地将所有数字字符串转换为 Ruby 哈希中的整数 - 2

    我有一个随机大小的散列,它可能有类似"100"的值,我想将其转换为整数。我知道我可以使用value.to_iifvalue.to_i.to_s==value来做到这一点,但我不确定我将如何在我的散列中递归地做到这一点,考虑到一个值可以是一个字符串,或一个数组(哈希或字符串),或另一个哈希。 最佳答案 这是一个非常简单的递归实现(尽管必须同时处理数组和散列会增加一些技巧)。deffixnumifyobjifobj.respond_to?:to_i#IfwecancastittoaFixnum,doit.obj.to_ielsifobj

  5. Ruby:标准递归模式 - 2

    我经常迷上ruby​​的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情

  6. ruby - 为什么我用递归得到 "stack level too deep"? - 2

    我有这个ruby代码:defget_sumnreturn0ifn似乎正在为999之前的值工作。当我尝试9999时,它给了我这个:stackleveltoodeep(SystemStackError)所以,我添加了这个:RubyVM::InstructionSequence.compile_option={:tailcall_optimization=>true,:trace_instruction=>false}但什么也没发生。我的ruby版本是:ruby1.9.3p392(2013-02-22revision39386)[x86_64-darwin12.2.1]我还增加了机器的堆栈大

  7. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  8. ruby - 构建网络蜘蛛时,应该使用递归吗? - 2

    构建一个深度优先的网络蜘蛛,这意味着它将访问第一页上的所有链接,然后转到每个链接,并访问所有第二页上的链接...你应该使用递归吗?我发现这是CPU密集型的。defrecursion()linkz_on_first_page.eachdo|link|recursion(link)endendrecursion(firstpage) 最佳答案 绝对不是,由于万维网的实际性质,您很快就会遇到问题。当您访问带有主导航部分的网站时,每个页面都链接到其他页面,您就进入了一个无限循环。您可以跟踪您处理了哪些链接,但即便如此,递归循环并不真正适合万

  9. ruby-on-rails - 如何以递归方式将 YAML 文件扁平化为 JSON 对象,其中键是点分隔的字符串? - 2

    例如,如果我有YAML文件en:questions:new:'NewQuestion'other:recent:'Recent'old:'Old'这最终会变成一个json对象,例如{'questions.new':'NewQuestion','questions.other.recent':'Recent','questions.other.old':'Old'} 最佳答案 由于问题是关于在Rails应用程序上使用YAML文件进行i18n,因此值得注意i18ngem提供了一个辅助模块I18n::Backend::Flatten完全像

  10. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

随机推荐