乱七八糟的笔记:Transformer/ViT/Swin transformer/DETR

乱七八糟的笔记:Transformer/ViT/Swin transformer/DETR

看B站沐神的课的即时笔记,乱但需要留一份

transformer

Transformer论文精读-B站-沐神

  1. 多头注意力机制可以模仿卷积神经网络一次输出多通道的结果,一个输出通道可以认为是识别不一样的模式。
    在这里插入图片描述

  2. softmax是对每一行做softmax

  3. 除以根号dk,是在论文中dk比较大,当dk比较大时,QK的内积较大,使得softmax之后的数值更向两端靠拢,这样在求梯度时梯度值就会小,会跑不动。

在这里插入图片描述

  1. mask的操作将kt和qt之后计算的那些值换成一个非常大的负数,这样经过softmax之后就会变成0,实现不看t时刻之后的值。
    在这里插入图片描述

  2. 为什么要多头注意力机制,在dot-product中没有可学习的参数,(如果使用的是加性,有一个参数可学习。)距离参数就是内积。为了识别不一样的模式,希望模型有一些不一样的识别像素的方法。
    在这里插入图片描述

在这里先用一个线性层投影到低维,这里投影的参数矩阵w是可以学的。希望模型学到不一样的投影方法,使得在投影进去的那个度量空间里面可以去匹配不同的模式它需要的一些相似函数。像卷积神经网络里不同通道的感觉。
在这里插入图片描述

  1. decoder中 multi-head attention的作用就是有效的把想要的一些东西从编码器里面拿出来。
    在这里插入图片描述

  2. Feed forward 是MLP对每一个词作用一次,作用的是同一个MLP,即MLP只作用在最后一个维度。
    在这里插入图片描述

W1把512投影成2048,W2又将2048投影回512。
在这里插入图片描述

MLP可以对单个点做是因为在self-attention时模型已经抓取了全局的信息。
8. RNN和Transformer的区别在于对序列信息的处理不同。
在这里插入图片描述

  1. Embeddings
    在这里插入图片描述

乘以根号下d,是因为embedding学的过程中l2long,当维度一大,权重值会变小。当加上positional encoding上时
在这里插入图片描述

这时乘以根号下d会使大家在scale上都差不多。
9. CNN,RNN,Self-attention对比
在这里插入图片描述

其中restricted版本是一次只对r个输入做自注意力计算,但因为self-attention的优势就是获得全局的自注意力信息,故这个版本的很少用到。

Vision Transformer

ViT论文精读

  1. 这个网站有某个领域各个算法的性能。
    在这里插入图片描述

  2. Transformer是计算一个自注意力然后进行加权求和的结果。

  3. 将Transformer应用到视觉领域的任务中有以下难点:
    一般硬件支持的序列长度就几百一千,BERT中序列长度为512,但如果把一个图片的像素点变成一个序列,分类任务图片大小为224*224,展开序列长度很长。(卷积神经网络和自注意力机制混着用,或者将卷积神经网络替换为自注意力,把网络中间的特征图当作transformer的输入,在H和W维度上分别做1D的自注意力)

  4. 将一张224224划分成一些patch,一个patch的大小为1616,那么现在的宽高都是1414,即序列长度变成seq_len=1414=196。
    在这里插入图片描述

在这里插入图片描述

一个patch经过linear embeddings被当作输入传给transformer。
5. 这里用的是有监督的训练,在NLP中tranformer基本上都是无监督的方式训练的。
6. 归纳偏置——一种先验知识。
卷积神经网络:假设相邻的区域会有相邻的特征;
在这里插入图片描述

在这里插入图片描述

f——卷积;g——平移。
卷积神经网络有这些先验信息,所以它就需要相对少的数据,但transformer没有这些先验信息。
7.
在这里插入图片描述

  1. ViT-FRCNN
    在这里插入图片描述

在这里插入图片描述

  1. 自监督是人为的在句子里挖坑让机器去做完形填空。

  2. 交叉熵损失,特殊的cls字符(*)
    在这里插入图片描述

  3. 模型的前向过程
    在这里插入图片描述

2242243的图片输入,打成一个patch为1616大小的,则一个小块就是16163=768,一共1414=196个patch,输入的维度就是196768。线性投射层就是一个全连接层E的维度:768768(第二个是D是可以改变的,第一个768是根据图像大小计算得出的是不变的)。
现在有196个token,每个token的维度是768。进入transformer的整体的序列大小就是(196+1)768。
12. 位置编码是直接加上sum,而不是拼接concate
13. MLP一般会先把维度放大,一般是放大四倍,变成197
3072,然后再缩小投射回去变成197*768
在这里插入图片描述

