IEEE 会议模板介绍

IEEE会议模板中提供了latex格式要求。

模板下载

一般在所投期刊和会议的官网上都会给出投稿模板或者给出投稿模板的链接。以IEEE的会议模板页面为例

我们可以在页面中下载自己想要的模板。一般分为LATEX版本和Microsoft Word版本,为了适应大部分读者朋友,本文我们以Microsoft Word版的A4为例进行讲解(A4和美国信纸的版本主要在于纸张大小和页边距不同,一般选用A4版)。点击链接可以下载模板打开之后如下:

可以看到,模板中已经有很多内容了。主要为对模板的介绍,示例以及一些注意事项。我一般是将自己的内容复制进去再用格式刷刷一遍来保证排版正确。下面我们开始介绍一下各部分的注意事项。

title

标题除了要使用样式表中的“title”之外,需要注意是不能使用副标题的。此外不可以使用符号,特殊字符,脚注或数学元素。

除非不可避免,不要在title中使用缩写。

如果uses可以准确替代using,则u大写,否则小写。

Author

模板可以有(但不限于)六位作者。所有的会议文章至少要有一位作者。作者名称从左到右列出,然后到下一行。作者序列将在以后的引用和索引服务中使用。

对于作者超过六名的论文:水平添加作者姓名。如果作者超过八名,请写到第三行。
对于作者少于六个的论文按以下步骤调整:

  • 选择:强调所有的作者和隶属行
  • 更改列数:从工具栏中选择列图标,然后选择正确的列数
  • 删除:删除多余作者的作者和隶属行

对于作者信息的书写,第一行是姓名,第二三行是组织名称,第四行是城市和国家,第五行是email或ORCID。请确保组织隶属关系尽可能简洁(例如,不要在同一组织的部门之间进行区分)。

Abstract

不可以使用符号,特殊字符,脚注或数学。

Keywords

无明确要求,一般写5个左右。

Heading

除非不可避免,不要在heading中使用缩写。

在混入式标题中,例如摘要需要用斜体区分标题和文本。

包含两种component heads 和text heads.

component heads包括Acknowledgments 和References ,使用Heading 5样式。

text heads按照关系、层级组织。有“Heading 1”,“Heading 2”,“Heading 3”和“Heading 4”的样式。

Text

分离文本和图形文件。只在段落末尾使用一个回车。不要在任何位置使用用任何分页。不要给文本标题加上数字,这些由模板来做。

缩写

即使在摘要中已经定义了缩写和首字母缩写,也要在正文首次使用时进行定义。不必定义诸如IEEE,SI,MKS,CGS,sc,dc和rms之类的缩写。

单位

使用SI(MKS)或CGS作为主要单位(鼓励使用SI单位)。英语单位可在括号中标注作为辅助单位。使用英文单位作为交易中的标识符除外,如“3.5英寸磁盘驱动器”。

避免同时使用SI和CGS单位,如以安培为单位的电流和以奥斯特为单位的磁场。如果必须使用混合单位,请说明方程中使用的每个数量的单位。

不要混用单位的完整拼写和缩写:“Wb/m2”或“webers per square meter”是正确的的,但“webers/m2”是错误的。当文本中出现单位时,将它们拼写出来:“. . . a few henries”,而非“. . . a few H”。

小数点之前的零不要省略:“0.25”而不是“.25”。使用“cm3”,而不是“cc”。

公式

请确定公式使用的是Times New Roman或者Symbol字体。要创建多级公式,可以将公式做成图形,然后将其插入文本中。

对公式使用连续编号。括号内的方程式编号右对齐。为了使用公式更紧凑,可以使用“/”,exp函数或者适当的指数。数量或变量使用 Italicize Roman symbols,而不是 Greek symbols。使用长破折号而不是连字符来表示减号。当公式是句子的一部分时,记得使用逗号或句号。

注意,公式是使用中心制表符来居中的。要确保在公式之前或之后立即定义公式中的符号。使用“(1)“,而不是“Eq. (1)”或“equation (1)”。除非是在句子开头时,使用“Equation (1) is”的描述。

图要放在列的顶部或者底部,避免将它们放在列的中间。大图可以跨越两列。在文本中引入后将其插入。即使在句子开头,也要使用缩写“Fig. 1”。

图的标签要使用8号Times New Roman字体,编写标签时使用单词而不是符号或缩写。如果在标签中包含单位,请在括号内标注。不要仅用单位标注轴。不要以数量和单位的比例标记轴。

图的标题放在图的下方,使用figure caption样式。

建议使用文本框插入图,此方法比直接插入图片更稳定。将文本框的颜色和相同安排选择为无填充和无线条。

表要放在列的顶部或者底部,避免将它们放在列的中间。大表可以跨越两列。在文本中引入后将其插入。

表的标题放在表的上方,使用table head样式。

如需使用脚注请用字母。

脚注

在上标中分别编号。将实际脚注放在引用该脚注的列的底部。

在这里插入图片描述

ACKNOWLEDGMENT

在美式英语中acknowledgment中g后没有e。赞助致谢请放在第一页无编号脚注中。

REFERENCES

在方括号[1]中连续编号参考文献。句子标点在方括号之后。使用“in [3]”而不是“Ref. [3]” 或者“reference [3]”,除非在句子开头可用“Reference [3] was the first …”

不要放置脚注。

除非有六位以上的作者,否则给出所有作者的名字,不要使用et al.。尚未发表的论文,即使已经提交发表,也应该引用为“unpublished”。已被接收发表的论文应引用为“in press”。出专有名词和元素符号外,仅将论文标题中的第一个单词大写。

对于在翻译期刊上发表的论文,请先给出英文引文,然后再给出外语原文。

最后要做的

模板用于撰写和格式化论文。在提交之前,请确保从文件中删除了所有模板文本,否则将会导致论文无法发表。

如何写好一篇科研论文之会议期刊了解

对于刚入手论文的小白来说,如何了解所在领域的期刊会议有哪些,截至投稿日期以及往年发布的论文等信息是十分重要的。下面 以IEEE为例子:

1、打开ieee网站: https://ieeexplore.ieee.org/

2、选择browse中的不同内容

3、筛选自己要找的会议、期刊

5、主页由相关的会议官网

可以选择某年的发表文章,or 搜索 content关键字,找到去年发布的文章列表

6、这部分是我们比较感兴趣的部分,在这里下载模板

