VIT学习心得

news2024/11/24 5:20:39

来源:投稿 作者:橡皮
编辑:学姐

小声逼逼

在过去的两年里,Vision Transformer(ViT)是计算机视觉(cv)领域最有影响力的工作之一。「它推翻了2012年在Alex net中提出的CNN在CV领域的统治地位: 当能够获得足够多的预训练数据时,将ViT应用到CV的效果非常好。」 最重要的是,ViT的提出正式打破了CV和NLP之间的壁垒,同时还给CV和多模态的研究工作挖了一个大坑。

再叨叨两句

其实很早之前在群里就听小伙伴们聊过vision transformer,但是因为当时自己所做的工作用到ViT的属实是很少,所以对于主动去了解这个东西就有些嗤之以鼻。

真正开始学,或者说认真开始看原paper结合code去理解vision transformer是由于我在AIR的暑研项目中,mentor提出了个有意思的想法是「基于DETR (detection transformer)思路构造多类别异常检测模型。」

这就使我不得不加班加点的去从头了解vision transformer的结构以及其中的self-attention以及cross-attention机制。借此机会也想跟大家分享一下关于我的学习心得。

心路历程 QVQ

对我个人而言,学习一个新技术或者去follow一项新的工作,我的学习路线通常是:

读原paper👉知乎一下大家有关这篇工作的讨论👉重读技术路线👉对照代码去再次理解技术路线以及着重关注损失函数。(以下参考了沐神讲vit视频下的笔记进行回忆)

首先是阅读原paper

通过标题和摘要可以获得一些信息:an image is worth 16*16 words,即每一张输入transformer的图片都会被打散为若干个16*16的小方格(patches),这样就可以利用nlp里面典型的transformer结构去做大规模的图像识别。

值得一提的是在ViT之前,我们都知道transformer在nlp领域是基本操作,但是这么好的idea却在cv领域应用十分有限。

原文作者谷歌团队着手解决了这个问题:「attention+CNN或attention替换CNN components,但是保持CNN的整体结构」。 对于保持结构,是指的ResNet50有4个stage(R2/R3/R4/R5),每个stage不变,直接使用attention取代每一个stage里面的每一个block。作者实验证明attention并不需要非得和CNN一起使用,跟transformer一起用时,在大规模数据集上预训练并在中小数据集做fine-tuning后照样能够取得sota效果。

接下来我跳过related work直接来看到了模型结构,不得不说看了主图基本上就明白很多了。 ViT这篇文章尽可能使用原始transformer,「旨在于享受架构的高效实现。」

输入一张图,将它打成33的patches,然后再将其分别flattened从33变为1*9,经过一个Linear Projection后,将每个patches转变成了patch embedding。由于encoder中需要做self-attention,即所有元素两两之间计算自注意力,这与顺序无关。

但是由于每个patch是来自于图片是有序的,所以作者在patch embedding前面加了position embedding,这样patch embedding + position embedding[CLS]=token(包含了图片的patch信息和每个patch在原图的位置信息)。可以看到,其实真正输入进transformer的就是tokens,这与nlp中的工作是异曲同工的。

另外,文章主图做的分类任务,虽然每个token都会有输出,但是最终还是只拿[CLS]来做分类!这是因为transformer encoder中的self-attention机制使得所有tokens都在做两两的信息交互,那么[CLS]同样也会跟着所有的patches一起做交互,所以[CLS]也是可以学到有用信息的拿来做最终的分类的。继续看上面,「最终分类任务就是把[CLS]单拎出来到通用的MLP head中得到类别判断,这样就可以使用cross-entropy来进行训练了~」

根据代码重新过一遍前向过程

虽然ViT的整体思路在主图上的展示不能够再清晰,但是毕竟最终要拿来改代码做自己的任务嘛,根据代码重新过一遍前向过程是有必要的:图片RGB->Npatchespatches->经过linear projection(E)后:768(patch维度)D(embedding_dim)768->图片$ xE=196798 $至此2D图片转换为1D序列tokens! 另外别忘了position embedding的存在,所以输入encoder的序列长度是197768~

