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

教学(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() 是一个更保险的做法,因为它能自动处理所有情况。

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

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

相关文章

【LeetCode 链表合集】

文章目录 1. LeetCode 206 反转链表2. NC40 链表相加 1. LeetCode 206 反转链表 题目链接🔗 解题思路: 🔍 🐧创建一个新的节点,使用链表头插的方法; 2. NC40 链表相加 题目链接🔗 解题思路…

如何用STM32实现modbus-RTU?

Modbus RTU是一种广泛应用于工业自动化领域的通信协议,基于主从架构,通过串行通信进行数据传输。本文将详细介绍Modbus RTU协议的基本原理,并提供在STM32微控制器上实现Modbus RTU通信的完整代码示例。 1. Modbus RTU协议概述 Modbus RTU的定义和特点 Modbus RTU(Remote Te…

mysql的窗口函数

一、窗口函数 1.1 什么是窗口函数 窗口函数&#xff0c;也叫OLAP函数&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;&#xff0c;可以对数据库进行实时分析处理&#xff0c;窗口函数的基本语法如下&#xff1a; <窗口函数> over (part…

Web前端开发

1. 介绍 本文将覆盖Web前端开发的方方面面&#xff0c;包括HTML、CSS、JavaScript三大基础知识&#xff0c;vue3框架以及项目实战&#xff0c;帮助读者从零开始掌握前端开发。 2. Web前端开发基础 2.1 HTML5 2.1.1 什么是HTML5 HTML&#xff08;HyperText Markup Language…

【深海王国】初中生也能画的电路板?手把手教你制作第一个PCB电路板(2)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛苦工作的你今天也辛苦啦(/≧ω) 今天大都督将继续为大家带来系列——初中生也能画的电路板&#xff0c;帮你一周内快速入门PCB设计&#xff0c;手把手教你从元器件库添加、电路原理图绘制、PCB布局设计…

SparkStreaming--scala

文章目录 第1关&#xff1a;QueueStream代码 第2关&#xff1a;File Streams代码 第1关&#xff1a;QueueStream 任务描述 本关任务&#xff1a;编写一个清洗QueueStream数据的SparkStreaming程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.如何使用S…

【07】分布式事务解决方案

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有ACID四个特性&#xff1a;原子性、一致性、隔离性、持久性。任何事务机制在实现时&#xff0c;都应该考虑事务…

mac生成.dmg压缩镜像文件

mac生成.dmg压缩镜像文件 背景准备内容步骤1&#xff0c;找一个文件夹2&#xff0c;制作application替身1&#xff0c;终端方式2&#xff0c;黄金右手方式 3&#xff0c;.app文件放入文件夹4&#xff0c;制作.dmg压缩镜像文件5&#xff0c;安装.dmg 总结 背景 为绕开App Store…

纯css实现语音播报动画效果

先来看看效果图 黑色以下代码 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAYCAYAAAAF6fiUAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAO8SURBVGiB1ZlPaBxVHMe/v7fbkmUZErRs9/1moUtYBBfxklZR8aYg5KAgvcT25MFDvUhPTaGnHoKIlOpJ0VsPUvAgKNjSS0EPAVGKya…

防火墙综合实验之NAT和智能选路

目录 前言&#xff1a; 一、实验题目 二、实验操作 需求一 需求二 需求三 需求四、需求五 需求六 需求七 ​编辑 需求八 需求九 需求十 需求十一 三、需求测试 前言&#xff1a; 本篇文章是延续上一篇文章&#xff0c;简单来说就是防火墙实验的完善和延续&#…

Zabbix6.0监控Freeswitch状态

一、前提环境说明 1、最终实现Freeswitch监控指标信息&#xff1a; 2、环境需求&#xff1a; &#xff08;1&#xff09;需要使用Zabbix6.0及以上 &#xff08;2&#xff09;需要使用zabbix_agent2 二、实现步骤 1、zabbix_agent2添加监控键值 cat /etc/zabbix/conf.d/fr…

唯众物联网综合实训台 物联网实验室建设方案

物联网综合实训装置 物联网工程应用综合实训台是我公司针对职业院校物联网行业综合技能型人才培养&#xff0c;综合运用传感器技术、RFID技术、接口控制技术、无线传感网技术、Android应用开发等&#xff0c;配合实训台上的433M无线通信设备、ZigBee节点、射频设备、控制设备、…

CoT-SC论文速读

1.论文速读 本文提出了一个重要的Decoder策略为&#xff1a;“Self-Consistency”,并将其用在CoT的Prompt工作中。 该策略作用&#xff1a;让LLM在处理复杂问题时&#xff0c;让他尝试多个推理路径&#xff0c;每一个推理路径都是一次CoT&#xff08;Chain of Thought&#x…

解决回溯算法之切割问题(leetcode--分割回文串)

文章目录 1.问题描述2.做题思路(关键是画出对于的二叉树图)3.代码实现 1.问题描述 2.做题思路(关键是画出对于的二叉树图) 1.思考从起始串的分割方案, 有a ,aa, aab三种方式 2.————————————剩余ab,b,空&#xff08;接下来对ab,b同样的方式进行分割&#xff09; 3.…

【Linux】centos7安装PHP7.4报错:libzip版本过低

问题描述 configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0) were not met: checking for libzip > 0.11 libzip ! 1.3.1 libzip ! 1.7.0... no configure: error: Package requirements (libzip > 0.11 libzip ! 1.3.1 libzi…

星辰计划02-独特视角的spring动态代理

承接上一文 动态代理 &#xff0c;这里探究spring 动态代理 会话1&#xff1a;spring动态代理 quick start &#x1f467;哥哥&#xff0c;哥哥&#xff0c;spring 怎么去搞动态代理的呢&#x1f468; 来来来&#xff0c;听我细细来说 quick start通过Spring的 ProxyFactory…

【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小

【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数&#xff0c;底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…

C++初阶:类和对象(二)

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数&#xff0c;需要注…

报文对比工具

如果有报文对比需求&#xff0c;可以通过以下步骤实现&#xff1a; ①通过在线 XML排序、压缩、格式化 网站 排序后格式化数据 http://www.bejson.com/otherformat/xmlsort/ 访问速度快&#xff0c;操作直观&#xff0c; 1.原始xml数据 2.排序 3.格式化 ②N比对数据是否一…

哥德巴赫猜想c++

方法一 #include<bits/stdc.h> using namespace std; //定义函数&#xff0c;判断素数 bool sushu(int n){bool rtrue;//先假设是素数&#xff0c;即真//循环因子范围&#xff0c;找到一个因子就不是素数for(int i2;i<sqrt(n);i){//判断2~n的根号是否素数if(n%i0){//…