CV07_深度学习模块之间的缝合教学(2)--维度转换

教学(1):链接

1.1 预备知识

问题:假如说我们使用的模型张量是三维的,但是我们要缝合的模块是四维的,应该怎么办?

方法:pytorch中常用的函数:(1)view函数(2)reshape函数(3)permute函数(4)flatten函数

使用view函数:

import torch
import torch.nn as nnx = torch.randn(10,3,32,32) #记为b,c,h,w
b,c,h,w = x.shape #访问x的shape属性
b,c,h,w = x.size() #size()用于提取x的维度
print(b,c,h,w)#转换成三维b,n,cy = x.view(b,h*w,c) #view()用于变换张量的形状
print(y.shape)

使用permute和flatten函数:

import torch
import torch.nn as nnx = torch.randn(10,3,32,32) #记为b,c,h,w
b,c,h,w = x.shape #访问x的shape属性
b,c,h,w = x.size() #size()用于提取x的维度
print(b,c,h,w)#使用permute和flatten函数转换成三维b,n,c
a = x.permute(0,2,3,1) #1维在1维,原来的2维在现在的4维,原来的3维在2维,原来的4维在3维
a = a.flatten(start_dim=1,end_dim=2) # ctrl+p查看参数信息.在下标为1的维度(其实就是第二维)开始,在下标为2的维度结束,这之间展平
print(a.shape)

结果均为:

1.2 模块和模块之间的维度转换

高维缝合低维

以CoordAtt和AFT为例,前者为4维,后者为3维。我们假如说想在CoordAtt这个四维模块中缝进三维的模块AFT。

缝:还是两个主要位置:类初始化__init__和前向传播forward。

(1)首先我们找到四维模块的前向传播,将用x.size()将四个维度都提取出来。

n, c, h, w = x.size()  # 获取输入的尺寸

(2)用view将x的维度调整成3维,用另一个变量保存起来。

x_01 = x.view(n,h*w,c) #调整为3维张量

(3)在__init__中将三维模块加进来:

注意通道数保持一致,以及那个h*w对应在三维模块上的那个变量大小保持一致

(4) 在forward中添加进三维模块:

添加进之后,不要忘了三维模块输出还是三维,需要再次转换为4维。

打个断点看一下张量形状:

可以看到又恢复成了四维。

低维缝合高维

以CoordAtt和AFT为例,前者为4维,后者为3维。我们假如说想在AFT这个三维模块中缝进四维的模块CoordAtt。

原理大同小异,需要注意的就是在升维的时候要保持总数据量不变(各个维度的大小相乘)。

一开始的input的形状:

经过维度转换后input的形状:

缝合模块后input的形状:

再次经过维度转换后input的形状:

1.3 模型和模块之间的维度转换

举个例子,模型选择VIT(四维),要缝的模块还是AFT(三维)

(1)首先我们在模型前向传播最开始写入“print(x.shape)”,然后运行训练文件,看一下模型的输入张量:

(2)用x.size()将四个维度都提取出来。

b,c,h,w =x.size()

(3)用view将x的维度调整成3维,用另一个变量保存起来。

x_01 = x.view(b,h*w,c)

x_01的形状为[64,50176,3]  (50176很大,会报显存错误,道理理解即可)

(4)在__init__中将三维模块加进来:

注意通道数保持一致,以及那个h*w对应在三维模块上的那个变量大小保持一致

 

(5) 在forward中添加进三维模块:

附录