7、在作者工具中可以找到论文模板和写作注意事项

一个问题:IEEE投稿时,如何使用“IEEE Reference Preparation Assistant”?

如何生成IEEE参考文献格式?

https://www.bilibili.com/video/BV1Pr4y1F79D/

linux 查看端口占用

1、netstat -lnp|grep 端口号

2、lsof -i:端口号

3、 fuser -v -n tcp 80 命令查看80端口的占用、

结束该占用80端口的进程,使用kill命令。

1. kill 进程号:

会给进程发送一个SIGTERM信号,使进程先释放自己资源,然后停止,但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应。

2.kill -9 进程号:

会给进程发送一个SIGKILL信号,使该进程执行exit,不会被阻塞,所以可以有效的杀掉进程。

这里我使用kill -9 9415强制杀掉9415进程释放80端口。

深度学习中的 Attention 机制总结与代码实现(2017-2021年)

转载自作者:mayiwei1998
本文转载自:GiantPandaCV
原文链接:
深度学习中的Attention总结

github地址:

https://github.com/xmu-xiaoma666/External-Attention-pytorch

1. External Attention

1.1. 引用

Beyond Self-attention: External Attention using Two Linear Layers for Visual Tasks.—arXiv 2021.05.05

论文地址:https://arxiv.org/abs/2105.02358

1.2. 模型结构

图片

1.3. 简介

这是五月份在arXiv上的一篇文章,主要解决的Self-Attention(SA)的两个痛点问题:(1)O(n^2)的计算复杂度;(2)SA是在同一个样本上根据不同位置计算Attention,忽略了不同样本之间的联系。因此,本文采用了两个串联的MLP结构作为memory units,使得计算复杂度降低到了O(n);此外,这两个memory units是基于全部的训练数据学习的,因此也隐式的考虑了不同样本之间的联系。

1.4. 使用方法

from attention.ExternalAttention import ExternalAttention
import torch


input=torch.randn(50,49,512)
ea = ExternalAttention(d_model=512,S=8)
output=ea(input)
print(output.shape)

2. Self Attention

2.1. 引用

Attention Is All You Need—NeurIPS2017

论文地址:https://arxiv.org/abs/1706.03762

2.2. 模型结构

2.3. 简介

这是Google在NeurIPS2017发表的一篇文章,在CV、NLP、多模态等各个领域都有很大的影响力,目前引用量已经2.2w+。Transformer中提出的Self-Attention是Attention的一种,用于计算特征中不同位置之间的权重,从而达到更新特征的效果。首先将input feature通过FC映射成Q、K、V三个特征,然后将Q和K进行点乘的得到attention map,再将attention map与V做点乘得到加权后的特征。最后通过FC进行特征的映射,得到一个新的特征。(关于Transformer和Self-Attention目前网上有许多非常好的讲解,这里就不做详细的介绍了)

2.4. 使用方法

from attention.SelfAttention import ScaledDotProductAttention
import torch

input=torch.randn(50,49,512)
sa = ScaledDotProductAttention(d_model=512, d_k=512, d_v=512, h=8)
output=sa(input,input,input)
print(output.shape)

3. Squeeze-and-Excitation(SE) Attention

3.1. 引用

Squeeze-and-Excitation Networks—CVPR2018

论文地址:https://arxiv.org/abs/1709.01507

3.2. 模型结构

图片

3.3. 简介

这是CVPR2018的一篇文章,同样非常具有影响力,目前引用量7k+。本文是做通道注意力的,因其简单的结构和有效性,将通道注意力掀起了一波小高潮。大道至简,这篇文章的思想可以说非常简单,首先将spatial维度进行AdaptiveAvgPool,然后通过两个FC学习到通道注意力,并用Sigmoid进行归一化得到Channel Attention Map,最后将Channel Attention Map与原特征相乘,就得到了加权后的特征。

3.4. 使用方法

from attention.SEAttention import SEAttention
import torch

input=torch.randn(50,512,7,7)
se = SEAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)

4. Selective Kernel(SK) Attention

4.1. 引用

Selective Kernel Networks—CVPR2019

论文地址:https://arxiv.org/pdf/1903.06586.pdf

4.2. 模型结构

图片

4.3. 简介

这是CVPR2019的一篇文章,致敬了SENet的思想。在传统的CNN中每一个卷积层都是用相同大小的卷积核,限制了模型的表达能力;而Inception这种“更宽”的模型结构也验证了,用多个不同的卷积核进行学习确实可以提升模型的表达能力。作者借鉴了SENet的思想,通过动态计算每个卷积核得到通道的权重,动态的将各个卷积核的结果进行融合。

个人认为,之所以所这篇文章也能够称之为lightweight,是因为对不同kernel的特征进行通道注意力的时候是参数共享的(i.e. 因为在做Attention之前,首先将特征进行了融合,所以不同卷积核的结果共享一个SE模块的参数)。

本文的方法分为三个部分:Split,Fuse,Select。Split就是一个multi-branch的操作,用不同的卷积核进行卷积得到不同的特征;Fuse部分就是用SE的结构获取通道注意力的矩阵(N个卷积核就可以得到N个注意力矩阵,这步操作对所有的特征参数共享),这样就可以得到不同kernel经过SE之后的特征;Select操作就是将这几个特征进行相加。

4.4. 使用方法

from attention.SKAttention import SKAttention
import torch

input=torch.randn(50,512,7,7)
se = SKAttention(channel=512,reduction=8)
output=se(input)
print(output.shape)

5. CBAM Attention

5.1. 引用

CBAM: Convolutional Block Attention Module—ECCV2018

论文地址:https://openaccess.thecvf.com/content_ECCV_2018/papers/Sanghyun_Woo_Convolutional_Block_Attention_ECCV_2018_paper.pdf

5.2. 模型结构

图片
图片

5.3. 简介

这是ECCV2018的一篇论文,这篇文章同时使用了Channel Attention和Spatial Attention,将两者进行了串联(文章也做了并联和两种串联方式的消融实验)。

Channel Attention方面,大致结构还是和SE相似,不过作者提出AvgPool和MaxPool有不同的表示效果,所以作者对原来的特征在Spatial维度分别进行了AvgPool和MaxPool,然后用SE的结构提取channel attention,注意这里是参数共享的,然后将两个特征相加后做归一化,就得到了注意力矩阵。

