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都是用固定大小的位置编码,这样对处理任意大小的图像不友好。
  • 计算量还是大

网络分析

主题结构还是承接上文,大框架如下(已经在上篇博文详细解析了输入到输出的变化,主体结构不再赘述):
Transformer主干网络——PVT_V2保姆级解析_第1张图片

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

Transformer主干网络——PVT_V2保姆级解析_第2张图片

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

Transformer主干网络——PVT_V2保姆级解析_第3张图片

linear SRA(动机三)

这个更简单了,就是把上一篇博客中说的SRA结构中的卷积降低分辨率的操作换成了池化加卷积来进行,这样可以节省计算量。
Transformer主干网络——PVT_V2保姆级解析_第4张图片
这里感觉作者为了突出改动,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,transformer,网络,深度学习,PVT2,VIT)