包括注意力以及其他等),在自己的数据集上训练,发现平均精度平均值mAP涨点明显。
Transformer它是一种基于自注意机制的深度神经网络,最初应用于自然语言处理领域。Transformer研究人员建议受到强大表达能力的启发Transformer扩展到计算机视觉任务。与其它类型的网络(如卷积网络和循环网络)相比,
卷积神经网络(CNN)引入卷积层和池化层处理图像等位移不变性的数据。递归神经网络(RNN)顺序数据或时间序列数据由循环单元处理。Transformer它是一种主要利用自我注意机制提取内在特征的新型神经网络。在这些网络中,Transformer最近发明的神经网络(2017年)对广泛的人工智能应用具有巨大的潜力。
Transformer最初应用于自然语言处理(NLP)并带来了显著的改进。例如,Vaswani等人首先提出了一项基于注意机制实现机器翻译和英语选区分析的任务Transformer。Devlin等人引入了一个名字BERT新语言表示模型,通过共同限制左右上下文,对未标记文本的翻译器进行预训练。BERT在当时的11个NLP任务上获得了SOTA结果。Brown等人在45TB基于巨型的压缩明文数据预训练Transformer的GPT-该模型有1750亿个参数,在不同类型的下游自然语言任务中实现出色的性能,无需微调。这些基于Transformer该模型显示出强大的表达能力NLP该领域取得了突破。
受NLP中Transformer最近的研究人员将受到功能的启发Transformer扩展到计算机视觉(CV)任务。CNN它曾经是视觉应用的基本组件,但是Transformer显示了它的行为CNN替代品的能力。Chen等人训练一个sequence Transformer自动返回预测像素并与图像分类任务进行分类CNN竞争结果。ViT是Dosovitskiy等人最近提出的Visual Transformer模型。ViT将一个纯粹的transformer直接用于图像块序列,并获得多个图像识别基准SOTA性能。除基本图像分类外,transformer它还用于解决更多的计算机视觉问题,如目标检测、语义分割、图像处理和视频理解。由于其出色的性能,提出了越来越多的基础transformer改进各种视觉任务的模型。
class TransformerLayer(nn.Module): # Transformer layer https://arxiv.org/abs/2010.11929 (LayerNorm layers removed for better performance) def __init__(self, c, num_heads): super().__init__() self.q = nn.Linear(c, c, bias=False) self.k = nn.Linear(c, c, bias=False) self.v = nn.Linear(c, c, bias=False) self.ma = nn.MultiheadAttention(embed_dim=c, num_heads=num_heads) self.fc1 = nn.Linear(c, c, bias=False) self.fc2 = nn.Linear(c, c, bias=False) def forward(self, x): x = self.ma(self.q(x), self.k(x), self.v(x))[0] x x = self.fc2(self.fc1(x)) x return x class TransformerBlock(nn.Module): # Vision Transformer https://arxiv.org/abs/2010.11929 def __init__(self, c1, c2, num_heads, num_layers): super().__init__() self.conv = None if c1 != c2: self.conv = Conv(c1, c2) self.linear = nn.Linear(c2, c2) # learnable position embedding self.tr = nn.Sequential(*[TransformerLayer(c2, num_heads) for _ in range(num_layers)]) self.c2 = c2 def forward(self, x): if self.conv is not None: x = self.conv(x) b, _, w, h = x.shape p = x.flatten(2) p = p.unsqueeze(0) p = p.transpose(0, 3) p = p.squeeze(3) e = self.linear(p) x = p e x = self.tr(x) x = x.unsqueeze(3) x = x.transpose(0, 3) x = x.reshape(b, self.c2, w, h) return x class SwinTransformerBlock(nn.Module): def __init__(self, c1, c2, num_heads, num_layers, window_size=8): super().__init__() if c1 = c2: self.conv = Conv(c1, c2) # remove input_resolution self.blocks = nn.Sequential(*[SwinTransformerLayer(dim=c2, num_heads=num_heads, window_size=window_size, shift_size=0 if (i % 2 == 0) else window_size // 2) for i in range(num)]) def forward(self, x): if self.conv is not None: x = self.conv(x) x = self.blocks(x) return x