Spatial Attention和Channel Attention类似,先在channel维度进行两种pool后,将两个特征进行拼接,然后用7×7的卷积来提取Spatial Attention(之所以用7×7是因为提取的是空间注意力,所以用的卷积核必须足够大)。然后做一次归一化,就得到了空间的注意力矩阵。

5.4. 使用方法

from attention.CBAM import CBAMBlock
import torch

input=torch.randn(50,512,7,7)
kernel_size=input.shape[2]
cbam = CBAMBlock(channel=512,reduction=16,kernel_size=kernel_size)
output=cbam(input)
print(output.shape)

6. BAM Attention

6.1. 引用

BAM: Bottleneck Attention Module—BMCV2018

论文地址:https://arxiv.org/pdf/1807.06514.pdf

6.2. 模型结构

图片

6.3. 简介

这是CBAM同作者同时期的工作,工作与CBAM非常相似,也是双重Attention,不同的是CBAM是将两个attention的结果串联;而BAM是直接将两个attention矩阵进行相加。

Channel Attention方面,与SE的结构基本一样。Spatial Attention方面,还是在通道维度进行pool,然后用了两次3×3的空洞卷积,最后将用一次1×1的卷积得到Spatial Attention的矩阵。

最后Channel Attention和Spatial Attention矩阵进行相加(这里用到了广播机制),并进行归一化,这样一来,就得到了空间和通道结合的attention矩阵。

6.4.使用方法

from attention.BAM import BAMBlock
import torch

input=torch.randn(50,512,7,7)
bam = BAMBlock(channel=512,reduction=16,dia_val=2)
output=bam(input)
print(output.shape)

7. ECA Attention

7.1. 引用

ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks—CVPR2020

论文地址:https://arxiv.org/pdf/1910.03151.pdf

7.2. 模型结构

图片

7.3. 简介

这是CVPR2020的一篇文章。

如上图所示,SE实现通道注意力是使用两个全连接层,而ECA是需要一个的卷积。作者这么做的原因一方面是认为计算所有通道两两之间的注意力是没有必要的,另一方面是用两个全连接层确实引入了太多的参数和计算量。

因此作者进行了AvgPool之后,只是使用了一个感受野为k的一维卷积(相当于只计算与相邻k个通道的注意力),这样做就大大的减少的参数和计算量。(i.e.相当于SE是一个global的注意力,而ECA是一个local的注意力)。

7.4. 使用方法:

from attention.ECAAttention import ECAAttention
import torch

input=torch.randn(50,512,7,7)
eca = ECAAttention(kernel_size=3)
output=eca(input)
print(output.shape)

8. DANet Attention

8.1. 引用

Dual Attention Network for Scene Segmentation—CVPR2019

论文地址:https://arxiv.org/pdf/1809.02983.pdf

8.2. 模型结构

图片
图片
图示, 示意图  描述已自动生成

8.3. 简介

这是CVPR2019的文章,思想上非常简单,就是将self-attention用到场景分割的任务中,不同的是self-attention是关注每个position之间的注意力,而本文将self-attention做了一个拓展,还做了一个通道注意力的分支,操作上和self-attention一样,不同的通道attention中把生成Q,K,V的三个Linear去掉了。最后将两个attention之后的特征进行element-wise sum。

8.4. 使用方法

from attention.DANet import DAModule
import torch

input=torch.randn(50,512,7,7)
danet=DAModule(d_model=512,kernel_size=3,H=7,W=7)
print(danet(input).shape)

9. Pyramid Split Attention(PSA)

9.1. 引用

EPSANet: An Efficient Pyramid Split Attention Block on Convolutional Neural Network—arXiv 2021.05.30

论文地址:https://arxiv.org/pdf/2105.14447.pdf

9.2. 模型结构

图片
图片

9.3. 简介

这是深大5月30日在arXiv上上传的一篇文章,本文的目的是如何获取并探索不同尺度的空间信息来丰富特征空间。网络结构相对来说也比较简单,主要分成四步,第一步,将原来的feature根据通道分成n组然后对不同的组进行不同尺度的卷积,得到新的特征W1;第二步,用SE在原来的特征上进行SE,从而获得不同的阿头疼托尼;第三步,对不同组进行SOFTMAX;第四步,将获得attention与原来的特征W1相乘。

9.4. 使用方法

from attention.PSA import PSAimport torchinput=torch.randn(50,512,7,7)psa = PSA(channel=512,reduction=8)output=psa(input)print(output.shape)

10. Efficient Multi-Head Self-Attention(EMSA)

10.1. 引用

ResT: An Efficient Transformer for Visual Recognition—arXiv 2021.05.28

论文地址:https://arxiv.org/abs/2105.13677

10.2. 模型结构

图片

10.3. 简介

这是南大5月28日在arXiv上上传的一篇文章。本文解决的主要是SA的两个痛点问题:(1)Self-Attention的计算复杂度和n(n为空间维度大小)呈平方关系;(2)每个head只有q,k,v的部分信息,如果q,k,v的维度太小,那么就会导致获取不到连续的信息,从而导致性能损失。这篇文章给出的思路也非常简单,在SA中,在FC之前,用了一个卷积来降低了空间的维度,从而得到空间维度上更小的K和V。

10.4. 使用方法

from attention.EMSA import EMSAimport torchfrom torch import nnfrom torch.nn import functional as Finput=torch.randn(50,64,512)emsa = EMSA(d_model=512, d_k=512, d_v=512, h=8,H=8,W=8,ratio=2,apply_transform=True)output=emsa(input,input,input)print(output.shape)

深度学习调参技巧

以下文章来源于AI算法与图像处理 ,作者AI_study

最近在跑模型,发现自己跑出来的性能总是跟论文里的有些差别,对于很多参数,学习率、批次大小等没啥概念。。。

训练深度神经网络是困难的。它需要知识和经验,以适当的训练和获得一个最优模型。在这篇文章中,我想分享我在训练深度神经网络时学到的东西。以下提示和技巧可能对你的研究有益,并可以帮助你加速网络架构或参数搜索。

  • 1、

在你开始建立你的网络体系结构,你需要做的第一件事是验证输入到网络的数据,确保输入(x)对应于一个标签(y)。在预测的情况下,确保真实标签(y)正确编码标签索引(或者one-hot-encoding)。否则,训练就不起作用。

  • 2、

决定是选择使用预模型还是从头开始训练你的网络?

