Transformers在计算机视觉领域中的应用【第2篇:MAE——BERT的CV版本】

目录

  • 1 介绍
  • 2 模型示意图
  • 3 MAE算法
  • 4 总结

论文:Masked Autoencoders Are Scalable Vision Learners
代码:https://github.com/facebookresearch/mae

1 介绍

MAE是基于ViT的,将整个训练拓展到没有标号的数据上面,和BERT一样,通过完形填空来获取对图片的理解。MAE不是第一个将BERT拓展到CV上的工作,但是它很有可能是这一系列工作之中未来影响最大的一篇。因为BERT极大地加速了Transformer这个架构在NLP领域中的应用,所以MAE也会使得Transformer在CV上的应用更加普及一些。

文章标题是:带掩码的自编码器是一个可拓展的视觉学习器。标题里的Masked来自于BERT,可以理解成完形填空,每一次挖掉一些东西,然后去预测挖掉的东西。Autoencoder里的auto是“自”的意思,机器学习里有一类模型叫auto 自模型,例如自回归模型,这类模型的特点就是标号和图片,即y和x,是来自于同一个东西,比如说在语言模型里,我们每次用前面的词去预测下一个词,在另一个样本里面,这个预测的词也是标号,也会成为另一个样本的x本身,x和y都是来自于同样的句子里的词,所以叫做auto。

2 模型示意图

模型示意图如下图所示,一张图片输入进来,先把它切成一个个的小块,其中要被盖住的这些块涂成灰色,75%的图片都被盖住了。那些没有被盖住的块被直接拿出来,放到encoder里面,也就是ViT里面,得到每一个块对应的特征,然后拉长,把被盖住的块重新放回原来的位置,所有块输入到一个解码器中,解码器会去尝试把里面的像素信息全部重构回来,使得最后的target训练出来就是原始的没有被掩码盖住的图片。

示意图中编码器比解码器稍微高一点,意思是指主要的计算量都来自编码器,因为最重要的是对图片的像素进行编码,编码器只要去处理没有被盖住的图片,也就是说,一张图片只需要看到四分之一的像素即可,这样计算量稍微低一点。

示意图

这个示意图是做预训练时候做的事情,如果你想用这个模型来做计算机任务的话,只需要用它的编码器即可,不需要使用解码器,图片输入进来,不需要对它做掩码,直接切成这些patch,输入到编码器中,就能得到所有块的特征表示,就可以当成这张图片的特征表示,就可以用来做自己的任务了。

下图展示的是在ImageNet的验证集上,通过MAE构造出来的图片。左边一列是把图片80%的块都遮住,中间一列是MAE构造出来的图片,右边一列是原始图片。

效果图

3 MAE算法

整体流程和第2章节里提到的一样,这里介绍一下如何重构出原始的像素。

解码器的最后一层是一个线性层,如果一块图片是16×16的像素的话,那么这个线性层就会投影到维度是256的向量,然后再将它reshape成所想要的16×16的维度,就能还原出原始的像素信息了。

损失函数用的是MSE,和BERT一样,只在被盖住的块上面使用MSE,没有被盖住的不计算损失,因为输入已经看到了这些块的像素信息了。

简单实现:将所有的块shuffle后,保留前面25%的块,其他块丢掉;然后重新unshuffle还原回原来的顺序,这样在计算MSE的时候就能对应回原图来计算了。通过shuffle和unshuffle的操作,能使得我们不需要任何的稀疏的操作,在实现起来非常的快。

4 总结

这篇文章利用ViT来做跟BERT一样的自监督学习,在ViT的基础上提出了三点:

  1. 需要盖住更多的块,使得剩下的那些块,块与块之间的冗余度没那么高,这样整个任务就变得复杂一点。
  2. 使用Transformer架构的解码器,直接还原原始的像素信息,使得整个流程更加简单一点。
  3. 加上在ViT工作之后的各种技术,使得它的训练更加鲁棒一点。

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

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

相关文章

WebGL vendor [显卡]指纹