在这里插入图片描述

  1. 位置编码
    在这里插入图片描述

  2. 对于输出的结果
    在这里插入图片描述

用一个MLP和tanh激活函数进行最终的分类输出
16. 在视觉领域是对于最后的输出14*14做一个全局的平均池化再拉直去做。
在这里插入图片描述

  1. 也可以用transformer的所有输出做全局平均池化去做,而不要那个cls token。
    在这里插入图片描述

  2. 2D的位置编码
    在这里插入图片描述

用d/2长度的向量描述横坐标,再用d/2长度的向量去描述纵坐标,最后在concate就又得到一个d的位置编码。
19. 三种位置编码的效果差别不大的一种解释:因为用的是1414个patch,而不是224224个点,因此想知道其位置关系还是比较容易的,故用什么位置编码都无所谓。
在这里插入图片描述

  1. 公式
    在这里插入图片描述

  2. 局部性和平移等变性。
    在这里插入图片描述

MLP是局部性和平移等变性
22.
在这里插入图片描述

  1. 用更大的图片训练时,之前训练好的position embedding可能就没用了,当序列长度变长时一个临时解决的方案是对位置编码进行插值。
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 颜色和纹理,可以用来描述每一个图像块的底层结构。
    在这里插入图片描述

  2. 自注意力这个操作可以模拟长距离的关系
    在这里插入图片描述

  3. 说明在一开始就注意到全局的信息;随着网络的加深学到了语义信息。
    在这里插入图片描述

Swin transformer

Swin Transformer论文精读【论文精读】

  1. 作者团队提出一系列技术,使得Swin transformer可以在1536*1536的图上做预训练。
  2. Swin transformer——一个用了移动窗口的层级式的transformer。
  3. 在窗口内计算自注意力使得序列长度降低,而移动的操作使得相邻窗口之间有交互,从而变相达到一个全局建模的能力。
    在这里插入图片描述

其计算复杂度随着图像大小线性增长而不是平方级增长。
4. VIT每一个Transformer block看到的token都是16倍下采样率,对多尺寸的特征的把握就会弱一些,可能不适合处理密集预测型的任务。且它始终是一个全局建模,计算复杂度平方级增长。
在这里插入图片描述

在这里插入图片描述

  1. 用局部窗口计算自注意力,是借鉴了卷积神经网络里的
    在这里插入图片描述

在这里插入图片描述

同一个物体的不同部位,或者语义相近的不同物体,还是大概率会出现在相连的地方。
6. 如何去生成多尺寸的特征?卷积神经网络主要有max pooling去扩大感受野。
Swin Transformer中提出了一个类似的操作:
在这里插入图片描述

将相邻的小patch合成一个大patch。
7. 一个小patch是44的框,红色的大框是一个中型的计算单元,也就是一个窗口,一个窗口默认有77个小patch,序列长度就是49
在这里插入图片描述

在这里插入图片描述

shift操作
在这里插入图片描述

在这里插入图片描述

  1. patch_size=4指的是一个patch里面有4*4个像素点。
  2. 如果不对transformer做更多的约束,那么输入的维度是多少,输出的维度就还是多少。
  3. 在c这个维度上用了一个1*1的卷积将通道数降下来。这是为了和卷积神经网络那边对等下来。
    在这里插入图片描述

在这里插入图片描述

  1. swin transformer没有用cls token,而是在得到最后的特征图之后用了一个
    在这里插入图片描述

就是一个全局池化的操作,直接把7*7取平均拉直变成1.
14. 这里只画了主干网络,而没有画检测头或者分类头,如果是分类则再
在这里插入图片描述

  1. 披着transformer皮的卷积神经网络
  2. 窗口自注意力
    在这里插入图片描述

565696的一共分为88个窗口,每一个窗口内77大小的patch。
17. 计算复杂度
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 怎样提高移动窗口的计算效率,采用的方式:masking,一些掩码的方式;这篇论文没有用绝对的位置编码,用的是相对的位置编码。
  2. 之前移位窗口的每个窗口大小不一致,且数量由4变成9,提高了计算复杂度。
    在这里插入图片描述

这样窗口数量还是4,固定了计算复杂度。
20. 为了不破坏整体图像的语义信息,需要将移位的窗口再移回去。
21. 移动窗口自注意力计算过程
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

-100是一个负的很大的数,让自注意力的结果(值都非常小)和模板相加,再经过softmax之后36和63的区域就会变成0,即将那两块区域计算的自注意力就mask掉了。
22. mask模板
在这里插入图片描述

在这里插入图片描述

  1. 不同参数量大小的模型
    在这里插入图片描述

