【论文笔记】Conditional Positional Encodings for Vision Transformers

论文标题:

Conditional Positional Encodings for Vision Transformers

Vision Transformer 的条件位置编码

论文链接:https://arxiv.org/abs/2102.10882v2

论文代码:https://github.com/Meituan-AutoML/CPVT

发表时间:2021年3月 


创新点

1、提出条件位置编码(CPE)方案

2、基于 CPE,提出基于条件位置编码的 Vision Transformer 架构(CPVT)


Abstract

我们为 ViT 提出了条件位置编码 (CPE) 方案。与以前的固定或可学习的位置编码不同,它们是预先定义的并且独立于输入标记,CPE 是动态生成的,并且以输入标记的本地邻域为条件。因此,CPE 可以很容易地泛化到比模型在训练期间看到的更长的输入序列。此外,CPE 可以在图像分类任务中保持所需的平移不变性,从而提高分类精度

CPE 可以通过简单的位置编码生成器 (PEG) 轻松实现,并且可以无缝地整合到当前的 Transformer 框架中。基于 PEG,我们提出了条件位置编码视觉转换器 (CPVT)。我们证明 CPVT 与具有学习位置编码的注意力图相比具有视觉上相似的注意力图。受益于条件位置编码方案,我们在 ImageNet 分类任务上获得了迄今为止与视觉 Transformer 相比最先进的结果

详解:CPE 本质解决的问题就是提高了分割后的小图片的空间信息,由于将图片分割成小图片后,排成一排输入进 Transformer 中时,会失去原本的图片的空间信息,最开始的位置编码,并不能完美的解决这个问题,而修改后的条件编码,一定程度上解决了这个问题


Method

图(a):传统的 Vision Transformer

图(b):增加了条件位置编码的 Vision Transformer 即本文提出的 CPVT

图(c):基于 CPVT 的基础上,增加一个全局平均池化 GAP 优化了 CPVT 的性能

注释:

1)PE         位置编码

2)PEG      条件位置编码

3)GAP      全局平均池化

PEG架构

分割原图像,产生的小块图像进行 feature tokens,再 reshape 成二维数据(蓝色),再基于一个 F 函数进行转换(绿色)尺寸不变,再分割成小块,输入进 Transformer 中,其中 F 函数,即为条件

注释:

本质上可以简单理解为,F 函数是一个二维卷积,这里强调是二维卷积,而不是三维卷积,因为首先进行分割,再将分割后的特征进行了扁平化,所以是二维的(如果直接对图片使用卷积,那卷积核应该是三维的)

为什么使用二维卷积就变成了条件位置编码呢?

这是因为,卷积操作大家都能理解,卷积核尺寸越大(例如 3*3),则包含的周边信息越多,则可以理解为,将原图像的顺序排列的特征具有了空间信息,因此信息包含更多,则能很好的提高准确率,是本文的关键理解

GAP架构

本质上是一个全局平均池化,相当于一个奖励,试验结果表明,其提高了性能


Experiments

CPVT 架构变体:

较大的模型 CPVT-B 具有与 ViT-B 和 DeiTB 相同的架构

CPVT-S 和 CPVT-Ti 分别具有与 DeiT-small 和 DeiT-tiny 相同的架构


实验目标:CPVT 中提出的 PEG 可以直接推广到更大的图像尺寸,而无需任何微调

实验结果:在 224*224 图像上训练的 CPVT,应用到 384*384 上,效果相近,无需微调


实验目标:验证 GAP 是否可以提高性能

实验结果:提高性能


实验目标:与最先进方法的比较

实验结果:CPVT 模型具有更好的 top-1 精度


实验目标:在 ImageNet 上使用 DeiT-tiny 架构的不同 PEG 的位置的性能对比

实验结果:当 PEG 放置在 [0, 3] 时,我们的方法显示出强大的性能


实验目标:不同卷积内核的性能

实验结果:27*27 的效果更好

写在最后

CNN + Transformer 的架构是否可以成为 SOTA 呢?

值得期待!

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个警告是由ESLint的规则`no-unneeded-ternary`引起的,它表示在默认赋值时使用条件表达式是不必要的。 在上面的代码示例中,可以看到在`filterItems`方法中使用了条件表达式来处理空字符串的情况。然而,根据该警告,使用条件表达式是不必要的,因为我们可以直接使用简单的赋值操作来实现相同的效果。 要解决这个警告,你可以将条件表达式改为简单的赋值操作。 下面是修改后的代码示例: ```vue <template> <div> <q-select v-model="selectedItem" :options="filteredItems" option-label="label" option-value="value" :filter="filterItems" input-debounce="300" placeholder="Search" /> </div> </template> <script> export default { data() { return { selectedItem: '', items: [ { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' }, { label: 'Option 3', value: 'option3' }, // 其他选项... ], filteredItems: [] }; }, methods: { filterItems(val, update) { if (val === '') { update(() => { this.filteredItems = []; }); } else { const lowercaseVal = val.toLowerCase(); this.filteredItems = this.items.filter(item => item.label.toLowerCase().includes(lowercaseVal) ); } } } }; </script> ``` 在修改后的代码中,我们移除了条件表达式,并直接在`if`语句的分支中进行赋值操作。这样可以避免不必要的条件表达式。 通过这种方式,我们可以消除ESLint警告,并且代码逻辑仍然保持一致。 希望这个解决方案对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自γ星的赛亚人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值