常见的Transformer变体介绍

常见的Transformer变体介绍

当谈到深度学习领域的重要里程碑时,Transformer模型无疑是一个不可忽视的巨大飞跃。最初由Vaswani等人于2017年提出,Transformer原本是为了处理自然语言处理任务而设计的,但其独特的架构和强大的能力很快吸引了其他领域的关注,其中之一就是视觉领域。

Transformer模型之所以在视觉领域引起关注,部分原因在于其自注意力机制的独特设计。这种机制允许模型在处理序列数据时能够同时考虑不同位置之间的关系,无论是文本中的单词还是图像中的像素。这种能力在图像中变得尤为强大,使得模型能够捕捉到全局和局部之间的复杂关系,同时具备处理遮挡、尺度变化和几何变换等挑战的能力。

本篇博客将深入探讨Transformer在视觉领域的应用,介绍一些令人兴奋的变体模型以及它们在图像理解和处理方面的优势。无论您是深度学习的研究者、开发者,还是对计算机视觉感兴趣的读者,都将从这些内容中获得启发和新知。让我们一同进入Transformer变体的精彩世界,揭示其在视觉领域的无限潜力。

1、VIT

ViT的首要意义就是将Transformer成功应用于计算机视觉任务,如图像分类、目标检测等。为研究人员提供了一种新的思路,即在计算机视觉任务中探索更多基于自注意力机制的模型设计

在分割任务中,ViT可以被用作特征提取器,将图像编码为特征向量,然后通过后续的分割头进行像素级别的预测,将图像中的每个像素分类到不同的语义类别中。

ViT会将输入图像分成一个个小的图像块(patches),并将每个图像块展平为一个向量,然后利用Transformer编码器学习全局特征和依赖关系。这种方法的优势在于,ViT能够利用自注意力机制来处理整个图像,而不是仅关注局部区域,从而提高了图像理解的能力。

在这里插入图片描述

上图就是VIT模型的整体框架,由以下几个部分构成:

  1. 输入图像切分: 首先,将输入的图像分割成一系列的固定大小的图像块(通常是16x16或32x32的小图像块)。每个图像块将被看作一个序列元素。
  2. 嵌入层(Embedding Layer): 每个图像块通过一个嵌入层进行编码,将每个像素的特征表示转换为更高维的嵌入向量。这些嵌入向量将作为输入序列送入Transformer模型。
  3. 位置编码(Positional Encoding): 与传统Transformer类似,ViT模型在输入序列中引入位置信息。这是通过添加位置编码向量到每个图像块的嵌入向量中来实现的,从而使模型能够理解图像中的空间关系。
  4. Transformer Encoder: 接下来,ViT模型使用一层或多层的Transformer编码器来处理输入序列。每个编码器由多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Neural Network)两部分组成。
    • 多头自注意力机制: 用于捕捉序列中不同位置之间的关系,特别是在图像块之间建立联系。它允许模型在处理每个图像块时能够关注其他图像块的信息,从而捕获全局的语义信息。
    • 前馈神经网络: 用于对每个图像块的特征进行非线性变换,以增强特征的表示能力。
  5. 池化和分类层: 在经过一系列Transformer编码器后,ViT模型通常会采用全局平均池化(Global Average Pooling)来聚合所有图像块的信息,生成整体图像的特征表示。最后,将这些特征送入一个全连接层进行分类预测。

ViT模型的关键创新在于将图像块转化为序列数据,并利用Transformer的自注意力机制来捕获图像中的全局和局部信息。这使得ViT能够在一定程度上摆脱传统卷积神经网络的限制,对遮挡、尺度变化和位置变换等问题具有一定的鲁棒性。

代码地址:https://github.com/li-tie-zhu/deeplearningCode

我们采用用kaggle上的skinLesions作为数据集,运行得到的实验结果:

在这里插入图片描述

对比ResNet模型

在这里插入图片描述

这两个模型在测试准确度和损失值上表现相似,但是从实验结果和异常值来看,VIT模型在skinlesions数据集的效果更好一点。

2、SwimTransformer

