Vision Transformer 总结

news/2024/10/18 14:24:35/

这里写自定义目录标题

  • Vision Transformer
    • Transformer
    • 结构
    • 相较于CNN 的优势在哪里?
  • Transformer in Transformer
  • 代码实现的一些描述

Vision Transformer

Transformer

结构

ViT中最重要的部分是self-attention, 对照片做的patches, 以及position embedding。self-attention机制在之前的博客里面也有讲过,在这里主要是计算每一个patch 之间的相关性,多头的自注意力机制有些许不一样的。我个人的理解是单头的注意力机制只能计算某一个特征和另外一个特征的相关性,但是多头注意力机制可以同时处理多个特征的和另外多个特征的相关性。我感觉这里可以结合“线性分类器” 和 "CNN"的区别来理解。 线性分类器只能学习到输入数据的一个mode,比如 “一个人的看向左边”,但是如果输入数据中还有:‘一个人看向右边’的图片,线性分类器就无法准确的学习,但是CNN却因为很多的kernels,所以可以学习到一个物体的不同mode。 这里的self-attention 和multi-head self-attention 可以采用的同样的方式来理解。

至于patch, 我认为是将图片序列化的一个过程而已,因为Transformer本身是无法处理图片格式的数据的。所以将图片打散成小的patch更符合Transformer的输入条件。但是图像数据本身携带了位置信息的,通过这样的“序列化”过程会导致图像丢失之前的位置信息,所以position embedding 在ViT中才如此的重要。所谓position embedding 实际上是加在每一个patch上的一个小向量来表示当前patch的位置信息。

相较于CNN 的优势在哪里?

想要获得全局的信息CNN 通常需要通过堆叠深度来实现感受野的增长。因为对于CNN 来说 第N层的特征图上的一个像素点,是第N-1层的一片区域。随着层数的变多,网络的感受野也会逐渐变大,但是通常是需要较深的深度才能达到这个效果,较深深度不仅会出现计算力吃紧的问题,也是潜在出现过拟合的原因,而transformer 因为每一层都会整合patch之间的信息,他可以从第一层开始就看到全局信息,在一定程度上规避了CNN 需要非常深的深度才能获得较好全局信息的问题。

Transformer in Transformer

ViT中将图像分成patches不是最优的选择。因为patch中包含的不同比例和位置的信息不能较好的处理。所以TNT中,进一步将patch再拆分成更小的单位然后进行重组。论文中将patch称为 ‘visual sentance’,把进一步拆分的更小单位称之为’visual words’。

文章只是使用了一个inner VIT 去进一步拆分patch而已,outer VIT 和经典VIT一致。

代码实现的一些描述

postional embedding 和 patch embedding都是使用的一层Conv2D来完成的。将位置和patch 都embed到相同的维度上。注意力机制的QKV 都是使用单独的一层MLP,多头注意力就是把输入特征维度拆分开即可。


http://www.ppmy.cn/news/1434230.html

相关文章

如何打造自己的O2O平台系统:商业模式探索与实践

大家好,我是微三云周丽,今天给大家分析当下市场比较火爆的商业模式! 小编今天跟大伙们分享什么是O2O平台系统? 在数字化浪潮的推动下,O2O(Online to Offline)商业模式已成为连接线上与线下、商家…

通过python实现分析出生日期辨识你的星座 出生日期判断星座

目录 一.总体说明 二.完整代码 三.逐行分析 一.总体说明 这段代码的主要功能是根据用户输入的出生日期,判断并输出对应的星座。 首先,定义了一个名为sdate的列表,其中包含了每个星座所对应的日期。接下来,定义了conts列表,存储了星座的名称,以及signs列表,存储了星座…

批量更新 AWS ECS Fargate 服务

AWS ECS Fargate 是一种全托管的容器部署服务,可以帮助用户轻松地管理和运行容器化的应用程序。在实际应用中,经常需要对多个服务进行更新以保持系统的稳定性和安全性。本文将介绍如何使用 Python SDK 批量更新 AWS ECS Fargate 服务,并提供完整的代码示例。 1. 准备工作 …

【Linux系统编程】

Linux系统编程 一.文件编程1.常用API1.1 打开:open1.2 读写:write/read1.3 光标定位: lseek1.4 创建:creat1.4 关闭:close 2.文件的打开及创建3.文件的写入4.文件的读取5.文件描述符5.代码实现cp指令6.编程实现修改文件配置7.写一…

银河麒麟redis安装

一.编译和安装Redis wget http://download.redis.io/releases/redis-4.0.9.tar.gz 执行如下命令,解压包。 tar -zxvf redis-4.0.9.tar.gz 执行如下命令,进入deps目录 cd redis-4.0.9/deps 执行如下命令,编译Redis依赖库。 make -j4 hiredis l…

关于 Introspector 内省器在项目中的简单应用

最近项目中有这么一个需求, 就是在对象返回时候,针对某些属性,的特定值, 进行处理, 本来想写注解, 但赶时间,就随便用了 Introspector 来反射处理 内省(Introspector) 是Java 语言对 JavaBean 类…

深入理解JavaScript - Proxy模拟vue的代理

视频链接 ⚠️视频里使用proxy的代码不能用!!! (1)简单使用 const obj {a: 1,b: 2,c: {a: 1,b: 2,}, }; let v obj.a; Object.defineProperty(obj, "a", {get() {console.log("读取", a);},se…

Jmeter自动化测试实施方案

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号:互联网杂货铺,回复1 ,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是目前最流行的一种测试工具,基于此工…