P3 PyTorch 维度变换

news2024/11/18 3:32:02

前言

参考

课时21 维度变换-2_哔哩哔哩_bilibili

目录:

  1.      view
  2.     unsqueeze
  3.      squeeze
  4.     Expand
  5.      repeat
  6.     转置
  7.     contiguous
  8.     Permute
  9.     例子

    

     


一 view 

      作用:

            重新调整Tensor的形状,通过shape,或size属性可以看出来

     1.1 普通的用法

    import torch 

    def test():
    
          img = torch.rand(4,1,28,28)
 
           a1= img.view(4,28*28)
           print("\n a1 ",a1.shape,a1.size())
    
     if __name__ == "__main__":
             test()

    输出:

 a1  torch.Size([4, 784]) torch.Size([4, 784])

   1.2参数-1 (自动调整该维度 size)

    

import torch 

def test():
    
    a = torch.arange(0, 16, 1)
 
    a1= a.view(-1,16)
    a2 = a.view(16,-1)
    print("\n a1 ",a2.shape,a1.shape)
    print(a1.size(0),a2.size(0))
if __name__ == "__main__":
    test()

输出

    a1    torch.Size([16, 1])         torch.Size([1, 16])
   1        16


 二  unsqueeze

      在指定的维度增加一个维度

      2.1  正数

         指定的位置前面插入一个维度

def test():
    
    a = torch.rand(4,5,6)
    
    a2 =a.unsqueeze(2).shape
    
    print("\n a2.shape: ",a2,a.ndim)
    a3 = a.unsqueeze(3).shape
    print("\n a3: ",a3)
 
 
if __name__ == "__main__":
    test()

       输出


     a2.shape  torch.Size([4, 5, 1, 6]) 3

     a3  torch.Size([4, 5, 6, 1])

  2.2 负数

       在指定的维度之后插入一个维度

       a = torch.rand(4,5,6)

      a2 =a.unsqueeze(-3).shape

      在指定的维度之后插入一个维度

     
      a2.shape:  torch.Size([4, 1, 5, 6]) 3 

例1: 在指定的维度之后插入

 例2 :   在指定的维度之前插入


三  squeeze

      维度挤压,如果指定的维度为1,则删除该维度,其它则保持不变

    a = torch.rand(1,3,1,1)
    
    b = a.squeeze().shape
    print("\n  默认 ",b)
    
   
    

    #索引为正数
    #Positive and negative number
    p_0 = a.squeeze(0).shape  
    print("\n 挤压0",p_0)
    
    p_1 = a.squeeze(1).shape
    print("\n 挤压1",p_1)
    
    #索引为负数
    n_0 = a.squeeze(-1).shape  
    print("\n 挤压-1 ",n_0)
    
    n_1 = a.squeeze(-4).shape
    print("\n 挤压-4 ",p_1)


四 Expand

   正数作用和reshape 一样,对应的维度上面调整到指定的大小

  负数 -1:

      表示该维度保持不变


五 repeat

    在指定的维度上面复制几次

   


六 矩阵转置

     下面这张方法值只适用于2D的矩阵。

    a = torch.rand(2,3)
    d= a.T.shape
    
    print("\n b ",d)


七  contiguous

   torch.contiguous()方法首先拷贝了一份张量在内存中的地址,然后将地址按照形状改变后的张量的语义进行排列。

torch.contiguous()方法语义上是“连续的”,经常与torch.permute()、torch.transpose()、torch.view()方法一起使用,要理解这样使用的缘由,得从pytorch多维数组的底层存储开始说起:

touch.view()方法对张量改变“形状”其实并没有改变张量在内存中真正的形状,可以理解为:

view方法没有拷贝新的张量,没有开辟新内存,与原张量共享内存;
view方法只是重新定义了访问张量的规则,使得取出的张量按照我们希望的形状展现。

   7.1 pytorch与numpy在存储MxN的数组时,均是按照行优先将数组拉伸至一维存储

        

   a = torch.tensor([[1,2,3],
                     [4,5,6]])
    
    print(a,a.shape)

   在内存中的样子:相当于做个flatten

  

[1, 2, 3, 4, 5, 6]

7.2 当我们使用torch.transpose()方法或者torch.permute()方法对张量翻转后,改变了张量内存的形状

   

    a = torch.tensor([[1,2,3],
                     [4,5,6]])
    
    print("\n a ",a.shape)
    
    a2 =a.transpose(0,1)

   此刻如果再想通过view 方式访问就会出错