如果问题域中的数据集类似于ImageNet数据集,则对该数据集使用预训练模型。使用最广泛的预训练模型有VGG net、ResNet、DenseNet或Xception等。有许多层架构,例如,VGG(19和16层),ResNet(152, 101, 50层或更少),DenseNet(201, 169和121层)。注意:不要尝试通过使用更多的层网来搜索超参数(例如VGG-19, ResNet-152或densen -201层网络,因为它在计算量很大),而是使用较少的层网(例如VGG-16, ResNet-50或densen -121层)。选择一个预先训练过的模型,你认为它可以用你的超参数提供最好的性能(比如ResNet-50层)。在你获得最佳超参数后,只需选择相同但更多的层网(如ResNet-101或ResNet-152层),以提高准确性。ImageNet:http://www.image-net.org/challenges/LSVRC/2012/VGG net :https://arxiv.org/abs/1409.1556ResNet:https://arxiv.org/abs/1512.03385DenseNet:https://arxiv.org/abs/1608.06993Xception :https://arxiv.org/abs/1610.02357

微调几层,或者如果你有一个小的数据集,只训练分类器,你也可以尝试在你要微调的卷积层之后插入Dropout层,因为它可以帮助对抗网络中的过拟合。Dropout:http://jmlr.org/papers/v15/srivastava14a.html

如果你的数据集与ImageNet数据集不相似,你可以考虑从头构建并训练你的网络。

  • 3、

在你的网络中始终使用归一化层(normalization layers)。如果你使用较大的批处理大小(比如10个或更多)来训练网络,请使用批标准化层(BatchNormalization)。否则,如果你使用较小的批大小(比如1)进行训练,则使用InstanceNormalization层。请注意,大部分作者发现,如果增加批处理大小,那么批处理规范化会提高性能,而当批处理大小较小时,则会降低性能。但是,如果使用较小的批处理大小,InstanceNormalization会略微提高性能。或者你也可以尝试组规范化(GroupNormalization)。BatchNormalization:https://arxiv.org/abs/1502.03167InstanceNormalization:https://arxiv.org/abs/1607.08022GroupNormalization:https://arxiv.org/abs/1803.08494

  • 4、SpatialDropout

如果你有两个或更多的卷积层(比如Li)对相同的输入(比如F)进行操作(参考下面的示意图理解),那么在特征连接后使用SpatialDropout。由于这些卷积层是在相同的输入上操作的,因此输出特征很可能是相关的。因此,SpatialDropout删除了那些相关的特征,并防止网络中的过拟合。注意: 它主要用于较低的层而不是较高的层。SpatialDropout:https://arxiv.org/abs/1411.4280

SpatialDropout是Tompson等人在图像领域提出的一种dropout方法。普通的dropout会随机地将部分元素置零,而SpatialDropout会随机地将部分区域置零,该dropout方法在图像识别领域实践证明是有效的。Dropout操作随机地将部分元素置零,并且对非零部分做了一个尺度变换。尺度变换的幅度跟初始化的drop_rate有关。
作用
一般,我们会将dropout理解为“一种低成本的集成策略”,这是对的,具体过程可以大概这样理解:
经过上述置零操作后,我们可以认为零的部分是被丢弃的,丢失了一部分信息。因而,逼着模型用剩下的信息去拟合目标。然而每次dropout是随机的。我们就不能侧重于某些节点,所以总的来说就是—每次逼着模型用少量的特征学习,每次被学习的特征又不同,那么就是说,每个特征都应该对
模型的预测有所贡献(而不是侧重于部分特征,导致过拟合)。

通的dropout会随机独立地将部分元素置零,而SpatialDropout1D会随机地对某个特定的纬度全部置零。因此SpatialDropout1D需要指定Dropout维度,即对应dropout函数中的参数noise_shape。

  • 5、

为了确定你的网络容量,尝试用一小部分训练例子来超载你的网络(andrej karpathy的提示)。如果它没有超载,增加你的网络容量。在过拟合后,使用正则化技巧如L1、L2、Dropout或其他技术来对抗过拟合。L1:https://keras.io/regularizers/L2:https://keras.io/regularizers/Dropout:http://jmlr.org/papers/v15/srivastava14a.html

  • 6、

另一种正则化技术是约束或限制你的网络权值。这也有助于防止网络中的梯度爆炸问题,因为权值总是有界的。与L2正则化相反,在你的损失函数中惩罚高权重,这个约束直接正则化你的权重。你可以在Keras中轻松设置权重约束

  • 7、

对数据进行均值减法有时会产生非常糟糕的效果,特别是对灰度图像进行减法(我个人在前景分割领域就遇到过这个问题)。

  • 8、在训练前和训练期间,确保打乱训练数据,以防你不能从时序数据中获取有用信息。这可能有助于提高您的网络性能。
  • 9、如果你的问题域与稠密预测(dense prediction)相关(如语义分割),我建议你使用膨胀残差网络作为预训练模型,因为它最适合稠密预测。Dilated Residual Networks:https://arxiv.org/abs/1705.09914
  • 10. 要捕获对象周围的上下文信息,可以使用多尺度特性的池化模块。该思想成功地应用于语义分割或前景分割中。semantic segmentation:https://arxiv.org/abs/1802.02611foreground segmentation:https://arxiv.org/abs/1808.01477
  • 11 、 Opt-out void labels(或模糊区域)从您的损失或精度计算,如果有。这可以帮助你的网络在预测时更有信心。
  • 12、如果你有高度不平衡的数据问题,在训练期间应用类别加权操作。换句话说,给稀少的类更多的权重,但给主要类更少的权重。使用sklearn可以很容易地计算类权重。或者尝试使用过采样和欠采样技术重新采样你的训练集。这也可以帮助提高预测的准确性。
  • 13、选择一个正确的优化器。有许多流行的自适应优化器,如Adam, Adagrad, Adadelta,或RMSprop等。SGD+动量被广泛应用于各种问题领域。有两件事需要考虑:第一,如果你关心快速收敛,使用自适应优化器,如Adam,但它可能会陷入局部极小,提供了糟糕的泛化(下图)。第二,SGD+momentum可以实现找到全局最小值,但它依赖于鲁棒初始化,而且可能比其他自适应优化器需要更长的时间来收敛(下图)。我建议你使用SGD+动量,因为它能达到更好的最佳效果。有三个学习率起点(即1e- 1,1e -3和1e-6)。如果您对预训练模型进行微调,请考虑小于1e-3(比如1e-4)的低学习率。如果您从头开始训练您的网络,请考虑一个大于或等于1e-3的学习率。您可以尝试这些起点,并调整它们,看看哪个是最好的,选择那个。还有一件事,您可以考虑通过使用 Learning Rate Schedulers来降低训练过程中的学习率。这也可以帮助提高网络性能。
  • 14、 除了Learning Rate Schedule 外,即在一定的次数后降低学习率,还有另一种方式,我们可以由一些因素减少学习率,如果验证损loss在某些epoch(比如5)停止改善,减小学习率和如果验证损失停止改善在某些epoch(比如10),停止训练过程。这可以通过在Keras中使用early stop的ReduceLROnPlateau很容易做到。
  • 15、如果您在dense prediction领域工作,如前景分割或语义分割,您应该使用跳过连接,因为对象边界或有用的信息会由于最大池化操作或strided convolutions而丢失。这也可以帮助您的网络轻松地学习特征空间到图像空间的特征映射,有助于缓解网络中的消失梯度问题。
  • 16、数据越多越好!总是使用数据增强,如水平翻转,旋转,缩放裁剪等。这可以帮助大幅度提高精确度。
  • 17、你必须要有一个高速的GPU来进行训练,但是这有点昂贵。如果你想使用免费的云GPU,我推荐使用谷歌Colab。如果你不知道从哪里开始,看看我之前的文章或者尝试各种云GPU平台,如Floydhub或Paperspace等。
  • 18、

