【自监督-MIM】系列方法学习二

Masked image modeling 是一种训练深度学习模型的技术,尤其是在视觉领域,类似于自然语言处理中的掩码语言建模(Masked Language Modeling)。它通过在输入图像中随机遮挡(或称为掩码)部分区域,然后训练模型来预测这些被遮挡部分的内容,从而提高模型的视觉理解能力。

Masked image modeling 主要用于视觉自监督学习(Visual Self-Supervised Learning)任务,帮助模型学习图像的内在结构和表示,而无需依赖大量的标注数据。

BEIT: BERT Pre-Training of Image Transformers

具体来说,在我们的预训练中,每个图像都有两个视图,即patch image(如16×16像素)和visual token(即离散标记)。我们首先将原始图像“tokenizer”为视觉标记。然后,我们随机mask some image patches,并将它们输入Transformer。预训练的目标是基于corrupted image 恢复原始视觉标记。在预训练BEIT之后,我们通过在预训练的编码器上附加任务层来直接微调下游任务的模型参数。

注:模型学习恢复原始图像的视觉标记,而不是掩码块的原始像素。
请添加图片描述

对于重建目标,BEiT 并没有使用原始的像素,而是通过一个 “image tokenizer” 进行离散化,遵循的是 dVAE 的思路,在 BEiT 预训练之前,先构建 “tokenizer” 和 “decoder” 进行 dVAE 的训练,并构建视觉词汇表,词表大小为8192。在 BEiT 中是直接采用 Zero-shot text-to-image generation 文章开源的代码进行训练。论文中掩码比例为40%,直接使用pixel-level auto-encoding像素级的自动编码(recovering the pixels of masked patches)进行视觉预训练,促使模型关注short-range dependencies和 high-frequency details。

实验

请添加图片描述
在这里插入图片描述


MAE:Masked Autoencoders Are Scalable Vision Learners

任务:对输入图像的随机mask image patch,并重建丢失的像素。

MAE 基于两大主要设计:一是采用了非对称结构的编码-解码器,其中编码器只计算非掩码图像块,同时采用了轻量化的解码器设计;二是mask大部分的图像块,如掩码概率为 75%,可以获得更加具有意义的自监督训练任务。
在这里插入图片描述
去噪自动编码器(DAE)[58]是一类破坏输入信号并学习重建原始未破坏信号的自动编码器。

Reconstruction target.
我们的MAE通过预测每个掩码补丁的像素值来重建输入。解码器输出中的每个元素都是表示补丁的像素值的矢量。解码器的最后一层是一个线性投影,其输出通道的数量等于补丁中像素值的数量。解码器的输出被重新整形以形成重建的图像。我们的损失函数计算像素空间中重构图像和原始图像之间的均方误差(MSE)。我们只计算mask patch的损失,类似于BERT[14]。

我们还研究了一种变体,其重建目标是每个masked patch的归一化像素值。具体来说,我们计算一个patch中所有像素的平均值和标准偏差,并使用它们来规范化这个patch。在我们的实验中,使用归一化像素作为重建目标提高了表示质量。

Simple Implementation.
image --> randomly shuffle the list of tokens remove the last portion of the list,based on the masking ratio.首先,我们为每个输入补丁生成一个令牌(通过添加位置嵌入的线性投影)。接下来,我们随机打乱令牌列表,并根据掩码比率删除列表的最后一部分。

在这里插入图片描述

消融实验
在这里插入图片描述
Mask token.
我们的MAE的一个重要设计是跳过编码器中的掩码令牌[M],稍后将其应用于轻量级解码器。如果编码器使用掩码标记,其性能会更差:在linear probing中,其精度会下降14%。

Data augmentation.
我们的MAE使用only-crop增强效果良好,无论是固定大小还是随机大小(均具有随机水平翻转)。添加颜色抖动会降低结果,因此我们不会在其他实验中使用它。

没有证据表明对比学习可以在没有增强的情况下工作:图像的两个视图是相同的,并且可以很容易解决。

在这里插入图片描述

请添加图片描述

代码实现

MAE-Pytorch核心思想随机生成一个NXL的nosie,然后对齐进行排序选取其中百分之75%的patch个数,同时维护一个ids_restore用于在decoder重新排序patch。

# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# --------------------------------------------------------
# References:
# timm: https://github.com/rwightman/pytorch-image-models/tree/master/timm
# DeiT: https://github.com/facebookresearch/deit
# --------------------------------------------------------from functools import partialimport torch
import torch.nn as nnfrom timm.models.vision_transformer import PatchEmbed, Blockfrom util.pos_embed import get_2d_sincos_pos_embedclass MaskedAutoencoderViT(nn.Module):""" Masked Autoencoder with VisionTransformer backbone"""def __init__(self, img_size=224, patch_size=16, in_chans=3,embed_dim=1024, depth=24, num_heads=16,decoder_embed_dim=512, decoder_depth=8, decoder_num_heads=16,mlp_ratio=4., norm_layer=nn.LayerNorm, norm_pix_loss=False):super().__init__()# --------------------------------------------------------------------------# MAE encoder specificsself.patch_embed = PatchEmbed(img_size, patch_size, in_chans, embed_dim)num_patches = self.patch_embed.num_patchesself.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim))self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, embed_dim), requires_grad=False)  # fixed sin-cos embeddingself.blocks = nn.ModuleList([Block(embed_dim, num_heads, mlp_ratio, qkv_bias=True, qk_scale=None, norm_layer=norm_layer)for i in range(depth)])self.norm = norm_layer(embed_dim)# --------------------------------------------------------------------------# -------------------------------------------------------

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

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

相关文章

linux应用开发基础知识(七)——管道和消息队列进程通信

管道通信 匿名管道 #include <unistd.h> int pipe(int pfd[2]);pfd[0]用于读管道&#xff0c;而pdf[1]用于写管道。 注意&#xff1a;匿名管道只能用于亲缘关系的进程之间通信。管道通道是单向的&#xff0c;一边读&#xff0c;另一边写。管道可以用于大于两个进程共…

怎么使用python进行整除取余求幂

怎么使用python进行整除取余求幂&#xff1f; 整除法是//&#xff0c;称为地板除&#xff0c;两个整数的除法仍然是整数。 10//33 3 求模运算是%&#xff0c;相当于mod&#xff0c;也就是计算除法的余数。 5%2 1 求幂运算使用两个连续的*&#xff0c;幂运算符比取反的优先级高…

2024 最新推广服务 API 推荐,助力业务腾飞

在数字化营销的浪潮中&#xff0c;API 服务正以其强大的功能和高效的特性&#xff0c;成为企业和开发者们实现精准推广、优化营销效果的得力助手。2024 年的今天&#xff0c;各种创新的 API 服务层出不穷&#xff0c;为广告投放、数据洞察等领域带来了前所未有的机遇。在接下来…

atcoder ABC 358-C题详解

atcoder ABC 358-C题详解 Problem Statement In AtCoder Land, there are N popcorn stands numbered 1 to N. They have M different flavors of popcorn, labeled 1,2,…,M, but not every stand sells all flavors of popcorn. Takahashi has obtained information about…

数字设计的秘密:原来有这么多创意玩法!

数字产品设计涵盖了各种学科和角色&#xff0c;但主要是人与数字设备或数字界面之间的互动。数字设计的两个主要部分是用户体验设计&#xff08;UX&#xff09;和用户界面设计&#xff08;UI&#xff09;。如果把数字产品的设计想象成人体&#xff0c;那么骨架就是代码&#xf…

从0-1搭建一个web项目vue3+vite+ts+element-plus(脚手架分析)

本章分析从0-1的搭建脚手架依赖 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等功能。感兴趣的小伙伴可以访问源码点个…

结构体(二)

今天来继续介绍我们有关结构体的相关知识 结构体的自引用 结构体的自引用&#xff0c;顾名思义嘛&#xff0c;就是在我们的结构体中再次引用该结构体&#xff0c;这一点跟我们的函数递归有异曲同工之妙&#xff0c;不了解函数递归的小伙伴可以移步到我之前做过的一期&#xf…

GPTCache:革新大模型缓存,降低成本,提升效率

GPTCache介绍 随着应用程序越来越受欢迎并遇到更高的流量水平,与 LLM API 调用相关的费用可能会变得相当可观。此外,LLM 服务的响应时间可能会很慢,尤其是在处理大量请求时。GPTCache是一个致力于构建用于存储 LLM 响应的语义缓存的项目。 项目架构 数字人助力传统客服 1…

效率神奇分享

嘿宝贝们&#xff01;&#x1f44b; 知道吗&#xff1f;工作效率高不高&#xff0c;其实跟你用的工具有很大关系哦&#xff01;今天小红书种草专家来给大家安利五款超实用的国产工作app&#xff0c;让你的工作生活轻松又高效&#xff01;&#x1f680; 1️⃣ 【亿可达】&#…

