前言

论文地址:PVT2
代码地址:github

系列文章

Transformer主干网络——ViT保姆级解析
Transformer主干网络——DeiT保姆级解析
Transformer主干网络——T2T-ViT保姆级解析
Transformer主干网络——TNT保姆级解析
Transformer主干网络——PVT_V1保姆级解析
Transformer主干网络——PVT_V2保姆级解析
Transformer主干网络——Swin保姆级解析
Transformer主干网络——PatchConvNet保姆级解析
持续更新…

动机

出发点:对PVT1进行优化

  • vit和pvt_v1对图像用4*4大小的patch进行编码,这样忽略了一定的图像局部连续性。
  • vit和pvt_v1都是用固定大小的位置编码,这样对处理任意大小的图像不友好。
  • 计算量还是大

网络分析

主题结构还是承接上文,大框架如下(已经在上篇博文详细解析了输入到输出的变化,主体结构不再赘述):

加强patch之间的联系(动机一)

1、针对PVT_V1的patch emb模块,作者将原来的卷积操作进行了修改:
修改之前:
self.proj = nn.Conv2d(in_chans=3, embed_dim=64, kernel_size=4, stride=4)
修改之后:
self.proj = nn.Conv2d(in_chans=3, embed_dim=64, kernel_size=7,stride=4,padding=(3, 3))这样修改之后的patch emb输入是(1,3,224,224)输出还是(bs,channal,56,56)和原来用步长为4大小为4的卷积核卷积的结果一致。不一致在于编码图像结合了每个patch和上下左右相邻的patch信息。从上图下部分可看出。感觉和Swin有相似的思想,但是实现更简单。

卷积feed forward(动机二)

作者说他直接把位置编码给移除了,然后引入了0填充位置编码(没看懂这是啥意思…),然后在feed forward的结构里加上了DW卷积。这个操作应该是参考别的论文得到的,论文对应如下,回头再看看为啥这么搞:
(2022年6月1号,看懂了这里啥意思了,zeropadding的意思就是给特征图外面加一圈padding,padding的值是0,作者在pvtv2把位置编码给去掉了,在下述参考文献得出的结论是卷积层可以根据特征图外圈的0学习到特征图的轮廓信息,换句话说可以学习到一些绝对位置信息,因此可以用DW卷积来建模位置信息并且减少计算量。所以作者去掉了位置编码换成了在FeedForward加卷积!)

[1] Md. Amirul Islam, Sen Jia, and Neil D. B. Bruce. How much
position information do convolutional neural networks encode? In Proceedings of the International Conference on
Learning Representations, 2020. 2
[2] Xavier Glorot and Yoshua Bengio. Understanding the diffi-
culty of training deep feedforward neural networks. In Proceedings of the thirteenth international conference on artifi-
cial intelligence and statistics, 2010. 3
[3]Xiangxiang Chu, Zhi Tian, Bo Zhang, Xinlong Wang, Xiaolin Wei, Huaxia Xia, and Chunhua Shen. Conditional positional encodings for vision transformers. arXiv preprint
arXiv:2102.10882, 2021. 2

linear SRA(动机三)

这个更简单了,就是把上一篇博客中说的SRA结构中的卷积降低分辨率的操作换成了池化加卷积来进行,这样可以节省计算量。

这里感觉作者为了突出改动,PVT2的结构只画出了池化,看代码其实还是先池化后卷积的,所以并没有丢弃卷积。
代码对应:

print(x.shape) # [1, 3136, 64]
x_ = x.permute(0, 2, 1).reshape(B, C, H, W)
print(x_.shape) # [1, 64, 56, 56]
x_ = self.pool(x_)
print(x_.shape) # [1, 64, 7, 7]
x_ = self.sr(x_)
print(x_.shape) # [1, 64, 7, 7]
x_ = x_.reshape(B, C, -1)
print(x_.shape) # [1, 64, 49]
x_ = x_.permute(0, 2, 1)
print(x_.shape) # [1, 49, 64]第一步把输入的x从tokens还原成二维,且完整shape为(bs,channal,H,W)
第二步经过尺寸为7的池化层
第三步经过卷积层
第四步至最后:还原成(1,H*W,dim)

需要注意的是,在PVTv2中只有pvt_v2_b2_li作者用了这个linear SRA,而作者发布的最好的模型pvt_v2_b5是没用这个linear SRA的,所以主要涨点的贡献来自于动机一用更大尺寸的卷积核加强patch之间的联系。由此可见对于图像的任务,patch间的关系还是很重要的,针对patch emb应该还有更好的方法!

实验

个人数据(300W)实验了一下分类的效果,待测推理速度…

