最近,加州大学伯克利分校和谷歌的科研团队独特提出了一个概念上非常简单,然而性能很弱小的骨架网络,该网络将自注意力机制纳入了各种计算机视觉工作,包含图像分类、指标检测和实例宰割,指标都有了很大的晋升,该网络叫做 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 torchfrom torch import nnfrom torchvision.models import resnet5from bottleneck_transformer_pytorch import BottleStacklayer = 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/...
我的公众号:算法小哥克里斯,欢送来撩!