swin-T的计算复杂度核resnet50差不多,swin-S和resnet101差不多。
24. 预训练
在这里插入图片描述

在这里插入图片描述

  1. 对比实验性能
    在这里插入图片描述

  2. 基于swin transformer的项目
    在这里插入图片描述

DETR(Detection Transformer)

DETR论文精读

  1. 在DETR之前,大部分目标检测最后还需要一个操作,也就是nms(non-maximum suppersion)操作,不论是proposal based,anchor based,non anchor based方法都需要。nms这个操作不是所有硬件都支持的。但DETR既不需要proposal也不需要anchor,利用transformer的全局建模的能力,把目标检测看成一个集合预测的问题,所以DETR不需要nms等后处理操作。DETR把目标检测做成一个端到端的框架,把之前非常依赖于人的先验知识的部分给删掉了,比如nms的部分和设计anchor的部分。
  2. DETR提出了两个新的东西,一个是新的目标函数
    在这里插入图片描述

提出一种新的目标函数global loss,通过二分图匹配的方式能够强制模型去输出一组独一无二的预测,就没有那么多冗余的框了,每个物体在理想状态下就会生成一个框。
3. 第二个就是使用了这种Transformer encoder decoder的架构,在这部分还有两小细节:
一个是在transformer解码器的部分还有另外一个输入
在这里插入图片描述

有点类似anchor,给定了这个learned object query之后DETR就可以将其与图像的全景信息结合在一起,通过不停的做注意力操作
在这里插入图片描述

在这里插入图片描述

即一起出框(并行出框)(在nlp里面用transformer时会进行一个掩码操作,通过自回归的方式一点一点生成文本信息。)(但在目标检测任务中这些框之间是没有依赖关系的,并行比串行更加合适。)
4. 优点:
在这里插入图片描述

简单性:只要硬件支持cnn和transformer,就一定可以支持DETR。
性能上,在COCO数据集上DETR和训练的非常好的Fast RCNN的基线网络取得了非常好的结果。
拓展性:DETR可以很容易拓宽到其他任务上,比如说做全景分割,不需要动模型的主体,只需要在后面加一个专用的分割头即可。
5. 集合预测的问题?
6. proposal的方式是什么意思?
7. 目前大多数好用的目标检测器都是用一种间接的方式去处理集合预测的问题,比如说用proposal的方式,即RCNN系列的工作。或者用anchor的方式,例如YOLO的Focal loss,或者一些non anchor base的方法,比如用物体的中心点,center net或者FCOS这种方法。这些都没有直接去做这个集合预测的任务,而是设计了一个替代的,要么是分类要么是回归的任务,去解决目标检测的问题。以上检测器的性能在很大程度上受限 于后处理的操作,即nms,因为上述方法都会生成大量冗余的框,即near duplicate predictions。DETR的目的:不需要使用这些先验知识,同时还能在比较难的数据集上取得很好的效果。
8. 用CNN抽取特征,将特征拉直,送给一个transformer的encoder-decoder。在这里encoder的作用就是进一步去学习这个全局的信息,为了接下来的decoder,也就是为了最后这个出预测框做铺垫。
在这里插入图片描述

为什么用encoder,因为用了encoder那么每一个点或者说每一个特征就跟这个图片里其他的特征都会有交互,这样大概就知道哪块是哪个物体,宁一块是宁一个物体,那对于同一个物体来说就应该只出一个框,而不是很多框。这种全局的特征非常有利于去移除冗余的框。
在全局建模(encoder)之后用decoder去生成框的输出。在得到图像的特征之后,还会有一个object query,去限定要出多少个框,用这个object query去和特征在decoder里做交互,在decoder里去做自注意力操作,从而得到最后输出的这个框。
在这里插入图片描述

论文中作者选择框数是100,意味着不论是什么图片最后都会预测出来100个框。
9. 这100个框怎么和gt做匹配然后算loss?
用二分图匹配的方式,把整个问题当作一个二分图匹配的问题。在训练的时候通过算这100个框和这2个gt框之间的matching loss,从而决定在100个框中哪两个框是独一无二对应到两个gt框的。剩下98个框就会被标记成没有物体,即背景类。在确定好匹配的框之后,才会像普通检测一样计算分类的损失和边界框的损失。
10. 训练时:用卷积神经网络抽特征;用encoder去学全局的特征;用decoder生成预测的框;用二分图匹配(匈牙利算法)将dt和gt做一个匹配,用匹配上的框去算loss。
测试时:用卷积神经网络抽特征;用encoder去学全局的特征;用decoder生成预测的框。前三步都一样,但不需要框的匹配,直接拿一个分数阈值去卡,在论文中置信度大于0.7的就会被保留下来。
11. DETR对大物体的检测效果比对小物体的检测性能效果要好,可能是使用了transformer,能做全局的建模。如果是用anchor的话就会受限于anchor的大小。DETR在小物体上的检测效果就不太好。
12. Deformable DETR通过多尺度的设计解决了DETR对小目标检测效果不好的问题,以及DETR参数太多的问题。DETR训练时间很长,作者训练了500轮。
13. 现在的目标检测器都是根据一些初始的猜测去做这些预测的,比如两阶段的检测器,他们的初始猜测就是中间的proposal,对于signal stage的检测方法来说初始猜测就是anchor,或者说是物体的中心点。
14. 最近的一篇论文做了比较,发现这些方法他们的性能和初始的猜测有很大的关系,后处理对模型性能的影响较大。
在这里插入图片描述

  1. 用基于集合的目标函数去做目标检测,set-based loss。
    在这里插入图片描述