view和reshape函数的区别

  1. 连续性要求:

    • view() 函数要求张量是连续存储的。如果张量不是连续存储的(比如,经过转置、切片等操作后),直接使用 view() 会抛出错误。在这种情况下,你需要先调用 contiguous() 方法使张量连续,然后再使用 view()
    • reshape() 函数则更为灵活,无论张量是否连续,它都能工作。如果新的形状与原形状不兼容于视图变换(即不满足连续性条件),reshape() 会创建一个新的、形状改变的张量副本,这会占用额外的内存。
  2. 内存共享:

    • 当满足条件时,view() 返回的张量与原张量共享相同的内存,也就是说,它们是原张量的视图。修改其中一个会影响另一个。
    • reshape() 可能会返回一个与原张量共享内存的视图(如果满足连续性条件),或者如果必须复制数据以满足新的形状,则返回一个副本。这意味着修改重塑后的张量可能不会影响原张量,具体取决于操作是否导致了数据的复制。
  3. 适用范围:

    • view() 仅限于 PyTorch 的张量对象。
    • reshape() 在PyTorch中既适用于张量,也适用于NumPy数组,因此在需要跨库操作时提供了更多灵活性。

如果你确定张量满足连续性条件并且希望避免不必要的内存复制,view() 是一个高效的选择。但如果你不关心或不确定这些条件,或者需要保证操作总是安全的(即使是以牺牲一些性能为代价),则应使用 reshape()。在实际应用中,如果不确定是否可以直接使用 view(),使用 reshape() 是一个更保险的做法,因为它能自动处理所有情况。

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

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

相关文章

新华三H3CNE网络工程师认证—DHCP使用场景

网络服务与应用当中的技术有DHCP、Telnet和FTP。DHCP是计算机当中常用来获取地址的。比如日常使用中,计算机并没有接入IP,IP通过DHCP技术从上端服务去获取的。手动配置网络参数会出现多种问题。 文章目录 一、手动配置网络参数的问题1、参数多、理解难2、…

【零基础】学JS之APIS第四天

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

喰星云·数字化餐饮服务系统 多处 SQL注入漏洞复现

0x01 产品简介 喰星云数字化餐饮服务系统是一款专为餐饮企业设计的综合性管理软件,旨在通过信息化手段提升餐饮企业的运营效率、降低运营成本,并实现数据驱动的决策管理。该系统包括供应链管理、财务管理、巡店管理、人力资源管理等多个模块,可全面覆盖餐饮企业的日常运营需…

Zynq7000系列FPGA中的DDR内存控制器

DDR内存控制器是一个高度集成的组件,支持多种DDR内存类型(DDR2、DDR3、DDR3L、LPDDR2),并通过精心设计的架构来优化内存访问效率。 DDR内存控制器架构 AXI内存端口接口(DDRI):该部分负责处理与…

雷赛运动控制卡编程(2)限位设定与回原方式、脉冲模式设置

一、限位开关及急停开关的设置 限位开关的设置 //设置限位开关// dmc_set_el_modeushort _cardNo0;ushort _axisNo 0;ushort _enable 1; // 正负限位使能 ushort _elLogic 0; // 正负限位 低电平 有效ushort _model 0;// 正负限位停止方式为立即停止LTDMC.dmc_set_el_m…

构建实用的NLP应用程序:重塑人类与计算机的协同工作方式

