【ViT】Vision Transformer的实现01 patch embedding

在这里插入图片描述
对于224*224的图像,将它输入到Transformer里面,就需要将图像展开成一系列的token,
如果逐像素视为token进行注意力的计算,难免计算量太大,因此一个更加合理的想法是将图像划分为一个个的patch
将每个patch进行embedding

现在对于一个224224的图像,我们设置每个patch图像块的尺寸是16,因此呢,我们可以从H和W两个维度将原图像进行分割,
224/16=14 14
14=196
也就说说把原图像分割成为了196个16*16的patch,因此我们就是要把196个patch进行embedding

class PatchEmbed(nn.Module):
    """
    2D Image to Patch Embedding
    """
    def __init__(self, img_size=224, patch_size=16, in_c=3, embed_dim=768, norm_layer=None):
        super().__init__()
        img_size = (img_size, img_size)
        patch_size = (patch_size, patch_size)
        self.img_size = img_size
        self.patch_size = patch_size
        self.grid_size = (img_size[0] // patch_size[0], img_size[1] // patch_size[1])
        self.num_patches = self.grid_size[0] * self.grid_size[1]

        self.proj = nn.Conv2d(in_c, embed_dim, kernel_size=patch_size, stride=patch_size)
        self.norm = norm_layer(embed_dim) if norm_layer else nn.Identity()

    def forward(self, x):
        B, C, H, W = x.shape
        assert H == self.img_size[0] and W == self.img_size[1], f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})."

        # flatten: [B, C, H, W] -> [B, C, HW]
        # transpose: [B, C, HW] -> [B, HW, C]
        x = self.proj(x).flatten(2).transpose(1, 2)
        x = self.norm(x)
        return x

我们首先定义一个PatchEmbed类,
它的初始化函数输入参数如下
img_size是输入图像的大小,224 像素
patch_size是我们分割的图像块的大小 16 像素
in_c 是输入图像的channels通道数,是3 RGB
embed_dim是每一个token的特征维数,也是我们embed输入的维数 我们定为768

self.num_patches = self.grid_size[0] * self.grid_size[1]
这一步相当于是计算了token的个数 1414=196
下面我们借用pytorch的2D卷积函数 nn.Conv2d
输入的通道数是3 embed_dim既是我们要求的输出通道数即每个token的特征维数,同时在卷积运算里面这代表着这层有多少个卷积核,
因为一般的卷积,卷积层输出通道数等于卷积核的个数。
然后卷积核的大小就是patch的大小16,步长的大小也是patch的大小16,这个意思就相当于用16
16的卷积核以16的步长做卷积,实际上就是提取了一个14*14的特征图,相当于把patch都提取出来了

下面的前向计算函数里面

x = self.proj(x).flatten(2).transpose(1, 2)

x首先的输入是(8,3,224,224)
然后通过proj函数做了embedding 输出的是(8,768,14,164)
然后flatten(2),在第二维上进行展开 (8,768,14,14)变成了(8,768,14*14)
最后transpose(1, 2)把第一维和第二维做交换 (8,768,196)变成了(8,196,768)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+element-plus复杂表单分组处理

一、为什么表单要分组处理? 方便表单字段的复用:例如,你的表单有十个字段会在很多的表单都会用到,那么表单则需要进行分组进行表单复用;实现不同角色的表单权限控制:例如一个表单有60个字段,角…

3DEXPERIENCE Works八大核心优势分析

云技术正在加速普及,助力各行各业数字化转型。根据IDC 2023年12月发布的报告,2023年全球云计算市场规模达到3329亿美元,同比增长19.4%。其中,公有云市场规模达到2587亿美元,同比增长21.5%;私有云市场规模达到742亿美元…

倒计时最后1天!AutoMQ x 阿里云云原生创新论坛精彩预告

3月9日(本周六)“AutoMQ x 阿里云云原生创新论坛”就要与大家见面了,让我们一起来看看本次论坛都有哪些精彩的议题!文末附有参会交通指南和直播预约链接。 精彩剧透 01 AutoMQ:加速云原生创新,助力大数据…

Java集合面试题(day 02)

📑前言 本文主要是【JAVA】——Java集合面试题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&am…

支小蜜校园防欺凌系统听到声音之后会自动识别吗

在校园安全领域,特别是在预防和应对欺凌问题上,校园防欺凌系统作为新兴的技术应用,正在受到越来越多的关注和探索。那么当这样的系统听到声音之后,它是否能够自动识别并作出相应反应呢?本文将围绕这一问题展开探讨。 …

protobufjs使用教程,支持proto文件打包成typescript或javascript脚本

官方链接:https://docs.cocos.com/creator/manual/zh/scripting/modules/example.html 第一步,安装nodejs。(自行安装) 安装教程可参考 https://www.runoob.com/nodejs/nodejs-install-setup.html 第二步,创建cocos…