一、WebGL vendor:(厂商) Google Inc. (NVIDIA) c定义在 third_party\angle\src\libANGLE\Display.cpp 格式化Google Inc.字符在Display::initVendorString()函数里面,可以在此修改值。 void Display::initVendorString() {mVendorString …

PCL点云处理之判断点在多边形内外--方法1 (二百四十二)

PCL点云处理之判断点在多边形内外--方法1 (二百四十二) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 这里实现一种判断点与多边形位置关系的算法,具体使用前可能需要验证!!!,这里只做了有限的测试用于参考,代码实现不依赖其他库,使用接口直接看给出示例即可,注意…

stable diffusion实践操作-大模型介绍:SD的发展历史,SD1.5和SDXL之间的差别

大家有没有这样的困惑:在找模型时,老是会出现一些奇怪的标签,像 sd1.5、sdxl 之类的模型后缀,真让人摸不着头脑,一会儿 1.0,一会儿 1.5,一会儿 XL,完全搞不清楚状况。今天就来给大家…

网络编程第二课

预备知识 1、操作系统的用户态和内核态: 用户态指的是用户自己定义工作空间,自己申请变量、定义函数的操作。 内核态指把一些工作交给操作系统去玩成,用户本身看不到执行过程,只能获取操作系统最后执行完成的结果。其中&#x…

Spring中@Transactional注解与事务传播机制

文章目录 事务传播机制事务失效的场景 事务传播机制 事务的传播特性指的是 当一个事务方法调用另一个事务方法时,事务方法应该如何执行。 事务传播行为类型外部不存在事务外部存在事务使用方式REQUIRED(默认)开启新的事务融合到外部事务中Transactional(propagati…

Python酷库之旅-第三方库Pandas(252)

目录 一、用法精讲 1191、pandas.tseries.offsets.BusinessMonthBegin.n属性 1191-1、语法 1191-2、参数 1191-3、功能 1191-4、返回值 1191-5、说明 1191-6、用法 1191-6-1、数据准备 1191-6-2、代码示例 1191-6-3、结果输出 1192、pandas.tseries.offsets.Busine…

IO流之文件

1. 文件流 2. 常用文件操作 2.1 文件创建 方式1 new File(String pathname) // 根据路径创建一个File对象 方式2 new File(File parent,String child) //根据父目录文件子路径构建 方式3 new File(String parent,String child) //根据父目录子路径构建 package com.hspedu.fil…

【从零开始的LeetCode-算法】35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入: …

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换: 具有相近的类型才能进行互相转换,如:int,char,double都表示数值。 2. 强制类型转换:能隐式类型转换就能强制类型转换,隐式类型之间的转换类型强相关,强制类型转换…

深度学习7 梯度下降优化、过拟合、手机价格预测

三、BP算法 3、梯度下降 w w - lr * grad: w 表示权重,lr表示学习率,grad表示梯度 传统下降方式分三类:(BGD)批量梯度下降、(MBGD)小批量梯度下降、(SGD)随…

计算机的错误计算(一百七十二)

摘要 探讨 MATLAB 对于算式 的计算误差。 例1. 在 MATLAB 中计算 的值。 直接贴图吧: 这样,MATLAB 的输出中只有3位正确数字,有效数字的错误率为 (16-3)/16 81.25% . 因为16位的正确输出为 0.2971242332737277e-18(ISReals…

手撸了一个文件传输工具

在日常的开发与运维中,文件传输工具是不可或缺的利器。无论是跨服务器传递配置文件,还是快速从一台机器下载日志文件,一个高效、可靠且简单的文件传输工具能够显著提高工作效率。今天,我想分享我自己手撸一个文件传输工具的全过程…

Linux系统编程之进程创建

概述 在Linux系统中,通过创建新的进程,我们可以实现多任务处理、并发执行和资源隔离等功能。创建进程的主要方法为:fork、vfork、clone。下面,我们将分别进行介绍。 fork fork是最常用的创建新进程的方法。当一个进程调用fork时&a…

【人工智能】用Python实现卷积神经网络(CNN)进行图像分类:从零开始的深度学习教程

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 卷积神经网络(CNN)是处理图像分类任务的核心工具,它通过卷积操作和池化机制提取图像的特征并实现分类。本文将手把手教你如何使用 Python 和深度学习框架(PyTorch)从头实现一个 CNN 模型,应用于图像…

深入探讨NIO

目录 传统阻塞IO 非阻塞IO select() epoll 总结 传统阻塞IO 非阻塞IO IO多路复用select() IO多路复用epoll 传统阻塞IO 在传统的阻塞IO模型中,当一个线程执行到IO操作(如读取数据)时,如果数据尚未准备好,它会…

新手参加2025年CTF大赛——Web题目的基本解题流程

CTF(Capture the Flag)是网络安全比赛中的一种常见形式,参赛者需要通过破解题目、发现漏洞并获取flag(标志)来获得分数。 这些问题涉及多个领域,如逆向工程、Web安全、密码学、二进制漏洞、取证分析等。CTF…

1Panel 自建邮局 - Docker Mailserver

本文首发于 Anyeの小站,点击链接 访问体验更佳 前言 首先发一段劝退说辞:我相信点进本文的人自建邮局的目的更多地是为了能用自己的域名邮箱,收发邮件? 仅收不发,推荐使用 https://www.cloudflare.com/zh-cn/develop…

QT-thread2种方式选择的优劣对比

1.第一种方式:使用 QObject 的 moveToThread() QObjectQthread class MessageWriter : public QObject {Q_OBJECT public slots:void writeDataToFile(); };threadMsgExchange new QThread();MessageWriter *writer new MessageWriter();writer->moveToThread…

【Maven】功能和核心概念

1. 什么是Maven 1.1 Maven的概念 Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。 1.2 为什么要使用Maven? 在项目开发中,我们需要引用各种 jar 包,引用的 jar 包可能有…

Go运行Grule引擎实现计费规则管理

Go运行Grule引擎实现计费规则管理 github位置: https://github.com/hyperjumptech/grule-rule-engine # 安装grule模块 go get -u github.com/hyperjumptech/grule-rule-engineGrule的示例代码 示例位置: https://github.com/hyperjumptech/grule-rule-engine/tree/master/e…