论文阅读笔记——ViT

经典论文阅读笔记——VIT、Swin Transformer、MAE、CILP   本博客针对视觉Transformer方面的工作,对当前热点研究做一下总结。主要是VIT、Swin Transformer、MAE、CILP 这四篇。 VIT(用于图像分类)   ViT(vision transformer)是Google在2020年提出的直接将transformer应用在图像分类的模型,后面很多的工作都是基于ViT进行改进的。   ViT的思路很简单:直接把图像分成固定大小的patchs,然后通过线性变换得到patch embedding,这就类比NLP的words和word embe 阅读详情

在这里插入图片描述

ViT Block

  • Patch Embedding(将视觉问题转化为 seq2seq):假设输入图片为 224 * 224,将图片分为固定大小 patch=16 * 16,则每张图片生成 224 * 224 / 16 * 16 = 196个patch,即输入序列长度为196(dim=16 * 16 * 3= 768),那么线性投影层维度为 768 * N(N=768),故通过线性投影层厚为 196 * 768(196个token,每个token维度768),为模仿 BERT,加上特殊字符 cls,故最终为 197 * 768
  • Positional Embedding:位置编码与 patch 为 sum关系,故仍未 197 * 768
  • LN/Multi-Head Attention/LN:多头自注意力时,将输入映射到qkv,如果有12个头,则qkv维度为197 * 64(768 / 12 = 64),最后将12组的qkv拼接起来,仍然为 197 * 768
  • MLP:将 197 * 768 放大为 197 * 3072,再缩小为 197 * 768
    TheMLPcontainstwolayerswithaGELUnon−linearity.z0=[xclass;xp1E;xp2E;⋯ ;xpNE]+Epos,IE∈R(P2⋅C)×D,Epos∈R(N+1)×D(1)z′ℓ=MSA(LN(zℓ−1))+zℓ−ℓ=1…L(2)zℓ=MLP(LN(z′ℓ))+z′ℓ,ℓ=1…L(3)y=LN(zL0)(4)\begin{aligned} The \quad MLP \quad contains \quad &two \quad layers\quad with \quad a \quad GELU \quad non-linearity. \\&\mathbf{z}_0=[\mathbf{x}_\mathrm{class};\mathbf{x}_p^1\mathbf{E};\mathbf{x}_p^2\mathbf{E};\cdots;\mathbf{x}_p^N\mathbf{E}]+\mathbf{E}_{pos},\quad\mathbf{I}&\mathbf{E}\in\mathbb{R}^{(P^{2}\cdot C)\times D},\mathbf{E}_{pos}\in\mathbb{R}^{(N+1)\times D} &&(1) \\&\mathrm{z'}_{\ell}=\mathrm{MSA}(\mathrm{LN}(\mathbf{z}_{\ell-1}))+\mathbf{z}_{\ell-}&\ell=1\ldots L&&(2) \\&\mathbf{z}_\ell=\mathrm{MLP}(\mathrm{LN}(\mathbf{z^{\prime}}_\ell))+\mathbf{z^{\prime}}_\ell,&\ell=1\ldots L&&(3) \\&\mathbf{y}=\mathrm{LN}(\mathbf{z}_L^0) &(4) \end{aligned}TheMLPcontains​twolayerswithaGELUnon−linearity.z0​=[xclass​;xp1​E;xp2​E;⋯;xpN​E]+Epos​,Iz′ℓ​=MSA(LN(zℓ−1​))+zℓ−​zℓ​=MLP(LN(z′ℓ​))+z′ℓ​,y=LN(zL0​)​E∈R(P2⋅C)×D,Epos​∈R(N+1)×Dℓ=1…Lℓ=1…L(4)​​(1)(2)(3)​

相比于 CNN 的优势

  • 捕捉全局特征
  • 适应不同输入尺寸

当拥有足够多的数据进行训练时,ViT 的表现会超过 CNN;当数据量不够时,ViT 的表现弱于 CNN,因为 transformer 相比于 CNN 缺少局部性和平移不变性两种假设

代码实例

class AddPositionEmbs(nn.Module):
	# posemb_init: 一个可调用对象,用于初始化位置嵌入矩阵。它接受PRNGKey(随机数生成器密钥)、Shape(形状)和Dtype(数据类型)作为参数,并返回一个Array(数组)
    posemb_init: Callable[[PRNGKey, Shape, Dtype], Array]
    param_dtype : Dtype = jnp.float32 # 参数的数据类型,默认为jnp.float32
    
    @nn.compact
    def __call__(self, inputs):
        assert inputs.ndim == 3, f'Expected (batch, seq, hidden) got {inputs.shape}' # inputs (batch_size, seq_len, emb_dim)
        pos_emb_shape = (1, inputs.shape[1], inputs.shape[2]) # 位置嵌入 (1, seq_len, emb_dim)
        pe = self.param('pos_embedding', self.posemb_init, pos_emb_shape, self.param_dtype)
        return inputs + pe
class MlpBlock(nn.Module):
    """Transformer MLP / feed-forward block."""

    mlp_dim: int
    dtype: Dtype = jnp.float32
    param_dtype: Dtype = jnp.float32
    out_dim: Optional[int] = None
    dropout_rate: float = 0.1
    kernel_init: Callable[[PRNGKey, Shape, Dtype], Array] = nn.initializers.xavier_uniform()
    bias_init: Callable[[PRNGKey, Shape, Dtype], Array] = nn.initializers.normal(stddev=1e-6)

    @nn.compact
    def __call__(self, inputs, *, deterministic):
    	# 全连接 + gelu + Dropout + 全连接 + Dropout
        actual_out_dim = inputs.shape[-1] if self.out_dim is None else self.out_dim
        x = nn.Dense(features=self.mlp_dim, dtype=self.dtype, param_dtype=self.param_dtype,
                     kernel_init=self.kernel_init, bias_init=self.bias_init)(inputs)
        x = nn.gelu(x)
        x = nn.Dropout(rate=self.dropout_rate)(x, deterministic=deterministic)
        output = nn.Dense(features=actual_out_dim, dtype=self.dtype, param_dtype=self.param_dtype,
                          kernel_init=self.kernel_init, bias_init=self.bias_init)(x)
        output = nn.Dropout(rate=self.dropout_rate)(output, deterministic=deterministic)
        return output
class Encoder1DBlock(nn.Module):
    """Transformer encoder layer."""

    mlp_dim: int
    num_heads: int
    dtype: Dtype = jnp.float32
    dropout_rate: float = 0.1
    attention_dropout_rate: float = 0.1

    @nn.compact
    def __call__(self, inputs, *, deterministic):
    	# 层归一化 + 多头自注意力 + Dropout + 残差链接 + 层归一化 + MLP + 残差链接
        assert inputs.ndim == 3, f'Expected (batch, seq, hidden) got {inputs.shape}'
        x = nn.LayerNorm(dtype=self.dtype)(inputs)
        # 多头自注意力
        x = nn.MultiHeadDotProductAttention(dtype=self.dtype, kernel_init=nn.initializers.xavier_uniform(), # 权重初始化方法
                                            broadcast_dropout=False,  # 是否广播 Dropout
                                            deterministic=deterministic, # 是否启用 Dropout
                                            dropout_rate=self.attention_dropout_rate, num_heads=self.num_heads)(x, x)
        x = nn.Dropout(rate=self.dropout_rate)(x, deterministic=deterministic)
        x = x + inputs

        y = nn.LayerNorm(dtype=self.dtype)(x)
        y = MlpBlock(mlp_dim=self.mlp_dim, dtype=self.dtype, dropout_rate=self.dropout_rate)(y, deterministic=deterministic)
        return x + y
# Transformer Encoder
class Encoder(nn.Module):
    """Transformer Model Encoder for sequence to sequence translation."""

    num_layers: int
    mlp_dim: int
    num_heads: int
    dropout_rate: float = 0.1
    attention_dropout_rate: float = 0.1
    add_position_embedding: bool = True

    @nn.compact
    def __call__(self, x, *, train):
        assert x.ndim == 3, f'Expected (batch, len, emb) got {x.shape}
        # 是否添加位置嵌入'
        if self.add_position_embedding:
            x = AddPositionEmbs(posemb_init=nn.initializers.normal(stddev=0.02))(x)
            x = nn.Dropout(rate=self.dropout_rate)(x, deterministic=not train)

        for lyr in range(self.num_layers):
            x = Encoder1DBlock(mlp_dim=self.mlp_dim, dropout_rate=self.dropout_rate,
                               attention_dropout_rate=self.attention_dropout_rate,
                               num_heads=self.num_heads)(x, deterministic=not train)
        encoded = nn.LayerNorm(name='encoder_norm')(x)
        return encoded

将输入图像通过可选的 ResNet 预处理阶段提取特征,然后将图像分割成 patch 并嵌入到 Transformer 可处理的序列中。通过 Transformer 编码器对序列进行编码后,根据分类器的类型(如 token、gap 等)提取特征表示,最后通过全连接层输出分类结果。该模型支持添加类别 token、全局平均池化等操作,并可选择是否在 Transformer 前使用 ResNet 进行特征提取。

class VisionTransformer(nn.Module):
  """VisionTransformer."""

  num_classes: int
  patches: Any
  transformer: Any
  hidden_size: int
  resnet: Optional[Any] = None
  representation_size: Optional[int] = None
  classifier: str = 'token'
  head_bias_init: float = 0.
  encoder: Type[nn.Module] = Encoder
  model_name: Optional[str] = None

  @nn.compact
  def __call__(self, inputs, *, train):

    x = inputs
    # (Possibly partial) ResNet root.
    if self.resnet is not None:
      width = int(64 * self.resnet.width_factor)

      # Root block.
      x = models_resnet.StdConv(
          features=width,
          kernel_size=(7, 7),
          strides=(2, 2),
          use_bias=False,
          name='conv_root')(
              x)
      x = nn.GroupNorm(name='gn_root')(x)
      x = nn.relu(x)
      x = nn.max_pool(x, window_shape=(3, 3), strides=(2, 2), padding='SAME')

      # ResNet stages.
      if self.resnet.num_layers:
        x = models_resnet.ResNetStage(
            block_size=self.resnet.num_layers[0],
            nout=width,
            first_stride=(1, 1),
            name='block1')(
                x)
        for i, block_size in enumerate(self.resnet.num_layers[1:], 1):
          x = models_resnet.ResNetStage(
              block_size=block_size,
              nout=width * 2**i,
              first_stride=(2, 2),
              name=f'block{i + 1}')(
                  x)

    n, h, w, c = x.shape

    # We can merge s2d+emb into a single conv; it's the same.
    x = nn.Conv(
        features=self.hidden_size,
        kernel_size=self.patches.size,
        strides=self.patches.size,
        padding='VALID',
        name='embedding')(
            x)

    # Here, x is a grid of embeddings.

    # (Possibly partial) Transformer.
    if self.transformer is not None:
      n, h, w, c = x.shape
      x = jnp.reshape(x, [n, h * w, c])

      # If we want to add a class token, add it here.
      if self.classifier in ['token', 'token_unpooled']:
        cls = self.param('cls', nn.initializers.zeros, (1, 1, c))
        cls = jnp.tile(cls, [n, 1, 1])
        x = jnp.concatenate([cls, x], axis=1)

      x = self.encoder(name='Transformer', **self.transformer)(x, train=train)

    if self.classifier == 'token':
      x = x[:, 0]
    elif self.classifier == 'gap':
      x = jnp.mean(x, axis=list(range(1, x.ndim - 1)))  # (1,) or (1,2)
    elif self.classifier in ['unpooled', 'token_unpooled']:
      pass
    else:
      raise ValueError(f'Invalid classifier={self.classifier}')

    if self.representation_size is not None:
      x = nn.Dense(features=self.representation_size, name='pre_logits')(x)
      x = nn.tanh(x)
    else:
      x = IdentityLayer(name='pre_logits')(x)

    if self.num_classes:
      x = nn.Dense(
          features=self.num_classes,
          name='head',
          kernel_init=nn.initializers.zeros,
          bias_init=nn.initializers.constant(self.head_bias_init))(x)
    return x
Transformer论文阅读:ViT算法笔记 虽然Transformer结构已经成为自然语言处理任务的事实标准,但其在计算机视觉中的应用仍然有限。在视觉中,注意力要么与卷积网络结合使用,要么用于替换卷积网络的某些组件同时保持它们的整体结构。我们表明,这种对CNN的依赖不是必要的,直接用于图像块序列的纯Transformer可以在图像分类任务中表现得很好。当在大量数据上进行预训练,再迁移到多个中小型图像识别基准时,视觉变换器(Vision Transformer,ViT)与SOTA的卷积网络相比取得了优异的结果,并且需要的训练计算资源更少。 阅读详情

相关推荐

数仓 - 促销敏感度、评论敏感度

1. 促销敏感度 步骤1. 首先按照最后一次下单时间及有无复购情况将用户分为四大群体: 近一年有购物行为且复购的用户 -- L1 (今年复购用户) 近一年有购物行为但无复购的用户 --L2 (今年一单购用户) 最后一次下单时间在1年之前且有复购的用户 --L3 (今年无购且只有一单用户) 最后一次下单时间在1年之前但无复购的用户 -- L4 (今年无购多单用户) 步骤2. 每一类用户群再根据优惠订单占比、每单优惠金额占比的平均值、优惠金额这三个指标进行k-means聚类,分为: 非常敏感 -

weixin_41332009的博客 1899

【论文阅读】ViT阅读笔记

【论文阅读】ViT阅读笔记

zjutkarma的博客 482

内窥镜胶囊(胶囊内镜)硬件方案

内窥镜胶囊(胶囊内镜)硬件方案 前言 说明:该方案为作者2018年上半年完成的第一版,后来搁置了一段时间,才重启这个项目。目前(2020.07)第二版已经快要完成。[联系v:1#7#6#3#3#3#5#0#8#7#0]先给一下第一版和第二版的基本参数。 第一版: 续航时间:3h 帧率:0.5fps 尺寸:12mm * 25mm 角度:45° 第二版: 续航时间:12h 帧率:2-6fps 尺寸:9.8mm * 25mm 角度:130° 第一版属于尝试版,整体方案不是很成熟。第二版这个数据就非常优秀了。我拿了

CrekerLi的博客 4780

【第三十一周】ViT 论文阅读笔记

本篇博客介绍了Vision Transformer(ViT),这是一种突破性的图像分类模型,其核心思想是将图像分割为固定大小的块(如16×16像素),并将这些块序列化后输入标准的Transformer架构,从而替代传统卷积神经网络(CNN)对视觉特征的局部归纳偏置依赖。

m0_59510256的博客 1472

通讯软件013——分分钟学会Kepware OPC AE Server仿真配置

本文介绍如何使用Kepware软件仿真OPC AE Server配置。

zhouwl72的博客 2227

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

COMO-ViT论文阅读笔记

个人感觉,泰勒展开应该是没有加速效果的,不仅没有开源,也没有给这个的消融实验;同时呢,只给PSNR和SSIM是很少见的,LPIPS LOE FID NIQE都没有给,比PSNR也没有和LLFlow(25.42的PSNR)比。感觉发ICCV有点。。。

read, note and comment papers 1256

从零构建XVC协议栈:FPGA+W5300的跨界调试架构实战

本文详细介绍了如何从零构建XVC协议栈,通过FPGA与W5300以太网控制器的创新组合实现跨界调试架构。重点解析了JTAG时序逆向、TCP/IP协议栈集成与XVC协议实现,提供了硬件设计优化和性能加速技术,为嵌入式开发者和FPGA工程师提供实用的远程调试解决方案。

raspberrypi5的博客 247

VIT与changeformer论文阅读笔记

VIT主要就是引入transformer到CV中,众所周知transformer相当于是句子的输入,那么最主要的就是看如何将图像转为token序列,实际上是通过一个卷积层来实现的,如下图所示。

weixin_43013480的博客 661

MCAL中Dsadc的配置

DSADC模块作为一个专用的模块,主要应用在编码器软解码,功能强大而复杂,这里介绍了Dsadc的mcal配置和详细描述,让你全面学习和理解这个模块功能和应用。

dhyw12399999的博客 788

uniapp:实现圆盘/色盘取色器组件,圆环颜色选择器用户可拖拽选择颜色值实时更新用户选择的颜色数据,拖动丝滑流畅不卡顿(uniapp小程序/手机h5网页/安卓苹果app/nvue都能使用,详细源码)

uniapp项目中使用颜色选择器,uniapp实现简单圆形色盘、取色器、拾色器组件,Uniapp自定义颜色选择器取色器,圆形的颜色选择器,uniapp颜色拾取器,拾色器 取色器 颜色选择器,uniapp vue3圆形的色盘取色,uni-app如何封装一个取色器组件,用uniapp写调色板,uniapp颜色选择器插件,实现圆环颜色选择器,Uni-app在App端使用颜色选择器,uniapp微信小程序圆盘颜色选择,uniapp H5网页实现圆形的取色器,使用canvas实现的简单圆形色盘,可自定义相关大小,un

✅ 精选推荐文章 4534

ViT Transformer论文阅读笔记

首次提出使用transformer进行分类:把输入图像直接划分为token,位置编码为可学习的token,额外增加一个分类token,最后使用head预测。

tantanweiwei的专栏 367

智能车图像处理0-图像处理整体框架思路

1.总体框架如上所示,具体代码请查看后续文章。2.因为参与竞赛时间是大二,所以在编程中有许多不规范的地方(如变量的命名),大家见谅。3.原创文章,请勿侵权=-=

taiyuezyh的博客 1万+

Vit 中的 Token 改进版本:Token Mreging: Your Vit But Faster 论文阅读笔记

本文引入一种 Token 融合的方法(Token Merging — ToMe),在无需额外训练的情况下增强现有 ViT 的性能。具体来说在 transformer 中使用一个通用且轻量化的匹配算法来逐步融合相似的 tokens。在图像、视频、音频上的性能绝佳。

乄洛尘 4703

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【论文阅读笔记】Vit:VisionTransformer

纯粹的将transformer应用于图片patch序列,而不是使用attention连接到CNN中或替换一些部件在没有强正则化的中型数据集(如 ImageNet)上进行训练时比ResNet的性能要低一些:Transformer缺少CNN的一些先验条件,比如平移等效性和局部性。

weixin_62636846的博客 904

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VIT、CILP、Swin Transformer、MAE模型论文阅读笔记

本博客针对视觉Transformer方面的工作,对当前热点研究做一下总结。主要是VIT、Swin Transformer、MAE、CILP 这四篇。   有一句话说的很有道理,因此放在这篇博客最前面。为什么NLP领域的预训练模型很好用,但是图像领域的预训练模型就很一般?这因为我们在NLP领域中找到了非常棒的 pretext task (代理任务),比如回想一下bert,我们需要理解一句话的意思,知道语义信息,那么我们把其中一个词遮住,如果我们真的搞懂了这句话的意思,搞懂了语义信息,把这块补出来这是非常简单的

ASS-ASH的博客 687

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

论文阅读笔记:RepViT: Revisiting Mobile CNN From Vit Perspective

CVPR2024论文《RepViT: Revisiting Mobile CNN From Vit Perspective》阅读笔记

c2861024198的博客 2136

论文阅读笔记:Vision Transformer (ViT)

1. Vision Transformer Dosovitskiy, Alexey, et al. “An image is worth 16x16 words: Transformers for image recognition at scale.” arXiv preprint arXiv:2010.11929 (2020). 这是一篇奠定了Transformer在视觉领域击败传统卷积的文章,Transformer在NLP领域大放异彩之后,在视觉领域也取得了优异的效果,作者摒弃了所有的卷积操作,将

loki2018的博客 730

CVPR2022

(305条消息) 神经网络学习小记录67——Pytorch版 Vision Transformer(VIT)模型的复现详解_Bubbliiiing的博客-优快云博客 Deep SORT论文阅读笔记 - pprp - 博客园 (cnblogs.com) (295条消息) Deepsort源码详解及个人理解_LBJ_wz的博客-优快云博客_deepsort源码解析 (305条消息) 博士生在没有导师指导的情况下,该如何自己选题发 CVPR ?_3D视觉工坊的博客-优快云博客 (305条消息) C.

To be a better man 3867

论文阅读笔记《An image is worth 16x16 words》(ViT)

论文阅读笔记《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (ViT)》

qq_39346945的博客 339

[论文阅读笔记][CVPR2023]All are Worth Words: A ViT Backbone for Diffusion Models

探索在扩散模型中是否可以摆脱传统的基于卷积神经网络(CNN)的 U-Net 结构的依赖。

Xysxx的博客 1315

ViT ——AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(论文阅读笔记)

ViT 是Google团队于2021年发表在ICLR上的paper, 论文链接:https://arxiv.org/abs/2010.11929 摘要 虽然 Transformer 架构已成为自然语言处理任务事实上的标准,但其在计算机视觉中的应用仍然有限。 在视觉中,注意力要么与卷积网络结合使用,要么用于替换卷积网络的某些组件,同时保持其整体结构不变。 我们表明,这种对 CNN 的依赖是不必要的,直接应用于图像块序列的纯transformer可以在图像分类任务上表现得非常好。 当在大量数...

weixin_40671425的博客 3465

【论文阅读笔记10】小样本充电数据驱动的电池寿命预测——双流ViT与ESA

本文是对Liu等(2025)RUL预测论文的阅读笔记。该论文提出了DS-ViT-ESA模型——将15个充电循环的V/I/T/Q曲线构造为类图像矩阵,经双流ViT(原始流+差分流)融合后预测剩余寿命,仅用15个循环即可达到5.40%的MAPE。笔记分析了ESA的高效注意力机制、消融实验的关键结论,并结合BMS工程约束讨论了云端训练与边缘部署的差距。

m0_64385043的博客 661

【论文阅读笔记】ViT:An Image is worth 16X16 words: Transformers for image recognition at scale

一幅图像相当于16X16个字:用于大规模图像识别的TransformerICLR 2021 谷歌团队PaperCode虽然Transformer架构已成为自然语言处理任务的事实标准,但其在计算机视觉中的应用仍然有限。在视觉中,注意力要么与卷积网络结合使用,要么用于替换卷积网络的某些组件,同时保持其整体结构不变。本文证明了这种对CNN的依赖是不必要的,直接应用于图像块序列的纯Transformer可以在图像分类任务中表现得非常好。

qq_46056318的博客 1939

【DiT】Scalable Diffusion Models with Transformers

LayerNorm:channel方向做归一化,计算C*H*W的均值。BatchNorm:batch方向做归一化,计算N*H*W的均值。

2201_75801514的博客 292
下一篇: 论文阅读笔记——DiT
寻丶幽风
博客等级 码龄5年 656粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值