在ReLU之前使用最大池化来节省一些计算。由于ReLU阈值的值为0:f(x)=max(0,x)和最大池化只有max激活:f(x)=max(x1,x2,…,xi),使用Conv > MaxPool > ReLU 而不是Conv > ReLU > MaxPool。例如,假设我们有两个从Conv来的激活值(即0.5和-0.5):因此MaxPool > ReLU = max(0, max(0.5,-0.5)) = 0.5和ReLU > MaxPool = max(max(0,0.5), max(0,-0.5)) = 0.5看到了吗?这两个操作的输出仍然是0.5。在这种情况下,使用MaxPool > ReLU可以节省一个max 操作。

19、 考虑采用深度可分离卷积运算,与常规的卷积运算相比,该运算速度快,且参数数量大大减少。Depthwise Separable Convolution:https://arxiv.org/abs/1610.02357

linux 安装tensorflow 记录

一纸辛酸泪……..

安装tensorflow gpu需要先安装cudn 和 cudnn

现在我已经安装好了cudn,nvcc-v 也可以正常显示,但是在/usr/local/文件夹下却没有cuda文件夹.

2.问题由来

通常我们在安装cudnn时,先进行安装cuda,然后下载cudnn文件,通过

tar -xzvf cudnn-10.2-linux-x64-v7.6.5.32.tgz
#命令解压文件,会得到一个cuda文件夹,逐一执行下面的命令进行cudnn的安装
sudo cp cuda/include/cudnn*.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
#完成后,通过下面的命令查看安装情况,如果结果如下图逐行显示版本号,则安装成功
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

在这里插入图片描述
但是现在并没有这个文件夹该如何做呢?

3.问题定位

使用指令

whereis cuda

输出

cuda: /usr/lib/cuda /usr/include/cuda.h

找到了cuda的位置

4.问题原因

之所以在这两个位置是由于,通过sudo apt install nvidia-cuda-toolkit

这种安装方法在/usr/include和/usr/lib/cuda/lib64中安装cuda

5.问题解决

找了cuda的位置后,安装cudnn,将上述指令替换为

tar -xzvf cudnn-10.2-linux-x64-v7.6.5.32.tgz
#命令解压文件,会得到一个cuda文件夹,逐一执行下面的命令进行cudnn的安装
sudo cp cuda/include/cudnn*.h /usr/include/
sudo cp cuda/lib64/libcudnn* /usr/lib/cuda/lib64/
sudo chmod a+r /usr/include/cudnn.h
sudo chmod a+r /usr/lib/cuda/lib64/libcudnn*
#完成后,通过下面的命令查看安装情况,如果结果如下图逐行显示版本号,则安装成功
cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2

注意需要将cuda.h与cudnn.h文件放在同一文件夹下.

nvcc和nvidia-smi显示的cuda版本不一致解释:

nvcc属于cuda的编译器,将程序编译成可执行的二进制文件,nvidia-smi全称是NVIDIA System Management Interface,是一种命令行使用工具,旨在帮助管理和监控NVIDIA GPU设备。

cuda有runtime api和driver api,两者都有对应的cuda版本,nvcc –version显示的就是前者对应的cuda版本,而nvidia-smi显示的是后者对应的cuda版本。

用于支持driver api的必要文件由GPU driver install安装,nvidia-smi就属于这一类API;而用于支持runtime api的必要文件是由cuda toolkit install安装的。nvcc是与cuda toolkit一起安装的cuda compiler-driver tool,它只知道自身构建时的cuda runtime版本,并不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。

cuda toolkit install通常会集成了GPU driver install,如果你的cuda均通过cuda toolkit install来安装,那么runtime api和driver api的版本应该是一致的,也就是说,nvcc -V和nvidia-smi显示的版本正常是一样的,否则你可能使用了单独的GPU driver install来安装GPU driver,这样就会导致nvidia-smi和nvcc -V显示的版本不一样。

通常,driver api的版本能向下兼容runtime api的版本,即nvidia-smi显示的版本大于nvcc -V时通常是可以使用的。

#runtime api就是runfile类型的安装文件,driver api就是deb类型的安装文件。

神经网络和相关算法的简单 PyTorch 实现

github地址:

https://github.com/labmlai/annotated_deep_learning_paper_implementations

这是神经网络和相关算法的简单 PyTorch 实现的集合。这些实现与解释一起记录,

该网站 将这些呈现为并排格式化的注释。我们相信这些将帮助您更好地理解这些算法。

截屏

我们几乎每周都在积极维护这个 repo 并添加新的实现。 更新。

模块:

✨ Transformers

✨ Recurrent Highway Networks

✨ LSTM

✨ HyperNetworks – HyperLSTM

✨ ResNet

✨ ConvMixer

✨ Capsule Networks

✨ Generative Adversarial Networks

✨ Diffusion models

✨ Sketch RNN

✨ Graph Neural Networks

