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

news2024/9/22 5:29:36

教学(1):链接

1.1 预备知识

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

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

使用view函数:

import torch
import torch.nn as nn

x = 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,c

y = x.view(b,h*w,c) #view()用于变换张量的形状
print(y.shape)

使用permute和flatten函数:

import torch
import torch.nn as nn

x = 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.coloradmin.cn/o/1927467.html

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

相关文章

C++基础(三)

1.再探构造函数 之前的构造函数,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔开的数据成员列表,每个“成…

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

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

3d导入模型后墙体变成黑色?---模大狮模型网

在展览3D模型设计领域,技术和设计的融合通常是创意和实现之间的桥梁。然而,有时设计师们会遇到一些技术上的挑战,如导入3D模型后,墙体却突然变成了黑色。这种问题不仅影响了设计的视觉效果,也反映了技术应用中的一些复…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next[1]都无脑写…

数据库学习作业

使用mysgldump命令备份数据库中的所有表 备份booksDB数据库中的books表 使用mysgldump备份booksDB和test数据库(test数据库自行准备) 使用mysq1命令还原第二题导出的book表 进入数据库使用source命令还原第二题导出的book表 创库,建表 建表的结果 插入数据 使用mysg…

医院同步时钟,构建医院零误差时间环境

在医院这个分秒必争、责任重大的场所,时间的准确性和一致性至关重要。医院同步时钟的应用,为构建医院零误差时间环境提供了坚实的保障。 一、医院同步时钟应用原因 首先,医疗工作的精确性和协同性依赖于统一且准确的时间。从手术的安排到药物…

MySQL篇:事务

1.四大特性 首先,事务的四大特性:ACID(原子性,一致性,隔离性,持久性) 在InnoDB引擎中,是怎么来保证这四个特性的呢? 持久性是通过 redo log (重做日志&…

解析CQRS架构模式

在日常开发过程中,关于如何正确划分操作的边界和职责一直是我们需要考虑的一个核心问题。针对这个问题,业界也诞生了一些新的设计思想和开发模式,其中最具代表性的就是今天要介绍的CQRS。 CQRS的全称是Command Query Responsibility Segregat…

图——图的遍历(DFS与BFS)

前面的文章中我们学习了图的基本概念和存储结构,大家可以通过下面的链接学习: 图的定义和基本术语 图的类型定义和存储结构 这篇文章就来学习一下图的重要章节——图的遍历。 目录 一,图的遍历定义: 二,深度优先…

【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业 小组作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】网上购书管理系统MySQL servlet JSP项目设计源代码 期末寒暑假作业 小组作业 2项目介绍 系统功能: servlet网上购书管理系统包括管理员、用户两种角色。 管理员功能包括订单管理(已…

前端Vue组件化实践:自定义加载组件的探索与应用

在前端开发领域,随着业务逻辑复杂度的提升和系统规模的不断扩大,传统的开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些挑战,组件化开发作为一种高效、灵活的开发模式,受到了越来越多开发者的青睐。本文将结合实践&…

MySQL下载安装使用教程图文教程(超详细)

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们使…

Windows安装和使用Doccano标注工具

简介 开源链接:GitHub - doccano/doccano: Open source annotation tool for machine learning practitioners. Open source annotation tool for machine learning practitioners. Doccano是一款开源的文本标注工具,由人工智能公司Hironsan开发并在G…

uni app 本地打包apk 教程

前言: 各位同学大家好,最近帮别人打包了一个 uni 的项目编译成apk 所以觉得必要分享下。 上效果图 原始工程 这种uni 原始的工程我们直接 这样我们就可以运行到我们的模拟器或者真机上面去 手动打包 开发环境 Android Studio 下载地址:An

1讲8小时!张宇新36讲怎么学效果最大化?

别怕!解决以下问题,就能让学习效果最大化。 1. 理解有难度。 如果你习惯传统教学模式,例如武忠祥老师的强化课,可能会觉得张宇36讲信息量太大,难以在短时间内消化和理解。 这是因为,考研数学教学的一端&a…

一个审计人为什么要辞职去日本做码农??

今天翻阅报道的时候,看到一篇记者采访记录: 文章的题目是:“审计人辞职去日本做码农的心路历程”。由于标题吸引住了我,我就点进去了看看。 被采访的对象:她在国内审计行业工作两年多后,自学编程&#xf…

Cesium--获取当前相机中心与地面的射线焦点

本文记录获取当前相机中心与地面的射线焦点的方法,可用于视角缩放过程中,控制视角自动平滑切换到二维等场景: 方法一定是视角中心能与地面有交集,如果对着地平线或对着天空肯定是没效果的。直接放代码: //调整相机到正…

计算机志愿攻略,高考生的必读

高考结束 又一年高考结束了 1342万学子们寒窗苦读十二载 迈入考场的那一刻 既紧张又兴奋 即使过去很多年 我仍然能回忆起当年的情景 当高考结束的铃声响起 所有的紧张和压力仿佛瞬间释放 走出来的那一刻 不管结果如何 我们都为自己能够勇敢地走过这段旅程而感到骄傲 …

基于Three.js实现三维空间中的箭头移动动画

继上一篇文章中实现了三维管道的可视化和流动模拟,最近需要基于曲面做三维物体的移动动画效果,特别是箭头等指向性物体的移动,因此就编写了以下方案,主要实现了三维空间内箭头等物体的创建和指向调整及动画效果等,具体如下: 1.基于Thee.js实现箭头等物体创建-THREE.Arrow…

解读网传《深圳IT圈⭕新解读八小时工作制》

网传深圳IT圈的新解读八小时工作制 工作时间安排: 10:00-12:0014:00-18:0019:00-21:00 初看:有惊喜 上午开始时间晚:相对于传统的9点开始,这种安排允许员工有更多的早晨时间,可以用来休息或处理个人事务。下午和晚上分…