用encoder-decoder的结构去做目标检测。
16. 是因为有基于集合的目标函数,才能达到一对一出框的方式,所以才能不需要nms。
17. 二分图匹配
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

将损失矩阵送入scipy包的这个函数中。损失矩阵不一定是个正方形,abc可以看作dt,xyz可以看作gt。之后会得到一个最优匹配。
18. 对于目标检测这个cost matrix应该放损失,loss可以用下面这个式子计算。
在这里插入图片描述

这个包括分类的损失和box的损失。
19. 得到真正对应的框之后可以算一个新的目标函数,去做梯度回传。
新的目标函数
在这里插入图片描述

但是DETR有两个不一样的地方,第一个loss没有用log,这是为了让两个loss大概在同一个取值空间,第二个loss用的不是L1_loss,因为L1_loss和框的大小有关,框越大,最后算出来的loss就容易越大。而DETR因为用了transformer,对大物体的目标检测很友好,就会很容易出大框,loss就会大,不利于优化。
所以作者除了L1Loss还加了一个
在这里插入图片描述

这个loss是一个和框大小无关的目标函数。
20. 前向过程
在这里插入图片描述

在这里插入图片描述

25和34是800和1066的1/32。11的降维操作把2048变成256.
这里的位置编码是一个固定的位置编码,大小也是256
25*34.两者相加之后拉直(把h和w拉直)就是transformer的输入。
850是序列长度,在这里插入图片描述

在DETR中作者使用了6个encoder。
在decoder中用到一个object queries,在这里插入图片描述
,它是可学习的。准确来说,在这里插入图片描述

100256,其中256和之前的256对应,100是告诉最后要100个输出。
拿100
256和850256反复去做自注意力操作,最后得到一个100256的特征。这里decoder也是六个。
检测头在这里插入图片描述
,也就是一些MLP,把特征给全连接层,然后全连接层就会输出两个预测,在这里插入图片描述
在这里插入图片描述
,类别如果是coco就是91类,框就是4个值(框的中心点和框的高度及宽度。)

在每一个decoder里在这里插入图片描述
,在第一层可以不做,但后续的层都不能省掉。这样的操作主要目的是移除冗余框,因为它们通信之后,在这里插入图片描述
,而我们尽量不去做重复的框。
21.
为了模型训练的更快,在decoder加了很多额外的目标函数,在这里插入图片描述

  1. 在每一个decoder后面都加了ffn,而去得到输出去算loss。ffn共享参数。

  2. 代码
    在这里插入图片描述

  3. 用encoder的时候就已经把图片上的物体分的很开了。
    在这里插入图片描述

  4. 层数越深,学到的全局特征越好。
    在这里插入图片描述

  5. encoder在学一个全局的特征,尽量让物体和物体之间分开,对于极值点,最外围的这些点需要decoder,decoder会集中注意学习边缘的特征。
    在这里插入图片描述

在这里插入图片描述

  1. object query的可视化
    在这里插入图片描述

这里将在这里插入图片描述
得到最后的所有输出框全都可视化了出来,这里一个正方形就代表了一个query,目的是看看这个object query到底学了什么,图中绿色的点表示小的bonding box,红色的点表示大的横向的bonding box,蓝色的点表示大的纵向的bonding box。
可以看出object query和anchor还是有一些像的,anchor是提前去定义一些框,然后把预测和提前做好的bonding box做对比,而object query是一个可学习的东西。比如第一个他每次都会问左下角有没有小的物体等。
为什么所有的都会问中间有没有大的物体,这是因为coco数据集的特点,因为coco数据集往往在中心都有一个大物体。
27. Deformable DETR它就需要cuda自己写的代码,需要自己写deformable算子。
28. DETR就是把之前不可学的变成了一个可学的东西,比如object query。

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值