✨ Counterfactual Regret Minimization (CFR)

Solving games with incomplete information such as poker with CFR.

✨ Reinforcement Learning

✨ Optimizers

✨ Normalization Layers

✨ Distillation

✨ Adaptive Computation

✨ Uncertainty

Installation

pip install labml-nn

tmux 使用:linux后台运行程序

最近需要远程在linux服务器跑深度学习代码,因此需要一个后台运行程序,tmux正好满足有需求,记录下tmux的使用方法:

sudo apt-get install tmux

1、终端下常用命令

命令作用
tmux new -s name新建名为name的会话
tmux ls列出所有会话列表
tmux a -t name从终端进入名为name的会话
tmux kill-session -t name销毁名为name的会话
tmux rename -t old_name new_name重命名会话
 tmux detach分离对话

2、tmux会话下常用命令

所有命令都需要先按ctrl+b,激活控制台

命令作用
ctrl+b ?显示所有可用的命令,按q返回
ctrl+b c创建新的窗口,并切换到该窗口
ctrl+b w显示所有窗口列表
ctrl+b p切换到上一个窗口
ctrl+b n切换到下一个窗口
ctrl+b ,重命名当前窗口
ctrl+b &关闭当前窗口
ctrl+b 数字键切换到指定窗口
ctrl+b d暂时断开会话(使用该命令将程序后台运行,关掉终端程序不会停止)
ctrl+b ~列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
ctrl+b :进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器

3、tmux窗格

​ tmux的一个窗口可以被分成多个pane(窗格),可以做出分屏效果。

命令作用
ctrl+b %将当前面板平分为左右两块
ctrl+b “将当前面板平分为上下两块
ctrl+b o切换到下一个窗格
ctrl+b up / down / left / right切换窗格
ctrl+b space对当前窗口下的所有pane重新排列布局,每按一次,换一种样式
ctrl+b z最大化当前pane,再按一次后恢复
ctrl+b x关闭当前使用中的pane,操作之后会给出是否关闭的提示,按y确认即关闭

4、tmux会话下查看历史输出

​ 按 ctrl-b ,就会进入copy mode,然后用PgUp/PgDn来浏览历史输出,按q退出。

综上所述,以下是 Tmux 的最简操作流程。

  1. 新建会话tmux new -s my_session
  2. 在 Tmux 窗口运行所需的程序。
  3. 按下快捷键Ctrl+b d将会话分离。 or 输入 tmux detach
  4. 下次使用时,重新连接到会话tmux attach-session -t my_session

作者:笛猪
链接:https://www.jianshu.com/p/de6f80b6bec0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CVPR 2022|Self-Attention和CNN的优雅集成!清华大学等提出ACmix,性能速度全面提升!

论文链接:https://arxiv.org/pdf/2111.14556.pdf

代码链接:https://github.com/Panxuran/ACmix

预训练模型:https://gitee.com/mindspore/models

Convolution和Self-Attention是两种强大的表征学习方法,它们通常被认为是两种彼此不同的方法。在本文中证明了它们之间存在着很强的潜在关系,因为这两个方法的大部分计算实际上是用相同的操作完成的。具体来说:

  • 首先,证明了具有卷积可以分解成个独立的卷积;
  • 然后,进行移位和求和操作;
  • 再然后,将Self-Attention模块中的query、key和value的投影解释为多个卷积,然后计算注意力权重和value的聚合。

因此,两个模块的第一阶段都包含了类似的操作。更重要的是,与第二阶段相比,第一阶段的计算复杂度(通道的平方)占主导地位。这个观察结果自然地导致了这两个看似不同的范式的优雅集成,即,一个混合模型,它既兼顾Self-Attention和Convolution的优点,同时与Convolution或Self-Attention对应的模型相比,具有更小的计算开销。大量的实验表明,本文方法在图像识别和下游任务上取得了持续改进的结果。

1 简介

近年来,卷积和Self-Attention在计算机视觉领域得到了长足的发展。卷积神经网络广泛应用于图像识别、语义分割和目标检测,并在各种基准上实现了最先进的性能。最近,随着Vision Transformer的出现,基于Self-Attention的模块在许多视觉任务上取得了与CNN对应模块相当甚至更好的表现。尽管这两种方法都取得了巨大的成功,但卷积和Self-Attention模块通常遵循不同的设计范式。传统卷积根据卷积的权值在局部感受野上利用一个聚合函数,这些权值在整个特征图中共享。固有的特征为图像处理带来了至关重要的归纳偏差。相比之下,Self-Attention模块采用基于输入特征上下文的加权平均操作,通过相关像素对之间的相似函数动态计算注意力权重。这种灵活性使注意力模块能够适应地关注不同的区域,并捕捉更多的特征。考虑到卷积和Self-Attention的不同和互补性质,通过集成这些模块,存在从两种范式中受益的潜在可能性。先前的工作从几个不同的角度探讨了Self-Attention和卷积的结合。早期的研究,如SENet、CBAM,表明Self-Attention可以作为卷积模块的增强。最近,Self-Attention被提出作为独立的块来替代CNN模型中的传统卷积,如SAN、BoTNet。另一种研究侧重于将Self-Attention和卷积结合在单个Block中,如 AA-ResNet、Container,而该体系结构限于为每个模块设计独立的路径。因此,现有的方法仍然将Self-Attention和卷积作为不同的部分,并没有充分利用它们之间的内在关系。在这篇论文中,作者试图揭示Self-Attention和卷积之间更为密切的关系。通过分解这两个模块的操作表明它们在很大程度上依赖于相同的 卷积操作。作者基于这一观察结果开发了一个混合模型,名为ACmix,并以最小的计算开销优雅地集成了Self-Attention和卷积。具体地说:

  • 首先,通过使用 卷积对输入特征进行映射,获得丰富的中间特征集;
  • 然后,按照不同的模式(分别以Self-Attention方式和卷积方式)重用和聚合中间特征。

通过这种方式,ACmix既享受了两个模块的优点,又有效地避免了两次昂贵的投影操作。

主要贡献:
  1. 揭示了Self-Attention和卷积之间强大的潜在关系,为理解两个模块之间的联系提供了新的视角,并为设计新的学习范式提供了灵感;
  2. 介绍了Self-Attention和卷积模块的一个优雅集成,它享受这两者的优点。经验证据表明,混合模型始终优于其纯卷积或Self-Attention对应模型。