实验 模型 size 训练时间/epoch 显存 准召
1 resnet50 384*224 64*8卡v100-45min 10GB 89.6/50.0
2 pvt_v2_b5 384*224 64*8卡v100-100min 30GB 89.7/55.0
pvt_v2_b5 224*224 64*8卡v100-60min 18GB 89.7/53.0
3 pvt_v2_b4 384*224 64*8卡v100-100min 30GB 89.5/54.3

Transformer主干网络——PVT_V2保姆级解析相关推荐

  1. Transformer主干网络——ViT保姆级解析

    前言 最近准备跑点主干网络的实验,transformer在cv都杀疯了,整理下最近这些网络的发展以及创新点.从"万恶之源"ViT开始吧. 系列文章 Transformer主干网络- ...

  2. Transformer主干网络——DeiT保姆级解析

    前言 这篇文章是基于蒸馏的方法,提高ViT的性能,根据最近transformer相关文章的实验对比以及引用可以发现,这篇文章基本上是ViT以后出现的比较早的文章了. 系列文章 Transformer主 ...

  3. Transformer主干网络——T2T-ViT保姆级解析

    前言 论文地址:paper 代码地址:github 系列文章 Transformer主干网络--ViT保姆级解析 Transformer主干网络--DeiT保姆级解析 Transformer主干网络- ...

  4. 何恺明团队新作ViTDet:用于目标检测的视觉Transformer主干网络

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 转载自:机器之心 | 编辑:张倩.小舟 做目标检测就一定需要 FPN 吗?昨天,来自 Facebook AI ...

  5. Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计

    仅作学习交流~包含重点翻译,要点归纳,部分扩展 论文地址 GitHub - ygjwd12345/TransDepth: Code for Transformers Solve Limited Rec ...

  6. [YOLOv7/YOLOv5系列算法改进NO.21]CNN+Transformer——主干网络替换为又快又强的轻量化主干EfficientFormer

     ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法.此后的系列文章,将重点对YOLOv ...

  7. 家庭全光纤万兆网络搭建保姆级攻略

    随着时代的进步,万兆设备已经降价到可以被家庭用户接受的程度了,所以部分家庭已经开始考虑10G甚至40G的光网了,但是从电网到光网,有很多不一样的部分. 分名词.设备.施工三部分,光网需要注意的部分全覆 ...

  8. Vision Transformer(VIT)代码分析——保姆级教程

    目录 前言 一.代码分析 1.1.DropPath模块 1.2.Patch Embeding 1.3.Multi-Head Attention 1.4.MLP 1.5.Block 1.6.Vision ...

  9. 37、记录使用 Swin Transformer主干网络去实现分类,并转化NCNN、TNN、MNN模型以及部署

    基本思想:最近手中有个swim transformer模型,想移植手机端进行推理一下,随手记录一下遇到的问题涉及简单的转ncnn tnn mnn的流程性问题 一.首先我fork了大佬的代码https: ...

最新文章

  1. VS恢复默认设置的2种方法
  2. ngx_lua_module-1.0.5.0 (LUA编写网页脚本,支持windows和linux)
  3. Web模糊测试工具Powerfuzzer
  4. .jsp与servlet之间页面跳转及参数传递实例
  5. 微服务实战(二):使用API Gateway--转
  6. python 粒子滤波目标追踪_Python实现基于相关滤波的单目标跟踪算法
  7. 盒马鲜生,快而准确的秘密!
  8. 深度学习可以与大数据分手吗?
  9. kafka可视化客户端工具(Kafka Tool)的使用
  10. [转载] python 闭包和装饰器详解
  11. Jmeter html 报告中添加90% line time
  12. Java并发:线程间数据传递和交换
  13. 第二章:用Python对不同的商品销售数据进行预测分析
  14. 课题:交通标志识别——设计思路与实现步骤记录
  15. GIS公司的主要业务
  16. 架构 BitTorrent BT服务器
  17. oracle-DDL对表的操作
  18. 电脑彻底删除的文件如何恢复?
  19. Mac快捷键及手势基本操作
  20. hive插件 ranger_Ranger Hive-HDFS ACL同步

热门文章

  1. chosen宽度太小
  2. 解决keras安装失败
  3. python自动游戏脚本_[python游戏脚本]我想用Python写一个游戏脚本,自动点击排队!...
  4. linux普通用户libusb访问usb,linux – 使用libusb-1.0作为非root用户访问USB设备
  5. windows下初始化格式化磁盘
  6. 安卓音视频开发,字节跳动Android实习面试凉凉经,年薪超过80万!
  7. Objective Quality Assessment of Tone-Mapped Images
  8. 20080117 - FE足球队总结及新年展望
  9. 【推荐系统->相似度】Cos相似度与皮尔逊相似度及其关联
  10. 一个困扰许久的Word嵌入文档问题(求助)