Transformer

Layer Norm

​ Batch Norm(左): 在每个batch里,将特征均值变成0,方差变成1,如下蓝色,不同batch的相同feature维度做norm

​ Layer Norm(右): 在同一batch的不同feature里做norm

​ 在实际训练中数据是(Batch*Seq*Feature),不同batch对应的seq的长度不同,然而又用了等长的feature表达。样本长度变化较大的时候,均值和方差的抖动比较大。Layer Norm在每个样本内部算均值和方差,较为稳定。

Attention

​ 从整个序列中提取信息。尤其是self-attention,从自身中提取所有信息,再根据q-k找出相似度最大的信息,也就是有用的信息作为了特征向量。

​ 例如给出一个q “hello”,根据q “hello”的vector去整个序列中计算点乘,越大的代表相似度(compatibility)越大,越小的代表相似度越小(比如空间上垂直)(e.g. “hello”和“hi”的相似度应该越大)。得到所有key和q“hello”的相似度之后,再再各个维度上根据相似度加权计算v,得到attention的output。

​ output再经过后面的Feed-Forward层等投影到目标的语义空间。

Multi-head Attention

​ 有了上面的概念,类似于CNN不同通道的不同filter,使用不同head的attention可以提取出不同特性的信息。

​ Transformer实现的意义和RNN是一样的,将时序信息传递给输入进行计算,实现时序信息的传递。RNN中是前一时刻传递给后一时刻,Transformer中是通过attention在全局的序列中提取信息。又由于Transformer中不同信息可以并行从query中抽取,效率高于顺序时序的RNN。

DETR (DEtection TRansformers)

End-to-end Object Detection with Transformers

相比Faster R-CNN等做法,DETR最大特点是将目标检测问题转化为无序集合预测问题(set prediction)。论文中特意指出Faster R-CNN这种设置一大堆anchor,然后基于anchor进行分类和回归其实属于代理做法即不是最直接做法,目标检测任务就是输出无序集合,而Faster R-CNN等算法通过各种操作,并结合复杂后处理最终才得到无序集合属于绕路了。现在核心问题来了:输出的 (b,100) 个检测结果是无序的,如何和 GTBounding Box 计算loss?这就需要用到经典的二分图匹配算法了,也就是常说的匈牙利算法。

​ 图解总结DETR的四步:
​ 1. CNN抽取特征
​ 2. Transformer的encoder,学习全局特征
​ 3. Transformer的decoder,生成多个预测框
​ 4. 预测框和GT做匹配,求得loss(推理的话,就是根据置信度阈值输出各个预测框的目标类型)

Object detection set prediction loss

二分图匹配问题:DETR的预测结果是大小为N(固定)的集合(也就是N个预测框),因此需要将所有N个框与GT的框进行匹配,计算loss。解决方案是scipy.linear_sum_matrix,在位置重叠度和分类正确度二者中找到最优解,也就是找到每个GT框对应的唯一框。

目标检测的目标函数如上图

object queries: learnable position embedding,类似于anchor的概念

总述:先根据CNN提取特征,得到向量与相同大小的position embedding层相加,然后长宽拉直作为transformer encoder的输入。encoder输出一个与输入大小相同的向量,与object queries在decoder处做attention,得到对应各个检测框的特征向量 ,再将特征向量送给FFN进行一个类别和位置框的预测。最后匈牙利算法二分图匹配,计算loss再反向传播。

论文代码解析(36行实现,无敌)
​ 超参:row 33,nheads是multi-head attention
​ 模型初始化:backbone是ResNet50
​ 前向过程:没什么特别的,pos是position embedding的向量,h是上面100*256的特征向量

​ Attention的可视化实验,突出输出各个点的attention区域(上encoder/下decoder):

​ 可见decoder明显attention到了很多边缘特征,类似于u-net,恢复细节的效果

ViT

paper title: an image is worth 16x16 words
意思就是把一张图分成16x16的patch,每个patch里做attention

contribution
将attention用到cv领域,同时减少拉直的图片的序列长度
将transformer直接用于cv,尽量少的修改

ViT在ImageNet上比CNN第几个点,是因为CNN自带的两个inductive biases,相当于是强先验信息:
1.sliding window:基于图片上相邻区域具有相邻特征
2.translation equivalent:类似于平移不变性的意义,没有特别懂
所以效果体现:在更大的数据集上,vis transformer>>cnn

​ Transformer在nlp领域,自监督的训练方法,BERT是“denosing完形填空”,GPT是“next word prediction”。视觉Transformer的各种其他的改进attention方式确实有效,但是需要大量的设计进行GPU训练的加速,在部署实现上有困难。

ViT模型图如下

​ 图像切割成16x16的patch之后,分别做patch embedding(将各个patch图像经过linear projection的全连接层)和position embedding(根据patch位置的特征向量),二者直接sum上,再在首部接上cls token,作为Transformer encoder输入的seq。seq经过multi-head attention,