2 相关工作

卷积神经网络使用卷积核提取局部特征,已经成为各种视觉任务中最强大和最常规的技术。同时,Self-Attention在BERT和GPT3等广泛的语言任务中也表现出普遍的表现。理论分析表明,当具有足够大的容量时,Self-Attention可以表示任意卷积层的函数类。因此,最近有一项研究探讨了将Self-Attention引入视觉任务的可能性。主流方法有两种:

  • 一种是将Self-Attention作为网络中的构建块;
  • 另一种是将Self-Attention与卷积作为互补部分。

2.1 Self-Attention only

一些研究表明,Self-Attention可以成为完全替代卷积操作。最近,Vision Transformer表明,只要有足够的数据,就可以将图像视为由256个token组成的序列,并利用Transformer模型来实现图像识别中的竞争性结果。此外,在检测、分割、点云识别等视觉任务中采用了Transformer范式。

2.2 用注意力提升卷积

先前提出的多种图像注意力机制表明,它可以克服卷积网络局部性的局限性。因此,许多研究者探索使用注意力模块或利用更多的关系信息来增强卷积网络功能的可能性。

  • Squeeze-andExcitation(SE)和Gather-Excite(GE) Reweight每个通道的特征图。
  • BAM和CBAM Reweight 通道和空间位置,以更好地细化特征映射。
  • AA-ResNet通过连接来自另一个独立的Self-Attention的注意力map,增强了某些卷积层。
  • BoTNet用Self-Attention代替卷积。

一些工作旨在通过从更大范围的像素聚集信息,设计一个更灵活的特征提取器。Hu等人提出了一种局部关系方法,根据局部像素的组成关系自适应地确定聚集权值。Wang等人提出了Non-Local网络,通过引入全局像素之间相似性的Non-Local块来增加感受野。

2.3 用卷积提升注意力

随着Vision Transformer的问世,许多基于Transformer的变种已经被提出,并在计算机视觉任务上取得了显著的改进。其中已有的研究主要集中在对Transformer 模型进行卷积运算以引入额外的归纳偏差。

  • CvT在Token过程中采用卷积,并利用卷积来降低Self-Attention的计算复杂度。
  • ViT with convolutional stem提出在早期增加卷积以实现更稳定的训练。
  • CSwin Transformer采用了基于卷积的位置编码技术,并对下游任务进行了改进。
  • Conformer结合Transformer与一个独立的CNN模型集成这两个功能。

3 旧知识回顾

3.1 卷积操作

卷积是现代ConvNets最重要的组成部分之一。首先回顾标准卷积运算,并从不同的角度重新表述它。如图2(a)所示。为简单起见,假设卷积的步长为1。

因此,标准卷积可以概括为2个stages:

图2(a)Stage I:

  • 第一阶段:将输入的feature map从某一位置线性投影,这与标准的1×1卷积相同。
  • 第二阶段:将投影的feature map根据kernel position进行移位,最终聚合到一起。可以很容易地观察到,大多数计算代价是在1×1卷积中执行的,而接下来的位移和聚合是轻量级的。

3.2 Self-Attention操作

注意力机制也被广泛应用于视觉任务中。与传统卷积相比,注意力允许模型在更大的范围内聚焦于重要区域。如图2(b)所示。

图2(b)

  • 第一阶段:使用1×1卷积将输入特征投影为query、key和value;
  • 第二阶段:包括注意力权重的计算和value矩阵的聚合,即聚集局部特征。与第一阶段相比,相应的计算代价较小,与卷积的模式相同。

3.3 Computational Cost

为了充分了解卷积模块和自注意力模块的计算瓶颈,作者分析了每个阶段的浮点运算(FLOPs)和参数数量,总结如表1所示。

结果表明:

  • 对于卷积模块:卷积阶段一的理论FLOPs和参数相对于通道大小C具有二次复杂度,而阶段二的计算代价为线性C,不需要额外的训练参数。
  • 对于自注意力模块:发现了类似卷积的趋势,所有的训练参数都保留在阶段一。对于理论的FLOPs,考虑了一个正常的情况在一个类似ResNet的模型中, 和C=64,128,256,512不同的层深度。结果表明,第一阶段消耗的操作量为 ,并且这种差异随着通道大小的增长而更加明显。

为了进一步验证分析的有效性,作者还总结了在ResNet50模型中卷积和自注意力模块的实际计算成本。实际上,将所有3×3卷积模块的成本加起来,以从模型的角度反映这种趋势。计算结果表明,99%的卷积计算和83%的自注意力在第一阶段,与理论分析相一致。

4 本文方法

4.1 将自注意力与卷积联系起来

前面介绍了对自注意力和卷积模块的分解,从多个角度揭示了更深层次的关系。首先,这两个阶段的作用非常相似。阶段一是一个特征学习模块,两种方法通过执行个卷积来将特征投射到更深的空间,从而共享相同的操作。另一方面,第二阶段对应的是特征聚合的过程。从计算的角度来看,卷积模块和自注意力模块在第一阶段进行的1 × 1卷积都需要理论浮点数和通道大小参数的二次复杂度C。相比较而言,在第二阶段,两个模块都是轻量级的或几乎不需要计算。综上所示,上述分析表明:

  1. Convolution和self-attention在通过1×1 convolutions投影输入feature map的操作上实际上是相同的,这也是两个模块的计算开销;
  2. 虽然对于捕获语义特征至关重要,但第二阶段的聚合操作是轻量级的,不需要获取额外的学习参数。

4.2 自注意力与卷积的整合

上述的观察自然带来了卷积和自注意力的完美结合。由于两个模块共享相同的1×1卷积操作,因此只能执行一次投影,并将这些中间特征映射分别用于不同的聚合操作。于是本文作者提出了如图2(c)所示的混合模块ACmix。

图2(c)具体来说,ACmix依旧包括两个阶段:

  1. 在第一阶段:通过3个1×1卷积对输入特征进行投影,然后reshape为N个Pieces。因此,获得了包含3×N特征映射的一组丰富的中间特征。
  2. 在第二阶段:它们遵循不同的范例。对于自注意力路径,将中间特征集合到N组中,每组包含3个特征,每个特征来自1×1卷积。对应的三个特征图分别作为query、key和value,遵循传统的多头自注意力模块。对于kernel size为k的卷积路径,采用轻全连接层,生成个特征映射。因此,通过对生成的特征进行移位和聚合,对输入特征进行卷积处理,并像传统的一样从局部感受野收集信息。