到这里其实阅读原文和代码就结束了,方法思路和代码的具体实现已经get到了。 我并没有看Related work以及实验部分的效果是因为现在ViT已经是经过各种大佬魔改之后被公认为还不错了。

VIT的坑

诚然ViT这篇文章中也提及到了一些transformer固有的缺陷,比如data-hungry,相比CNN缺少归纳偏置,序列长维度高以及计算复杂度高等。 但正因为有这一系列待解决的问题,留给后面研究的可能性也就越大。所以我认为ViT原文的可读性依然非常的大,它讲解了最基本的原理和insight,但是真正希望把vit应用到自己的工作(其他领域)当中去,还是要看一些经典的ViT拓展工作来获取独到的思路,如DETR等等~

VIT论文&代码详解🚀🚀🚀

关注下方《学姐带你玩AI》回复“VIT”领取

码字不易,欢迎大家点赞评论收藏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无接触式磁旋转编码器AS5040介绍

无接触式磁旋转编码器AS5040简介AS5040 是一款无接触式磁旋转编码器,用于精确测量整个360内的角度。此产品是一个片上系统,在单个封装内整合了集成式Hall 元件、模拟前端和数据信号处理功能。测量角度时,只需简单地配备1 个在芯片中心上方旋转…

Spring5的全细节回顾总结

概述: https://cntofu.com/book/95/33-what-new-in-the-spring-framework.md 这个不错。 轻量级javaee框架。 针对于bean的生命周期进行管理。 解决企业应用开发的复杂性。 核心: ​ IOC:控制反转,把创建对象的过程交给sprin…

第一天 Blender操作 | 大帅老猿threejs特训【超详细】

前言 这一天主要是基础理论的学习。 本人学习资料仓库 https://gitee.com/zhang_dezheng_hsr/three-demo.git YCY-TrainingCamp-S2: 在原有的文件上添加本人的学习记录 第一天 Blender操作 | 大帅老猿threejs特训【超详细】【我在掘金的同名文章】 一、大纲 二、THREE 基础概…

Linux查看某个应用的CPU/内存/网卡使用情况

1.查看CPU的使用率 # ps -ef | grep zabbix 进程号是1715 # top -p 1715 可以看到CPU的使用率是0 , 内存的使用率是0 2.查看内存真实使用了多少 #cat /proc/[pid]/status #cat /proc/1715/status VmPeak:进程所使用的虚拟内存的峰值 VmSize: 进程当前使用…

22.字符串初始化方法及赋值,字符串和指针总结

目录 初始化 1.字符数组初始化 2.指针指向文字常量区,初始化 3.指针指向堆区,堆区存放字符串 使用时赋值 1.字符数组,使用scanf或者strcpy 2.指针指向文字常量区 3.指针指向堆区,堆区存放字符串 初始化 1.字符数组初始化 …

各国家语言代码对照表

来源如下 Language Code Tablehttp://www.lingoes.cn/zh/translator/langcode.htm 详情如下 语言代码语言名称af南非语af-ZA南非语ar阿拉伯语ar-AE阿拉伯语(阿联酋)ar-BH阿拉伯语(巴林)ar-DZ阿拉伯语(阿尔及利亚)ar-EG阿拉伯语(埃及)ar-IQ阿拉伯语(伊拉克)ar-JO阿拉伯语(约旦…

万字详解 Linux 网络管理

万字详解 Linux 网络管理1.Linux处理数据包过程2.和网络相关的几个文件说明网卡配置文件ifcfg-*DNS配置文件/etc/resolv.conf(CentOS6环境)/etc/services3.网络接口配置和主机名ifconfigifcfghostname命令4.网关/路由5.网关/路由相关命令route命令配置永…

netty(1):NIO 基础之三大组件

1 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出&…

如何用idea快速的debug本地程序