Swim Transformer是特为视觉领域设计的一种分层Transformer结构。Swin 的两大特性是滑动窗口和分层表示。滑动窗口在局部不重叠的窗口中计算自注意力,并允许跨窗口连接。分层结构允许模型适配不同尺度的图片,并且计算复杂度与图像大小呈线性关系,也因此被人成为披着transformer皮的CNN。

SwimTransformer主要解决了一下几个问题:

1、与NLP领域不同,视觉领域同类的物体,在不同图像上/同一图像上的尺度会相差巨大,同一张多行人图中,行人会有大有小,有近有远,同一语义下的不同目标可能尺度差距变化会很大,模型提出了一种层级式网络结构,解决视觉图像的多尺度问题,提供各个尺度的维度信息。

2、相较于文本,图像的尺寸过大,计算复杂度较高,模型提出Shifted Windows移动窗口,带来了更大的效率,移动操作让相邻窗口得到交互,极大降低了transformer的计算复杂度;

3、计算复杂度从二次增长降为线性增长,极大的节省的计算成本

SwimTransformer主要操作:

1、窗口自注意力W-MSA:像ViT的全局自注意力的计算会导致平方倍的复杂度,为了减少计算量,它提出用窗口的方式去做自注意力,即在由多个patch组成的窗体中应用自注意力机制。如下图中的Layerl所示,一个窗口由4$\times$4的patch块构成,然后单独对这个窗口进行自注意力机制。

2、移动窗口自注意力SW-MSA:transformer初衷是理解上下文,是一种信息的传递交互,采用W-MSA模块时,只会在每个窗口内进行自注意力计算,所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,我们可以将窗口移动,以获得全局的信息。如下图中的Layerl+1所示,在L1时每个窗口里的patch只能和同一个窗口里的patch相互学习,而到了L1+1层时,由于窗口的移动,导致一些patch进入新的窗口,这些带有上一层窗口信息的patch可以和别的带有上一层前窗口信息的patch相互学习。这就是跨窗连接操作,使得窗口与窗口之间有着交互。再结合合并Patch Merging操作,在最后几层的时候,每个patch已经与特征图绝大部分的patch有过交流,也就是感受野已经很大了可以看见图片的绝大部分了。这些局部注意力信息最终会扩散到全局,变相达到全局注意力的效果。

在这里插入图片描述

3、Patch Merging: 通过将相邻的图像块之间的特征合并在一起,以建立图像块之间更广泛的联系。这样做的目的是让模型能够更好地捕获图像中不同尺度和位置的特征,从而提高模型的感知范围。Swim-Transformer 使用 Patchmerging 进行全局信息的整合。具体来说,Patchmerging 通过在嵌入向量上执行类似于池化操作的步骤,将相邻的补丁合并成更大的区域。

在这里插入图片描述

模型整体框架理解:

在这里插入图片描述

  1. Patch Partition: Swim-Transformer 的输入是一张图像。首先,将输入图像划分成多个重叠的小块,也称为补丁。每个补丁捕获图像的局部信息。

  2. Linear Embedding: 每个补丁通过一个嵌入层进行编码,将图像块中的像素转换为嵌入向量。这些嵌入向量将作为 Transformer 模型的输入。

  3. Swim Transformer Block: Swin Transformer Blocks有两种结构,区别在于窗口多头自注意力的计算一个使用了W-MSA结构,一个使用了SW-MSA结构。而且这两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。所以堆SwinTransformer Block的次数都是偶数。

  4. **输出头:**作者这个图里并没有画,因为 Swin Transformer的本意并不是只做分类,它还会去做检测和分割,所以说它只画了backbone的部分,没有去画最后的分类头或者检测头

3、Deformable Attention Transformer

Deformable Attention Transformer"是一种基于注意力机制的变体 Transformer 架构,专注于解决图像处理任务中的特征建模和关系捕捉问题。该模型引入了可变形注意力(Deformable Attention)机制,允许模型在进行特征对齐和关系建模时更加灵活和精细地调整注意力权重。

感受野赋予 Transformer 模型比 CNN 模型更高的表示能力。然而,简单地扩大感受野也会引起一些担忧。一方面,使用密集注意力,例如在 ViT 中,会导致过多的内存和计算成本,并且特征可能会受到超出感兴趣区域的无关部分的影响。另一方面PVT 或SwinTransformer 中采用的稀疏注意力与数据无关,可能会限制对远程关系建模的能力。