植物大战僵尸杂交版技巧大全(附下载攻略)

《植物大战僵尸杂交版》为策略游戏爱好者带来了全新的挑战和乐趣。如果你是新手玩家&#xff0c;可能会对游戏中的植物和僵尸感到困惑。以下是一些实用的技巧&#xff0c;帮助你快速掌握游戏并享受其中的乐趣。 技巧一&#xff1a;熟悉基本玩法 游戏的基本玩法与原版相似&…

Spring Boot中的零停机升级策略

Spring Boot中的零停机升级策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Spring Boot应用中实现零停机升级策略&#xff0c;确保在升…

【Android】多种方式实现截图(屏幕截图、View截图、长图)

目录 一、截图原理二、实现方式1. View截图2. WebView截图3. 屏幕截图 三、格式转换方法 一、截图原理 我们的手机一般同时按下音量-键和电源键就会将当前屏幕显示的内容截取下来&#xff0c;那里面具体经过哪些流程呢&#xff1f; Android中每一个页面都是一个Activity&#…

精通Vim替换艺术:深入探索替换模式的奥秘

&#x1f504; 精通Vim替换艺术&#xff1a;深入探索替换模式的奥秘 &#x1f3a8; Vim&#xff0c;这个源自伯克利的编辑器&#xff0c;以其强大的功能和灵活性在开发者和系统管理员中广受欢迎。在Vim中&#xff0c;替换模式是编辑文本时不可或缺的一部分&#xff0c;它允许我…

Java洗鞋小程序预约系统源码

&#x1f4a5;洗鞋神器来袭&#xff01;轻松预约&#xff0c;让你的鞋子焕然一新&#x1f45f; &#x1f389; 告别洗鞋烦恼&#xff0c;洗鞋预约小程序来啦&#xff01; 你是不是常常为洗鞋而烦恼&#xff1f;手洗太累&#xff0c;送去洗衣店又贵又麻烦。现在&#xff0c;好…

std::enable_if和std::is_base_of

std::enable_if,其主要为了完成模板特偏化&#xff0c;有两个参数&#xff0c;第一个为布尔值类型&#xff0c;第二个如果布尔值为true&#xff0c;其为默认空值&#xff0c;如果已经赋值&#xff0c;则为对应的类型。 std::is_base_of&#xff0c;其一共存在两个参数&#xff…

外汇的基本面分析需要关注什么?

外汇基本面分析的核心在于关注可能影响单一货币供求及国家货币价值的经济、社会和地缘政治事件与趋势。但值得注意的是&#xff0c;这些事件和因素往往具有更广泛的影响力&#xff0c;不仅限于单一国家。它们可能是影响整个地区或国家集团的重要事件&#xff0c;甚至一些事件&a…

使用docker搭建lnmp环境

近期闲来无事&#xff0c;用公司电脑部署了一套环境&#xff0c;记录一下部署经过和踩的坑。 Nginx 1、拉取镜像&#xff0c;需要使用镜像创建容器 拉取的Nginx版本可以自己设&#xff0c;我是用的nginx:latest // 拉取镜像 docker pull nginx:1.18.01.18.0: Pulling from …

差分数组与树上差分

假设我们现在需要维护一段区间&#xff0c;实现对一段区间[L,R]的数的加/减&#xff0c;以及对区间中某个数的查询 最简单的方法把这段区间的数都记录到数组a[N]中&#xff0c;每次修改都对区间[L,R]的每一个数进行加减操作&#xff0c;然后在查询第k个数的时候返回a[k] 在上…

数学建模 —— MATLAB中的矩阵(下)

目录 矩阵的拼接 矩阵的重复 矩阵的重构和重新排列 (1)reshape 函数 (2)sort 函数 (3)sortrows 函数 (4)flip / fliplr / flipud 函数 (5)rot90 函数 矩阵的拼接 有时候我们需要对多个矩阵进行拼接&#xff0c;变成一个大的矩阵。根据矩阵拼接的方向&#xff0c;我们可 …

C++性能优化篇:深拷贝、浅拷贝与移动构造

引言 最近在做性能优化&#xff0c;遇到了一个明显的性能问题&#xff0c;就是在大量数据做深拷贝的时候&#xff0c;程序耗时严重&#xff0c;几乎三分之一的时间都耗在了这里。于是乎仔细看了下此处的代码&#xff0c;发现这些深拷贝完全可以避免。 深拷贝、浅拷贝与移动构…