介绍大家都经常用idea开发, 开发过程中运行程序就会出现各种意料之外的异常, 如果解决这些异常, 尤其是三方jar包抛出的异常,就是一个很关键和棘手的问题.配置环境在第一个选项位置点开后会弹出配置页面,里面可以配置一些启动需要的环境变量.第二个是debug启动按钮第三个是程序…

SQL 优化方案(规范)

SQL优化1、SQL执行顺序2、前置条件2.1、使用explain分析SQL执行计划2.2、开启慢sql日志2.3、慢查询时间设置。默认情况下long_query_time的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。3、基础Sql优化3.1、小表驱动大表3.2、高效的分页3.3、…

【linux入门】Linux基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell(Xshell替代品)【第二章-Linux基础命令】1.Linux目录结构2.什么…

Linux下ElasticSearch安装和基本使用

安装 下载安装目录:/home/es-7.12.0 es启动用户:zmsz 出于安全考虑,elasticsearch默认不允许以root账号运行,所有一定要创建一个其他用户执行启动命令,不然一定会报错!! 创建用户:useradd zmsz 设置密码:passwd zmsz下载解压 下载:官网 以最新版8.6为准,执行wget …

MySQL中的limit分页的使用

SQL准备 create table tb_students (id int auto_increment primary key comment 主键ID,studentid char(9) unique not null comment 学生学号,name varchar(10) not null comment 学生姓名,gender char(1) not null comment 学生性别 ) comment 学生表;insert into tb_stude…

【机器学习 - 2】:数据集的处理

文章目录训练集和数据集分离获取最优模型超参数寻找最优模型网格搜索的使用训练集和数据集分离 训练集和数据集分离的原理:当我们获取一个数据集时,我们需要将其一小部分拿出来作为测试集,剩余的作为训练集。例如对于一个训练集,将…

RocketChip RISC-V生成RTL到仿真全流程

一、Scala配置项修改和RTL代码生成可以通过对scala中的配置项修改,来达到定制化配置RISC-V的目的,这里总结几个比较常用的配置项、配置项含义和所在的scala中的位置:1.$rocket-chip/src/main/scala/system/Config.scala1)new With…

机器学习-2-安装Python 3.6和Pytorch 1.1.0

0. 说明: 之前根据GPU版本安装了CUDA 9.0,因此现安装与CUDA 9.0相对应的Pytorch版本,但在安装Pytorch之前要先确认一下Python的版本。 1. 查看 CUDA 9.0 对应的 Pytorch 从https://pytorch.org/get-started/previous-versions/中查找CUDA …

程序的机器级表示part1——程序编码与数据格式

目录 1. 汇编语言和机器级语言 1.1 不同的编程语言 1.2 Linux下的汇编语言 2. 程序编码 1.1 机器级代码 1.2 代码示例 3. 数据格式 本文基于CSAPP第三章撰写,主要介绍部分x86-64汇编的相关知识,后续会将该部分内容慢慢完善(PS&a…

Web Spider XHR断点 千千XX 歌曲下载(三)

Web Spider XHR断点 千千XX 歌曲下载 首先声明: 此次案例只为学习交流使用,切勿用于其他非法用途 注:网站url、接口url请使用base64.b64decode自行解码 文章目录Web Spider XHR断点 千千XX 歌曲下载前言一、资源推荐二、任务说明三、网站分析四、XHR断点…

knife4j使用与步骤

1、导入依赖<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version> </dependency>2、knife4j的配置类&#xff08;可有可无&#xff09;package…

为什么程序员的工资比其他行业高这么多?

不止一次听到有人说程序员工资高&#xff0c;更有甚者喊着“把IT工资打下来”。 拜托大哥大姐们&#xff01;看事情要客观好吧&#xff01;&#xff01; 虽然看起来程序员工资是不少&#xff0c;对比其他行业确实会高一些&#xff0c;但并不代表程序员这个岗位工资就要压到三千…