首页 > 其他分享 >mobileViT-V2-线性自注意力计算

mobileViT-V2-线性自注意力计算

时间:2024-11-15 19:57:04浏览次数:1  
标签:dim mobileViT drop patch V2 线性 embed self out

paper

class LinearSelfAttention(nn.Module):
    """
    This layer applies a self-attention with linear complexity, as described in `https://arxiv.org/abs/2206.02680`
    This layer can be used for self- as well as cross-attention.
    Args:
        embed_dim (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`
        attn_drop (float): Dropout value for context scores. Default: 0.0
        bias (bool): Use bias in learnable layers. Default: True
    Shape:
        - Input: :math:`(N, C, P, N)` where :math:`N` is the batch size, :math:`C` is the input channels,
        :math:`P` is the number of pixels in the patch, and :math:`N` is the number of patches
        - Output: same as the input
    .. note::
        For MobileViTv2, we unfold the feature map [B, C, H, W] into [B, C, P, N] where P is the number of pixels
        in a patch and N is the number of patches. Because channel is the first dimension in this unfolded tensor,
        we use point-wise convolution (instead of a linear layer). This avoids a transpose operation (which may be
        expensive on resource-constrained devices) that may be required to convert the unfolded tensor from
        channel-first to channel-last format in case of a linear layer.
    """

    def __init__(
        self,
        embed_dim: int,
        attn_drop: float = 0.0,
        proj_drop: float = 0.0,
        bias: bool = True,
    ) -> None:
        super().__init__()
        self.embed_dim = embed_dim

        self.qkv_proj = nn.Conv2d(
            in_channels=embed_dim,
            out_channels=1 + (2 * embed_dim),
            bias=bias,
            kernel_size=1,
        )
        self.attn_drop = nn.Dropout(attn_drop)
        self.out_proj = nn.Conv2d(
            in_channels=embed_dim,
            out_channels=embed_dim,
            bias=bias,
            kernel_size=1,
        )
        self.out_drop = nn.Dropout(proj_drop)

    def _forward_self_attn(self, x: torch.Tensor) -> torch.Tensor:
        # [B, C, P, N] --> [B, h + 2d, P, N]
        qkv = self.qkv_proj(x)

        # Project x into query, key and value
        # Query --> [B, 1, P, N]
        # value, key --> [B, d, P, N]
        query, key, value = qkv.split([1, self.embed_dim, self.embed_dim], dim=1)

        # apply softmax along N dimension  query 是一个 Batch大小 1通道  每个patch内若干个值 多个patch 的结构 这个softmax会让每个patch内的值和为1
        context_scores = F.softmax(query, dim=-1)
        context_scores = self.attn_drop(context_scores)

        # Compute context vector
        # [B, d, P, N] x [B, 1, P, N] -> [B, d, P, N] --> [B, d, P, 1]  这里会触发广播机制  然后每个通道里的所有patch都压缩到一个patch上 可以将这个patch看做这一层的代表
        context_vector = (key * context_scores).sum(dim=-1, keepdim=True)

        # combine context vector with values
        # [B, d, P, N] * [B, d, P, 1] --> [B, d, P, N]  将每个通道里的所有patch和这通道的代表patch相乘,就能将每个patch和全局的patch关联起来
        out = F.relu(value) * context_vector.expand_as(value)
        out = self.out_proj(out)
        out = self.out_drop(out)
        return out

标签:dim,mobileViT,drop,patch,V2,线性,embed,self,out
From: https://www.cnblogs.com/plumIce/p/18548566

相关文章

  • MobileViT-v1-所有patch内相对位置相同的token之间计算自注意力
    paperdefmy_self(x:torch.Tensor):'''通过这段代码可以把每张图片图片中相对位置相同的若干个tokens放到最后两个维度'''#[B,C,H,W]->[B,C,n_h,p_h,n_w,p_w]#n_h是高度方向上可以分多少个patchp_hpatch的高度n_w宽度方向上可以......
  • 【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考
    一、引言在当今科技迅速发展的时代,声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITSV2作为一种声音克隆工具,正逐渐进入人们的视野,它在多个领域展现出巨大的潜力,同时也引发了一系列值得深入探讨的问题。本文旨在介绍GPT-SoVITSV2的技术原理、应用领域及其带来......
  • 界面控件DevExpress Blazor UI v24.1新版亮点 - 全新PDF Viewer等组件
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。DevExpress Blazor控件目前已经升级到v24.1版本了,此版本发布了全新的PDF......
  • 探索线性插值:从原理到应用
    目录引言1.线性插值的基本概念2.线性插值的数学公式3.线性插值的示意图4.线性插值的应用场景  (1)图形处理  (2)数据填补  (3)动画制作5.使用Python实现线性插值  代码说明6.线性插值的优缺点7.线性插值的拓展方法8.总结引言  ......
  • 界面控件DevExpress Blazor UI v24.1新版亮点 - 全新PDF Viewer等组件
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。DevExpress Blazor控件目前已经升级到v24.1版本了,此版本发布了全新的PDF查......
  • vue3 h函数应用,el-table-v2定义column
    一、引入import{h}from'vue'二、column属性cellRenderer使用h函数h函数中嵌套Element组件Popconfirm{title:'注释',width:165,flexGrow:1,key:"str",dataKey:"str",cellRenderer:({rowData}:any)=>{......
  • 【数学】线性代数知识点总结
    0.前言线性代数是数学的一个分支,线性代数的研究对象是向量、向量空间(又称线性空间),线性变换和有限维的线性方程组。即线性代数主要处理线性关系问题,线性关系即数学对象之间的关系是以一次形式来表达的。线性(Linear)是指量与量之间按比例、成直线的关系,在数学上可以理解为一......
  • Invicti v24.11.0 发布,新增功能概览
    Invictiv24.11.0forWindows-Web应用程序安全测试InvictiStandardv24.11.0–12Nov2024请访问原文链接:https://sysin.org/blog/invicti/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgInvicti是一种自动化但完全可配置的Web应用程序安全扫描程序,使您......
  • 4.2二阶线性齐次常微分方程在正常点附近邻域内的级数解法
    二阶线性齐次常微分方程的标准形式\[\frac{d^2u(z)}{dz^2}+p(z)\frac{du(z)}{dz}+q(z)u(z)=0\]方程的正常点:\(p(z)\)和\(q(z)\)在该点及其邻域内解析方程的孤立奇点:该点为\(p(z)\)和\(q(z)\)的孤立奇点方程的正则奇点:该奇点最多为\(p(z)\)的单极点及\(q......
  • 4.1 线性齐次常微分方程解的相关性
    如存在不全为零的数\(\{\lambda_i;i=1,2,3,\cdots,n\}\),使得对于任意可能的自变量\(z\),以下式子均成立\[\sum_{i=1}^n\lambda_i\phi_i(z)=0\]则该组函数是线性相关的。\(\lambda_i\)不全为零的条件是朗斯基行列式为零:\[\begin{vmatrix}\phi_1(z)&\phi_2(z)......