Transformer主干网络——PVT_V2保姆级解析

前言

论文地址: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显存准召
1resnet50384*22464*8卡v100-45min10GB89.6/50.0
2pvt_v2_b5384*22464*8卡v100-100min30GB89.7/55.0
pvt_v2_b5224*22464*8卡v100-60min18GB89.7/53.0
3pvt_v2_b4384*22464*8卡v100-100min30GB89.5/54.3
  • 19
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

只会git clone的程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值