最近,加州大学伯克利分校和谷歌的科研团队独特提出了一个概念上非常简单,然而性能很弱小的骨架网络,该网络将自注意力机制纳入了各种计算机视觉工作,包含图像分类、指标检测和实例宰割,指标都有了很大的晋升,该网络叫做 BoTNet(Bottleneck Transformer)。
为什么要应用 BoTNet?设计思维
近年来,卷积骨架网络在计算机视觉的各个领域获得了十分大的停顿,这得益于卷积可能无效捕获图像中部分的信息,然而对于实例宰割、指标检测和关键点检测之类的视觉工作,须要对长期的依赖进行建模。
一、为什么要引入注意力机制?传统基于卷积的体系结构,须要重叠很多个卷积层,以全局汇总捕获部分信息的计算结果。只管重叠更多的层可能可能进步这些骨架网络的性能,然而显式的对全局依赖性进行建模可能是一种更弱小且更具扩展性的解决方案。
二、为什么不全副替换成注意力机制?指标检测畛域的输出图像(1024 像素)相比于图像分类(224 像素)来说十分大。而对于自注意力机制,耗费的显存和计算量与输出的大小成 4 倍增长,导致训练和测试效率太低,不切实际。
因而,作者提出利用自注意力机制来替换 ResNet 的最初三个 BottleNeck Layer,这样的构造,应用卷积提取图像中部分的信息,而后利用自注意力机制来对全局的依赖性进行建模,可能解决上述的两个问题。
网络设计
Bottleneck Transformer
该所提办法基于 ResNet 网络,与 ResNet 的惟一区别,是在 c5 中,将 3×3 卷积替换成了 MHSA(Multi-Head Self Attention)构造。能够看到,参数量相比于 ResNet 缩小了 18.4%,加乘操作的数量减少了 20%。
试验局部
作者在实例宰割和指标检测上进行了试验。
相比 ResNet,晋升了 COCO 实例宰割上的性能
其中,R50 代表 ResNet-50。
绝对的地位编码可能晋升性能
MHSA 层中有两种交互:内容和内容的交互(qk^T),以及内容和地位的交互(qr^T)。而应用绝对地位进行交互,带来的性能晋升是非常明显的。
三个卷积都替换成 MHSA 吗?
c5 中有三个卷积层,作者进行融化试验,来看是否须要三个都替换成 MHSA
论断是:三个卷积层全都替换,在小指标上成果十分好,然而大指标上成果就不太行了。作者说这可能是优化得不好,把这个留给了将来工作。
通过替换引入了全局依赖,那么性能是否与更深的卷积网络相当?
随着卷积网络的一直加深,更容易关注到全局的信息。而应用自注意力机制间接就关注的是全局的信息,所以说应用自注意力的网络不那么深,也可能达到相似的性能。作者通过试验也阐明了这一点。
通过上表,咱们能够看出,当配置是 [0,1,1] 时,BoT 50 的成果要好于 R101 的成果。
能够得出结论:替换为自注意力比卷积的重叠更加无效。
BoTNet 能够晋升所有 ResNet 家族网络的性能
这里就是减少了 152 层的 ResNet 的后果,性能也有肯定的晋升。
除此之外,作者还进行了十分多具体的试验,有趣味的能够参考原论文。
应用形式
这里官网都为咱们实现好了,话不多说,间接上代码。这个实现形式是基于 PyTorch 的,基于 TensorFlow 的代码在最上面有。
装置
pip install bottleneck-transformer-pytorch
应用
import torch
from torch import nn
from torchvision.models import resnet5
from bottleneck_transformer_pytorch import BottleStack
layer = BottleStack(
dim = 256, # 输出通道数
fmap_size = 56, # 对于 imagenet 224 x 224 的图,特色图大小为 56 x 56
dim_out = 2048, # 输入通道数
proj_factor = 4, # 压缩通道的倍数,压缩后的通道数 = 输出通道数 / proj_factor
downsample = True, # 第一层是否下采样
heads = 4, # MHSA 的头数
dim_head = 128, # 每个头的维度,默认 128 维
rel_pos_emb = False, # 是否应用绝对的地位嵌入
activation = nn.ReLU() # 激活函数)
resnet = resnet50() # 定义 ResNet 模型
backbone = list(resnet.children())
# 批改 ResNet 模型的最初几层
model = nn.Sequential(*backbone[:5],
layer,
nn.AdaptiveAvgPool2d((1, 1)),
nn.Flatten(1),
nn.Linear(2048, 1000)
)
# 应用“BotNet”img = torch.randn(2, 3, 224, 224)
preds = model(img) # (2, 1000)
是否有开源预训练模型?
大家晓得,训练注意力模型须要十分大的显存,原始论文是应用 TPU 进行训练的,然而很遗憾,目前并没有公开的预训练模型。
参考资料:
- 原始论文:https://arxiv.org/abs/2101.11605
- TensorFlow 1 实现:https://gist.github.com/aravindsrinivas/56359b79f0ce4449bcb04ab4b56a57a2
- PyTorch 实现:https://github.com/lucidrains/bottleneck-transformer-pytorch/blob/main/bottleneck_transformer_pytorch/bottleneck_transformer_pytorch.py
写在前面:对于 BotNet 的介绍就到这里了,如果感觉这篇文章对您有帮忙,欢送三连反对我,谢谢!
我的知乎:https://www.zhihu.com/people/…
我的公众号:算法小哥克里斯,欢送来撩!