雷赛控制卡正负限位的信号灯不亮问题处理

雷赛控制卡正负限位的信号灯不亮问题处理 正负限位IO映射:这个映射要和轴号对映。 回零设置中的IO映射也是一样的设置。 如下图:3轴的IO映射都选3。1轴的IO映射都选1

c++的STL(2)-- vector容器

目录 1. 默认构造 代码: 相关知识点: 2. 有参构造函数 以及 使用{}初始化对象 代码: 相关知识点: 3. vector容器在尾部添加和删除元素 代码: 使用push_back()和pop_back()进行尾部元素的添加和删除 相关知识点: 代码: 使用emplace_back在尾部添…

机器学习——神经网络压缩

神经网络压缩 需要部署,设备内存和计算能力有限,需要进行模型压缩,在设备上运行的好处是低延迟,隐私性。 目录 不考虑硬件问题,只考虑通过软件算法优化。 修剪网络 参数过多或者没有用的参数,可以将其剪…

MRI基础--k空间

k空间定义 k空间是表示 MR 图像中空间频率的数字数组。 k空间物理意义 k 空间的单元通常显示在主轴 kx 和 ky 的矩形网格上。 k 空间的 kx 和 ky 轴对应于图像的水平 (x) 和垂直 (y) 轴。然而,k 轴表示 x 和 y 方向上的空间频率而不是位置。 k 空间中的各个点 (kx,ky) 与图像…

R语言 | 复数 相关函数

问题 大家好&#xff0c;我有一个问题&#xff0c;我看到一个函数如下&#xff1a; L2_distance <- function(A, B){rowA <- apply(A*A, 1, sum)matrixA <- matrix(rep(rowA, eachlength(rowA)), nrowlength(rowA), byrowT)rowB <- apply(B*B, 1, sum)matrixB &l…

【教程】Kotlin语言学习笔记(四)——方法(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 文章目录 【…

小白跟做江科大51单片机之AD/DA

1.看原理图找接口 2.看时序图编写读取数据代码 XPT2046.c代码 #include <REGX52.H> //引脚定义 sbit XPY2046_DINP3^4; sbit XPY2046_CSP3^5; sbit XPY2046_DCLKP3^6; sbit XPY2046_DOUTP3^7; unsigned int XPT2046_ReadAD(unsigned char Command) { unsigned char …

多多关键字API php java Python

多多关键字API接口广泛应用于商家进行市场分析、竞品分析、关键词优化等场景。商家可以通过分析关键词数据&#xff0c;了解用户需求&#xff0c;制定针对性的营销策略&#xff0c;提高产品的曝光率和转化率。 多多-item_seach-通过关键字搜索商品列表 公共参数 获取key和秘钥…

开发知识点-C++之win32与NT内核

win32 Windows MFC编程 常用API汇总EnumWindows()函数UpdateData()函数static与 单例 设计模式函数原型:BOOL WINAPI SetConsoleTitle(__in LPCTSTR lpConsoleTitle);HWND 是一个基本类型 表示窗口句柄FindWindow函数SendMessage函数 将指定的消息发送到一个或多个窗口PostMes…

百度地图城市点位数据下载并转换

概述 在浏览百度地图开放平台的时候&#xff0c;发现有个资源下载页面&#xff0c;里面有个城市中心点位和百度地图行政区划adcode映射表数据&#xff0c;这是一个经常使用到的数据&#xff0c;本文实现将这个数据转换为geojson&#xff0c;并借助QGIS转换为经纬度坐标或火星坐…

手写简易操作系统(一)--环境配置

本专栏是我新开设的一个学术专栏&#xff0c;旨在全面介绍手写操作系统的相关内容。其中包括实模式向保护模式的过渡、锁机制、信号量操作、内存分配、硬盘驱动、文件系统、简单shell和管道等操作系统核心知识。该专栏旨在为有意开发自己操作系统的研究人员提供指导与帮助。作为…

代码随想录刷题笔记-Day31

1. 分发饼干 455. 分发饼干https://leetcode.cn/problems/assign-cookies/ 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口…

园区内部无线语音通信的解决方案

在一些园区、办公环境和厂矿场所&#xff0c;内部无线语音通信功能的需求日益凸显&#xff0c;尤其对于人员流动和移动办公的场景。这种需求着重强调了无线通信的便捷性和内部部署环境的适应性。 传统的内部通信系统中&#xff0c;有线通信能力占据主导地位&#xff0c;如集团…

【Latex】图片排版归纳(单张、两张图片并排、三张图片并排)

文章目录 单张图片两张并排三张并排 单张图片 \begin{figure}[htb]\centering\caption{PWM原理图}\includegraphics[width0.45\textwidth]{images/PWM.png}%可修改0.45为其他比例&#xff0c;调整大小 \end{figure}两张并排 实现效果如下 \begin{figure}[htb]\begin{minipag…