论文地址:PVT2
代码地址:github
Transformer主干网络——ViT保姆级解析
Transformer主干网络——DeiT保姆级解析
Transformer主干网络——T2T-ViT保姆级解析
Transformer主干网络——TNT保姆级解析
Transformer主干网络——PVT_V1保姆级解析
Transformer主干网络——PVT_V2保姆级解析
Transformer主干网络——Swin保姆级解析
Transformer主干网络——PatchConvNet保姆级解析
持续更新…
出发点:对PVT1进行优化
主题结构还是承接上文,大框架如下(已经在上篇博文详细解析了输入到输出的变化,主体结构不再赘述):
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有相似的思想,但是实现更简单。
作者说他直接把位置编码给移除了,然后引入了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
这个更简单了,就是把上一篇博客中说的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 |