最后,将两个路径的输出相加,其强度由两个可学习标量控制:

4.3 改进Shift和Summation

如图4.2节和图2所示,卷积路径中的中间特征遵循传统卷积模块中的移位和求和操作。尽管它们在理论上是轻量级的,但向不同方向移动张量实际上破坏了数据局部性,很难实现向量化实现。这可能会极大地损害了推理时的实际效率。

图3作为补救措施,采用固定kernel的深度卷积来代替低效张量位移,如图3 (b)所示。以 移位特征为例,计算为:其中c表示每个输入特征的通道。另一方面,如果表示卷积核(kernel size k = 3)为: 相应的输出可以表示为:因此,对于特定的位移方向,经过精心设计的kernel weight,卷积输出相当于简单张量位移。为了进一步合并来自不同方向的特征的总和,作者将所有的输入特征和卷积核分别串联起来,将移位运算表示为单群卷积,如图3 (c.I)所示。这一修改使模块具有更高的计算效率。在此基础上还引入了一些适应性来增强模块的灵活性。所示在图3 (c.II)中,释放卷积核作为可学习权值,以移位核作为初始化。这提高了模型的容量,同时保持了原有的移位操作能力。还使用多组卷积核来匹配卷积的输出通道维数和自注意力路径,如图3 (c.III)所示。

4.4 ACmix的计算成本

为了更好的比较,在表1中总结了ACmix的FLOPs和参数。

第一阶段的计算成本和训练参数与自注意力相同,且比传统卷积(如3×3 conv)轻。在第二阶段,ACmix引入了额外的计算开销(完全连接层和组卷积),其计算复杂度是线性对通道大小C和相对较小的阶段即实际成本与理论分析ResNet50模型显示了类似的趋势。

4.5 对其他注意力模式的推广

随着自注意力机制的发展,许多研究都集中在探索注意力的变化,以进一步提升模型性能。有学者提出的Patchwise attention将来自局部区域所有特征的信息合并为注意力权重,取代原来的softmax操作。swin-transformer采用的窗口注意力方法在同一局部窗口中保持token的感受字段相同,以节省计算成本,实现快速推理速度。另一方面,ViT和DeiT考虑将长期依赖关系保持在单个层中的全局注意力。在特定的模型体系结构下,这些修改被证明是有效的。在这种情况下,值得注意的是,提出的ACmix是独立于自注意力公式的,并且可以很容易地应用到上述的变体。具体来说,注意力权重可以概括为:

其中[·]表示特征拼接,φ(·)表示具有中间非线性激活的两个线性投影层,Wk(i,j)是每个query token的专门接受字段,W代表整个特征图。然后,计算出的注意力权重可以应用于式(12),并符合一般公式。

5 实验

5.1 ImageNet

分类结果如上图表所示。对于ResNet-ACmix模型优于所有具有可比较的浮点数或参数的Baseline。例如,ResNet-ACmix 26实现了与SASA-ResNet 50相同的top-1精度,但执行次数为80%。在类似的FLOPs案例中,本文的模型比SASA的表现好0.35%-0.8%,而相对于其他Baseline的优势甚至更大。对于SANACmix、PVT-ACmix和Swin-ACmix,本文的模型实现了持续的提升。SAN- acmix 15以80%的FLOPs超过SAN 19。PVT-ACmix-T显示出与PVT-Large相当的性能,只有40%的FLOPs。Swin-ACmix-S以60% FLOPs实现了比Swin-B更高的精度。

5.2 语义分割与目标检测

作者在ADE20K数据集中评估了模型的有效性,并在Semantic-FPN 和UperNet两种分割方法上显示结果。在ImageNet-1K上预训练Backbone。事实证明ACmix在所有设置下都实现了提升。

作者也在COCO上进行了实验。

表3和表4显示了基于resnet的模型和基于Transformer的模型在不同检测head情况下的结果,包括RetinaNet、Mask R-CNN 和 Cascade Mask R-CNN。可以观察到ACmix始终优于具有相似参数或FLOPs的Baseline。这进一步验证了将ACmix转移到下游任务时的有效性。

5.3 消融实验

1、结合两个路径的输出

探索卷积和自注意力输出的不同组合对于模型性能的影响。作者采用了多种组合方法进行实验,结果总结如表6所示。通过用传统的3 × 3卷积代替窗口注意,还展示了仅采用一条路径的模型的性能,Swin-T用自注意力,而Conv-Swin-T用卷积。正如所观察到的,卷积和自注意力模块的组合始终优于使用单一路径的模型。固定所有操作符的卷积和自注意力的比例也会导致性能下降。相比之下,使用学习的参数给ACmix带来了更高的灵活性,卷积和自注意力路径的强度可以根据滤波器在整个网络中的位置自适应调整。

2、Group Convolution Kernels

作者还对组卷积核的选择进行了消融实验,在表7中实证地展示了每种适应的有效性,以及它对实际推理速度的影响。用组卷积代替张量位移,大大提高了推理速度。此外,使用可学习的卷积核和精心设计的初始化增强了模型的灵活性,并有助于最终的性能。

5.5 Bias towards Different Paths

同样值得注意的是,ACmix引入了两个可学习标量α、β来合并来自两个路径的输出。这导致了模块的一个副产品,其中α和β实际上反映了模型在不同深度上对卷积或自注意力的偏向。这里进行了平行实验,图5显示了SAN-ACmix模型和Swin-ACmix 模型中不同层学到的参数α、β。左图和中间图分别显示了自注意力和卷积路径速率的变化趋势。在不同的实验中,速率的变化相对较小,特别是当层更深时。这个观察结果表明,对于不同的设计模式,深度模型具有稳定的偏好。在右边的图中显示了一个更明显的趋势,其中两个路径之间的比率被明确地表示出来。可以看到:

  • 在Transformer模型的早期阶段,卷积可以作为很好的特征提取器。
  • 在网络的中间阶段,模型倾向于利用两种路径的混合,对卷积的偏向越来越大。
  • 在最后阶段,自注意力表现出比卷积更大的优势。这也与之前作品的设计模式一致,即在最后阶段多采用自注意力来代替原来的3×3卷积,早期的卷积被证明对vision transformer更有效。

通过分析α和β的变化发现在深度模型的不同阶段对卷积和自注意力有不同的偏向。参考