原因是:改变了形状的a2语义上是2行3列的,在内存中还是跟a一样,没有改变,导致如果按照语义的形状进行view拉伸,数字不连续,此时torch.contiguous()方法就派上用场了
 

    a = torch.tensor([[1,2,3],
                  [4,5,6]])
    
    
    b = a.transpose(0,1).contiguous().view(2,3)
 
    print(b)
   
   out:
   tensor([[1, 4, 2],
        [5, 3, 6]])

八 Permute

      transpose 改变维度只能两两交换,有的时候需要多次交换比较繁琐

 比如[B,C,H,W]  需要更变成[B,H,W,C]

则 [B,C,H,W]--->[B,W,H,C]--->[B,H,W,C] 两次变更才能得到

   通过permute 操作一次就可以完成

  a = torch.rand(2,3,4,5)
    
  b = a.permute(0,2,3,1).shape
 torch.Size([2, 4, 5, 3])
    

   如下为shape的变换情况

 


 九  例子

     8.1 view

把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其他维度的tensor

 8.2 view+tranpose+continues

 a = torch.rand(5,3,16,16)
    
 a1 = a.transpose(1,3).view(5,3*16*16).view(5,3,16,16)

   5张图片,图片channel =3 ,height=16, width =16

通过transpose改变了meomery中的存储结构,不再是那种按行顺序结构了,再去访问的时候

就会出错

  解决方法:

    a1 = a.transpose(1,3).contiguous().view(5,3*16*16).view(5,3,16,16)
    
    eq = torch.all(torch.eq(a,a1))

    问题:

     不报错了,但是因为transpose改变了数据Memory中的顺序,再访问依然按照

 [B,W,H,C] 去获取[B,C,H,W]数据.

    解决方案:

    [B,C,H,W]->[B,W,H,C]->[B,C,H,W]

 a1 = a.transpose(1,3).contiguous().view(5,3*16*16).view(5,16,16,3).transpose(1,3)
    
    eq = torch.all(torch.eq(a,a1))
    
    print(eq)
    

    tensor(True)

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

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

相关文章

Maven从入门到精通

文章目录1.Maven简介1.1 传统项目管理状态分析1.2 什么是maven1.3 Maven的作用2.maven的安装与配置(1)maven的下载与安装(2)Maven目录结构(3)配置settings.xml(4)maven整合idea&…

chapter8——消抖技术

目录1.简介2.开关行为3.开关种类4.消抖5.消抖指南1.简介 在电子设备内两个金属触点随着触点的断开闭合便产生了多个信号,这就是抖动。“消抖”是用以确保在每一次断开或闭合触点时只有一个信号起作用的硬件设备或软件。机械开关和继电器触点通常由弹性金属制造&…

【RobotFramework】FOR循环应用

自动化测试过程中,如果我们想多次运行某段语句,且每次使用的值都不一样,那么我们就要使用到循环。 在Robot FrameWork中,循环使用到的关键字是FOR,常用见应用如下。 应用一: FOR ${变量} IN 参数1 参数2…

知识图谱-KGE-语义匹配-双线性模型-2019:RotatE

【paper】 RotatE: Knowledge Graph Embedding by Relational Rotation in Complex Space【简介】 本文是北大和加拿大的研究团队发表在 ICLR 2019 上的文章,提出了 RotatE(Rotation Embedding),主要思想是将实体表示为复向量&…

Drupal9自定义module添加多个定时任务

drupal的自定义cron常见的就是hook_cron,具体做法参见: Drupal踩坑:在自定义module中添加cron job 这种方法只能一个module添加一个cron。如果想添加多个自定义的cron怎么办?使用hook_cronapi。 有两个模块提供 hook_cronapi&…

DeepLab V3学习笔记

DeepLab V3遇到的问题和解决方法相关工作DeepLab V3中的两种模型结构cascaded modelASPP model相对于DeepLab V2的优化Multi-grid MethodASPP的改进消融实验cascaded model消融实验ASPP model消融实验和其他网络的对比实验总结网络模型图遇到的问题和解决方法 对于DeepLab系列…

nginx使用配置(亲测自用)