文章目录 一、NLP技术的核心价值二、构建实用NLP应用程序的关键步骤三、NLP应用程序在协同工作中的创新应用《赠ChatGPT中文范例的自然语言处理入门书》编辑推荐内容简介作者简介精彩书评目录前言/序言获取方式 在数字化时代,自然语言处理(NLP&#xff0…

手机数据恢复:适用于 Android 的 4 大数据恢复应用程序

没有人希望丢失设备上的重要数据。如果发生这种情况,请不要惊慌。以下是可帮助您恢复丢失或删除的数据的 Android 数据恢复应用程序列表。 有多种方法可以恢复已删除或丢失的 Android 数据,最简单、最快捷的方法是使用第三方恢复应用程序。这些应用程序会…

Transformer模型:Postion Embedding实现

前言 这是对上一篇WordEmbedding的续篇PositionEmbedding。 视频链接:19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili 上一篇链接:Transformer模型:WordEmbedding实现-CSDN博客 正文 先回顾一下原论文中对Posit…

[Windows] 号称最快免费小巧的远程桌面 AnyDesk v8.0.11单文件版

描述 对于经常在互联网上进行操作的学生,白领等! 一款好用的软件总是能得心应手,事半功倍。 今天给大家带了一款高科技软件 虽然 QQ 拥有远程协助功能,但很多时候连接并不够流畅,而且被控电脑那方也必须要有人操作才行…

电脑关机被阻止

1. winR输入regedit进入注册表 2. 选择HKEY_USERS-》.DEFAULT-》Control Panel-》Desktop 3. 右键DeskTop新建字符串值,命名为AutoEndTasks,数值设置为1

C++中链表的底层迭代器实现

大家都知道在C的学习中迭代器是必不可少的,今天我们学习的是C中的链表的底层迭代器的实现,首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别,为什么顺序表的底层迭代器更加容易实现,而链表的底层迭代器…

不会编程怎么办?量化交易不会编程可以使用吗?

量化交易使用计算机模型程序代替人工进行交易,一般需要投资者自己编写程序建模,然后回测无误之后再进行实盘交易,那么不会编程的投资者能使用量化软件进行量化交易吗? 不会编程使用量化软件有两种方法 一种是请人代写代码&#x…

Java软件设计模式-单例设计模式

目录 1.软件设计模式的概念 2.设计模式分类 2.1 创建型模式 2.2 结构型模式 2.3 行为型模式 3.单例设计模式 3.1 单例模式的结构 3.2 单例模式的实现 3.2.1 饿汉式-方式1(静态变量方式) 3.2.2 懒汉式-方式1(线程不安全) 3.…

办公灯多普勒雷达模组感应开关,飞睿智能24G毫米波雷达超低功耗uA级,节能LED灯新搭档

在科技日新月异的今天,节能、环保已经成为我们生活和工作中不可或缺的一部分。作为新时代的办公人,我们不仅要追求高效的工作方式,更要关注我们所使用的设备是否足够环保、节能。今天,我们就来聊聊一个令人兴奋的创新——飞睿智能…

如何30分钟下载完368G的Android系统源码?

如何30分钟下载完368G的Android系统源码? Android系统开发的一个痛点问题就是Android系统源码庞大,小则100G,大则,三四百G。如标题所言,本文介绍通过局域网高速网速下载源码的方法。 制作源码mirror 从源码git服务器A&#xff0c…

推荐系统:从协同过滤到深度学习

目录 一、协同过滤(Collaborative Filtering, CF)1. 基于用户的协同过滤2. 基于物品的协同过滤 二、深度学习在推荐系统中的应用1. 深度学习模型的优势2. 深度学习在推荐系统中的应用实例 三、总结与展望 推荐系统是现代信息处理和传播中不可或缺的技术&…

【话题】破茧而出:打破AI“信息茧房”,捍卫信息自由与多样性

目录 AI发展下的伦理挑战,应当如何应对? 方向一:构建可靠的AI隐私保护机制 方向二:确保AI算法的公正性和透明度 方向三:管控深度伪造技术 AI发展下的伦理挑战,应当如何应对? 在人工智能&…

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势: 产业规模持续扩大:在高技术制造业方面,航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增,新材料新产品生产也高速增长。 标志性装备不断突破:例如…

Flink Window 窗口【更新中】

Flink Window 窗口 在Flink流式计算中,最重要的转换就是窗口转换Window,在DataStream转换图中,可以发现处处都可以对DataStream进行窗口Window计算。 窗口(window)就是从 Streaming 到 Batch 的一个桥梁。窗口将无界流…

系统架构师考点--软件工程(上)

大家好。今天我来总结一下软件工程的相关考点。这部分是考试的重点。在上午场客观题、下午场案例题以及下午场论文都有可能考到,在上午场客观题中大约占12-15分左右。 一、软件工程概述 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过…