为了缓解这些问题,我们提出了一种新颖的可变形自注意力模块,其中以数据相关的方式选择自注意力中键和值对的位置。如下图所示,对于每个注意模块,参考点首先生成为统一的网格,这些网格在输入数据中是相同的。然后,偏移网络以查询特征为输入,为所有参考点生成相应的偏移量。通过这种方式,候选键/值被转移到重要的区域,从而以更高的灵活性和效率增强了原始的自我注意模块,以捕获更多信息的特征。

在这里插入图片描述

Deformable attention module

在这里插入图片描述

如图 (a) 所示,给定输入特征图 x ∈ R H × W × C R^{H×W×C} RH×W×C ,生成点 p ∈ $R^{ H_G×W_G×2} 的均匀网格作为参考。具体来说,网格大小是从输入特征图大小按因子 r 下采样的, 的均匀网格作为参考。具体来说,网格大小是从输入特征图大小按因子 r 下采样的, 的均匀网格作为参考。具体来说,网格大小是从输入特征图大小按因子r下采样的,H_G $ = H/r, W G W_G WG = W/r。参考点的值是线性间隔的 2D 坐标 {(0, 0), . 。 。 ,($H_G $− 1, W G W_G WG − 1)},然后根据网格形状 HG × WG 将它们标准化到范围 [−1, +1],其中 (−1, −1) 表示左上角,(+1,+1) 表示右下角。为了获得每个参考点的偏移量,特征图被线性投影到查询标记 q=x W q W_q Wq,然后输入到轻量级子网络 θoffset(·) 中以生成偏移量 Δp = θ o f f s e t ( q ) θ_{offset}(q) θoffset(q)。为了稳定训练过程,我们通过一些预定义的因子 s 来缩放 Δp 的幅度,以防止偏移过大,即 Δp ←stanh (Δp)。然后在变形点的位置对特征进行采样作为键和值,然后是投影矩阵:
q = x W q , k ‾ = x ‾ W k , v ‾ = x ‾ W v , w i t h ∆ p = θ o f f s e t ( q ) , x ‾ = φ ( x ; p + ∆ p ) . q =xWq,\overline{k} = \overline{x}Wk, \overline{v} = \overline{x}Wv, with ∆p = θoffset(q), \overline{x} = φ(x; p + ∆p). q=xWq,k=xWk,v=xWv,withp=θoffset(q),x=φ(x;p+p).
其中 k ‾ 和 v ‾ \overline{k}和\overline{v} kv分别表示变形后的键和值嵌入。具体来说,文章将采样函数 φ(·;·) 设置为双线性插值以使其可微:

φ ( z ; ( p x , p y ) ) = ∑ ( r x , r y ) g ( p x , r x ) g ( p y , r y ) z [ r y , r x , : ] φ (z; (p_x, p_y))= \sum\limits_{(r_x,r_y)}g(p_x, r_x)g(p_y, r_y)z[r_y, r_x, :] φ(z;(px,py))=(rx,ry)g(px,rx)g(py,ry)z[ry,rx,:]

然后与现有方法类似,我们对 q、k、v 进行多头注意力并采用相对位置偏移 R。注意力头的输出表示为:

z ( m ) = σ ( q ( m ) k ‾ ( m ) T / d + φ ( B ‾ ; R ) v ‾ z^{(m)}=\sigma{(q^{(m)}\overline{k}^{(m)T}/\sqrt{d}+φ{(\overline{B};R)}}\overline{v} z(m)=σ(q(m)k(m)T/d +φ(B;R)v

每个头的特征连接concat在一起并通过 Wo 投影以获得最终输出 z。

Offset generation

如上图所示:偏移生成采用一个子网络,该子网络消耗查询特征并分别输出参考点的偏移值。考虑到每个参考点覆盖一个局部s × s区域(s为偏移量的最大值),生成网络还应具有对局部特征的感知,以学习合理的偏移量。因此,我们将子网络实现为两个具有非线性激活的卷积模块,如图(b)所示。输入特征首先通过5×5深度卷积来捕获局部特征。然后采用GELU激活和1×1卷积得到二维偏移量。同样值得注意的是,1 × 1卷积中的偏差被降低,以减轻所有位置的强制移位。

模型整体框架理解:

在网络架构方面,变形注意变压器模型具有金字塔结构,广泛适用于需要多尺度特征映射的各种视觉任务。如上图所示,首先对形状为H × W × 3的输入图像进行步幅为4的4×4非重叠卷积嵌入,然后进行归一化层,得到h / 4 × w / 4 × C 的斑块嵌入。以构建分层特征金字塔为目标,主干包括四个阶段,步幅逐渐增大。在两个连续的阶段之间,有一个不重叠的2×2卷积,使用stride 2对特征映射进行下采样,使空间大小减半,特征维度翻倍。在分类任务中,我们首先对上一阶段输出的特征映射进行归一化处理,然后采用集合特征的线性分类器对对数进行预测。在目标检测、实例分割和语义分割等任务中,DAT在综合视觉模型中起着骨干作用,可提取多尺度特征。模型在每个阶段的特征中添加一个归一化层,然后将它们输入到以下模块中,如对象检测中的FPN或语义分割中的解码器。

在这里插入图片描述

在DAT的第三和第四阶段引入连续的局部注意和可变形注意块。特征图首先由基于窗口的局部注意处理,进行局部信息聚合,然后通过可变形注意块对局部增强令牌之间的全局关系进行建模。这种带有局部和全局接受场的注意块交替设计有助于模型学习强表示。 由于前两个阶段主要学习局部特征,因此在这两个早期阶段不太喜欢变形注意。此外,前两阶段的键和值具有较大的空间大小,这大大增加了变形注意中的点积和双线性插值的计算开销。因此,为了实现模型容量和计算负担之间的权衡,我们只在第三和第四阶段放置可变形注意,并采用Swin Transformer中的shift-window注意在早期阶段有更好的表示。我们在不同的参数和flop中构建了DAT的三个变体,以便与其他Vision Transformer模型进行公平的比较。我们在第三阶段通过堆叠更多块和增加隐藏维度来改变模型大小。

代码地址:https://github.com/li-tie-zhu/deeplearningCode

训练结果和分割效果如下所示:

training epoch: 1 avg_loss: 0.18651177409367684
----------±---------±---------±---------±---------±---------
validing epoch: 1 avg_loss: 0.08552409937748542
------------------------------------------------------------
training epoch: 2 avg_loss: 0.07989340562086839
----------±---------±---------±---------±---------±---------
validing epoch: 2 avg_loss: 0.08012921420427468
----------
--------------------------------------------------
training epoch: 3 avg_loss: 0.07769824784153546
----------±---------±---------±---------±---------±---------
validing epoch: 3 avg_loss: 0.07932693492143582
------------------------------------------------------------
training epoch: 4 avg_loss: 0.07722462799686652
----------±---------±---------±---------±---------±---------
validing epoch: 4 avg_loss: 0.07906296811042687
----------
--------------------------------------------------
training epoch: 5 avg_loss: 0.07704481100424743
----------±---------±---------±---------±---------±---------
validing epoch: 5 avg_loss: 0.07894573188745059
--------------------------------------------------------------
training epoch: 37 avg_loss: 0.07679760265044677
----------±---------±---------±---------±---------±---------
validing epoch: 37 avg_loss: 0.07875372278384674
------------------------------------------------------------
training epoch: 38 avg_loss: 0.07679748812165016
----------±---------±---------±---------±---------±---------
validing epoch: 38 avg_loss: 0.0787536070132867
----------
--------------------------------------------------
training epoch: 39 avg_loss: 0.07679738763433236
----------±---------±---------±---------±---------±---------
validing epoch: 39 avg_loss: 0.07875352104504903
------------------------------------------------------------
training epoch: 40 avg_loss: 0.0767972873380551
----------±---------±---------±---------±---------±---------
validing epoch: 40 avg_loss: 0.07875344233635144
----------
--------------------------------------------------

Process finished with exit code 0

在这里插入图片描述

在这里插入图片描述

4、TransUnet

由于CNN卷积神经网络的局限性,U-Net通常对于long range dependency的解释性并不好,因此,专门对于sequence-to-sequence模型而设计的带自注意力的transformer就成为了替代的结构。所以就提出了结合Unet和Transformer的TransUnet。TransUnet将CNN特征图的标记化图像块解码为提取全局上下文的输入序列,同时Decoder对编码的特征进行upsample,然后与高分辨率的CNN特征图组合从而来实现更为精确的定位,该模型主要适用于医学图像方面

TransUnet主要解决了一下几个问题:

  1. 长距离依赖关系: 传统的卷积神经网络(CNN)在捕捉长距离依赖关系方面可能存在限制,而医学图像中的器官和病变分布可能涉及广泛的空间范围。TransUNet 结合了 Transformer 的自注意力机制,能够在捕获长距离依赖关系方面表现更好,有助于提高分割准确性。

  2. 多尺度信息: 医学图像中的不同尺度信息对于准确的分割至关重要。TransUNet 通过使用不同分辨率的图像金字塔输入到 Transformer 中,能够有效地处理不同尺度下的特征,从而提高对多尺度信息的建模能力。

  3. 上下文信息: 医学图像分割需要对图像中的上下文信息进行建模,以更好地理解和分割不同结构。TransUNet 通过 Transformer 的全局自注意力机制,能够在分割过程中充分考虑图像的全局上下文信息。

模型整体框架理解:

在这里插入图片描述

TransUnet是一种强大的医学图像分割方法,它结合了Transformers和U-Net的优点。以下是其主要组成部分的概述:

1、Transformer编码器:Transformer部分将卷积神经网络(CNN)特征图中的标记化图像块编码为输入序列,以提取全局上下文。TransUnet框架的Transformer单元由12个Transformer层组成2。单个Transformer层由归一化层、多序列对齐层(MSA)、另一个归一化层和多层感知机堆叠而成。

2、U-Net解码器:解码器将编码的特征上采样,然后将其与高分辨率CNN特征图结合,以实现精确的定位。这种结合U-Net的方式可以通过恢复局部空间信息来增强更细节的部分。

TransUnet在多种医学应用中都取得了优于各种竞争方法的性能,包括多器官分割和心脏分割。这是一个非常有前景的研究领域,有望为医疗保健系统的发展提供重要支持,特别是对于疾病诊断和治疗计划的制定。

代码任务:

代码地址:https://github.com/li-tie-zhu/deeplearningCode

训练结果和分割效果如下所示:

training epoch: 1 avg_loss: 0.4419324114918709
----------±---------±---------±---------±---------±---------
validing epoch: 1 avg_loss: 0.48031888604164125
------------------------------------------------------------
training epoch: 2 avg_loss: 0.3869782850146294
----------±---------±---------±---------±---------±---------
validing epoch: 2 avg_loss: 0.48531425595283506
----------
--------------------------------------------------
training epoch: 3 avg_loss: 0.3669234782457352
----------±---------±---------±---------±---------±---------
validing epoch: 3 avg_loss: 0.4156676232814789
------------------------------------------------------------
training epoch: 4 avg_loss: 0.3547104999423027
----------±---------±---------±---------±---------±---------
validing epoch: 4 avg_loss: 0.37145841121673584
----------
--------------------------------------------------
training epoch: 5 avg_loss: 0.34285978972911835
----------±---------±---------±---------±---------±---------
validing epoch: 5 avg_loss: 0.34381009340286256
-----------------------------------------------------------
training epoch: 37 avg_loss: 0.17893762961030008
----------±---------±---------±---------±---------±---------
validing epoch: 37 avg_loss: 0.2107670336961746
------------------------------------------------------------
training epoch: 38 avg_loss: 0.1739049084484577
----------±---------±---------±---------±---------±---------
validing epoch: 38 avg_loss: 0.20042479634284974
----------
--------------------------------------------------
training epoch: 39 avg_loss: 0.17025053575634957
----------±---------±---------±---------±---------±---------
validing epoch: 39 avg_loss: 0.19394426941871643
------------------------------------------------------------
training epoch: 40 avg_loss: 0.16656696796417236
----------±---------±---------±---------±---------±---------
validing epoch: 40 avg_loss: 0.19420962631702424
----------
--------------------------------------------------

Process finished with exit code 0

在这里插入图片描述

在这里插入图片描述

参考博客

https://blog.csdn.net/qq_45848817/article/details/127105956

https://blog.csdn.net/weixin_46435936/article/details/121658305

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值