文章目录一、作用二、案例1.动静分离将静态资源放入Nginx目录下2.负载均衡常见的几种负载均衡方式1) 轮询(默认)2)weight3)ip_hash4)fair(第三方)5)url_hash(第三方&…

Flutter - Button样式及参数

Material 组件库中提供了多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们都是集成于ButtonStyleButton,所以他们大多数属性都和ButtonStyleButton一样。在介绍各个按钮时我们先介绍其默认外观,而按钮的外观大都可以通过属性…

基于萤火虫算法优化的lssvm回归预测-附代码

基于萤火虫算法优化的lssvm回归预测 - 附代码 文章目录基于萤火虫算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于萤火虫算法优化的LSSVM4.测试结果5.Matlab代码摘要:为了提高最小二乘支持向量机(lssvm)的回归预测准确率&#xf…

通信原理 | CRC循环冗余校验码

CRC循环冗余码 CRC校验的手算演示异或运算和多项式步骤一、展开多项式得到CRC除数步骤二、原数据串末端加0(多项式最高是几次就加几个0)步骤三、从左往右,按位异或(所得结果如果不够长,前面的0别忘了添加)CRC(Cyclic Redundancy Check )循环冗余校验码 CRC校验的手算演…

MQ高级(二)死信交换机

一、初识死信交换机(P159) 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter): (1)消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue…

使用opencv截取旋转框目标

使用opencv截取旋转框目标1、第一种方法2、第二种方法3、两种方法的简单对比4、opencv 最小面积矩形返回角度的理解4.1、version4.2之前4.1、version4.2之后本文列举了两种方法,使用的数据如图,用的是改版rolabelimg标注的标注文件有四个点的坐标: 1、…

mybatis详述

文章目录一、引言1.1 什么是框架?1.2 什么是ORM框架?1.3使用JDBC完成ORM操作的缺点?二、MyBatis框架2.1概念2.2 MyBatis开发步骤2.3 如何编写mybatis映射文件(规范)三、mybatis-config.xml 配置补充四、mybatis接口与映射文件指令间 传递参数4.1 传递…

安卓APP源码和设计报告——北京旅游系统

目 录 一、概述11 1.1 课题描述11 1.2 需求分析22 1.3 开发环境33 二、系统分析与概要设计55 2.1 系统功能分析55 2.2 系统模块结构图66 2.3 数据库表的设计66 三、北京旅游系统的登录功能模块的详细设计88 3.1 登录模块的功能描述88 3.2 登录模块的界面布局的设计9…

185: vue+openlayers 引用hover插件,展示各种鼠标cursor样式

第185个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中使用hover效果,这里是引用了一个hover插件。鼠标对应到相应的feature中时候,获取其类型,并且设定不同的鼠标样式。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果Ope…

一篇知晓-内存竟被”无意“破坏,真相究竟如何?

内存是C/C程序员的好帮手,我们通常说C/C程序性能更高其原因之一就在于可以自己来管理内存,然而计算机科学中没有任何一项技术可以包治百病,内存问题也给C/C程序员带来无尽的烦恼。 野指针、数组越界、错误的内存分配或者释放、多线程读写导致…

kotlin之hello world

如果你想一个人写全栈的话,Kotlin Multiplatform (以下简称MPP)是目前这个星球上最好的选择,没有之一。 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrain…

CTFSHOW web入门 java反序列化篇(更新中)

在做这部分题前,推荐大家先去学习下java反序列化,尤其是CC链 可以看下两个系列视频,收获颇多 https://space.bilibili.com/2142877265/channel/collectiondetail?sid29805&ctype0 https://www.bilibili.com/video/BV16h411z7o9/?spm_i…

手写Spring2(实现 Bean 的定义、注册、获取)

文章目录前言本章目标一、实现1、项目结构2、BeanFactory-bean工厂3、BeanDefinition -bean定义4、单例注册接口定义和实现-SingletonBeanRegistry 、DefaultSingletonBeanRegistry5、AbstractBeanFactory-抽象bean工厂类(定义模板方法)6、AbstractAutowireCapableBeanFactory-…

python配置环境问题记录------2022/12/07

python配置问题记录1、版本匹配的问题2、指令安装相关依赖包3、pycharm指定解释器4、运行网络模块5、总结1、版本匹配的问题 到官网下载合适的版本(注意位数,我这里选的是64位),pycharm选的是21年版本的,太新的话会有…