​ 最难以理解的地方 - Extra Learnable Embedding: CLS Token/Embedding
​ CLS Token就是在输入seq最前面加上一维,初始化为0。由于没有给他初始信息,他有从所有的seq成员token都相互做了attention,那么这个cls token的所有信息都是从所有其他token处学到的信息,最后认为可以拿来表示所有token的特征。在nlp中cls token的特征代表的是句子级别的意义,换到图像上cls token的输出就代表了整个图像也就是所有像素的整体语义。最后只用拿出cls token的特征向量(也就是整个output seq的第0维),作为整张图片提取出的特征向量,直接丢进MLP就能够实现分类任务。

​ 补充:当然这个拿来做classification是有道理的,拿其他token经过Transformer的输出的特征表示也是有道理的,或是取global max/mean pooling等等,实验证明都可以,不同任务有不同的做法…
​ 下图是用cls token做分类,和用以往feature map做分类的准确率比较:

总结下和原始transformer编码器不同的地方:

  • 输入编码器的位置编码需要考虑2-D空间位置。
  • 位置编码向量需要加入到每个Encoder Layer中。
  • 在编码器内部位置编码Positional Encoding仅仅作用于Query和Key,即只与Query和Key相加,Value不做任何处理。

SwinIR: 多尺度ViT

Transformer, DETR, ViT, SwinIR相关推荐

  1. Vision Transformer(ViT)PyTorch代码全解析(附图解)

    Vision Transformer(ViT)PyTorch代码全解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单.本文将根 ...

  2. 神经网络学习笔记3——Transformer、VIT与BoTNet网络

    系列文章目录 神经网络学习笔记1--ResNet残差网络.Batch Normalization理解与代码 神经网络学习笔记2--VGGNet神经网络结构与感受野理解与代码 文章目录 系列文章目录 A ...

  3. 【原理+源码详细解读】从Transformer到ViT

    文章目录 参考文献 简介 Transformer架构 Position Encoding Self-attention Multi-head Self-attention Masked Multi-H ...

  4. Transformer架构 VIT

    VIT 简单来说就说在视觉中怎么去做transfomer transfomer的输入得是一个序列,我们用transfomer做视觉的时候不能把一整张图片传进去,而是考虑把一张图片分成多个小块,比如下图 ...

  5. 神经网络学习小记录68——Tensorflow2版 Vision Transformer(VIT)模型的复现详解

    神经网络学习小记录68--Tensorflow2版 Vision Transformer(VIT)模型的复现详解 学习前言 什么是Vision Transformer(VIT) 代码下载 Vision ...

  6. 【Transformer】ViT:An image is worth 16x16: transformers for image recognition at scale

    文章目录 一.背景和动机 二.方法 三.效果 四.Vision Transformer 学习到图像的哪些特征了 五.代码 代码链接:https://github.com/lucidrains/vit- ...

  7. vision transformer(viT)教学视频【通俗易懂】

    11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili 文章地址:Vision Transformer详解_霹雳吧啦Wz-CSDN博客 其中两个关键的图

  8. Transformer | DETR目标检测中的位置编码position_encoding代码详解

    本文主要描述的是DETR论文中的position_encoding,详细DETR论文解析可参考 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=> ...

  9. Transformer:ViT、Swim、NesT

    1.Vision Transformer 整体框架 算法流程 使用大小为P的区块将H*W*C的二维图像分为N个P*P*C的区块(patch),N=H*W/(P*P) 将区块使用线性变换转为D维特征向量 ...

最新文章

  1. 为什么Bugs没有被修复?
  2. 获取 docker 容器(container)的 ip 地址
  3. java mysql访问类_java 访问数据库公共类
  4. 第二章 Qt Widgets项目的创建、运行和发布的过程
  5. 大规模针对iOS设备的恶意广告活动劫持3亿次浏览器会话
  6. C#中的Json的序列化和反序列化
  7. (日常搬砖)voc等xml格式的数据集转换为yolo可用的txt格式的数据集(亲测可用)
  8. 怎样控制小程序tabbar图标大小_微信小程序设计规范经验分享
  9. iOS图形学(一):viewWillUnload和内存警告
  10. java-php-python-ssm在线装机报价系统计算机毕业设计
  11. 雷蛇公布2018年全年业绩:营收达7.1亿美元 净亏损9790万美元
  12. Spring学习之IOC容器(二)
  13. Sentence Centrality Revisited for Unsupervised Summarization
  14. 微信小程序获取rich-text(富文本)渲染内容高度,rich-text(富文本)里img 样式设置
  15. 【计算机毕设】Java课程设计
  16. 线性代数计算机应用论文,线性代数问题的计算机应用.docx
  17. 饿了么在即时零售的胜算
  18. 浏览器播放rtsp视频流:3、rtsp转webrtc播放
  19. 电脑版元气壁纸为什么老显示服务器异常,电脑设置壁纸出现这种状况怎么办?...
  20. Android触摸屏坐标转换

热门文章

  1. Java实现 蓝桥杯 算法提高 小X的购物计划
  2. KWin in KDE4
  3. css设置背景图片自适应(转)
  4. 数据科学猫:无监督学习的定义与模型
  5. 滑动窗口相关概念和习题集
  6. Visp系列学习一:visp库的安装和测试
  7. handlebars html转义,Handlebars HTML转义
  8. Windows10环境gradle安装与配置
  9. 早上坐车时,读《好妈妈胜过好老师》,受到些启发,记录一下~
  10. popstate_ios下popstate触发的问题