关于pytorch张量维度转换及张量运算

关于pytorch张量维度转换大全

  • 1 tensor.view()
  • 2 tensor.reshape()
  • 3 tensor.squeeze()和tensor.unsqueeze()
    • 3.1 tensor.squeeze() 降维
    • 3.2 tensor.unsqueeze(idx)升维
  • 4 tensor.permute()
  • 5 torch.cat([a,b],dim)
  • 6 torch.stack()
  • 7 torch.chunk()和torch.split()
  • 8 与tensor相乘运算
  • 9 与tensor相加运算
  • 10 tensor.expand()
  • 11 tensor.narrow(dim, start, len)
  • 12 tensor.resize_()
  • 13 tensor.repeat()
  • 14 unbind()
  • 参考:

tensor 乘
tensor 加
# view()    转换维度
# reshape() 转换维度
# permute() 坐标系变换
# squeeze()/unsqueeze() 降维/升维
# expand()   扩张张量
# narraw()   缩小张量
# resize_()  重设尺寸
# repeat(), unfold() 重复张量
# cat(), stack()     拼接张量

1 tensor.view()

view() 用于改变张量的形状,但不会改变张量中的元素值
用法1:
例如,你可以使用view 将一个形状是(2,3)的张量变换成(3,2)的张量;

import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = x.view(3, 2)    

上面的操作相当于,先把形状为**(2,3)的tensor展平,变成(1,6),然后再变成(3,2).**

用法2:
转换前后张量中的元素个数不变。view()中若存在某一维的维度是-1,则表示该维的维度根据总元素个数和其他维度尺寸自适应调整。注意,view()中最多只能有一个维度的维数设置成-1

z = x.view(-1,2)

image.png

举例子:
在卷积神经网络中,经常会在全连接层用到view进行张量的维度拉伸:
假设输入特征是BCH*W的4维张量,其中B表示batchsize,C表示特征通道数,H和W表示特征的高和宽,在将特征送入全连接层之前,会用.view将转换为B*(CHW)的2维张量,即保持batch不变,但将每个特征转换为一维向量。

2 tensor.reshape()

reshape()与view()使用方法相同。
image.png

3 tensor.squeeze()和tensor.unsqueeze()

3.1 tensor.squeeze() 降维

(1)若squeeze()括号内为空,则将张量中所有维度为1的维数进行压缩,如将1,2,1,9的张量降维到2,9维;若维度中无1维的维数,则保持源维度不变,如将234维的张量进行squeeze,则转换后维度不会变。
(2)若squeeze(idx),则将张量中对应的第idx维的维度进行压缩,如1,2,1,9的张量做squeeze(2),则会降维到1,2,9维的张量;若第idx维度的维数不为1,则squeeze后维度不会变化。
例如:
image.png

3.2 tensor.unsqueeze(idx)升维

在第idx维进行升维,将tensor由原本的维度n,升维至n+1维。如张量的维度维2*3,经unsqueeze(0)后,变为1,2,3维度的张量。
image.png

4 tensor.permute()

坐标系转换,即矩阵转置,使用方法与numpy array的transpose相同。permute()括号内的参数数字指的是各维度的索引值。permute是深度学习中经常需要使用的技巧,一般的会将BCHW的特征张量,通过转置转化为BHWC的特征张量,即将特征深度转换到最后一个维度,通过调用**tensor.permute(0, 2, 3, 1)**实现。
torch.transpose只能操作2D矩阵的转置,而permute()函数可以对任意高维矩阵进行转置;
简单理解:permute()相当于可以同时操作tensor的若干维度,transpose只能同时作用于tensor的两个维度。

image.png

permute和view/reshape虽然都能将张量转化为特定的维度,但原理完全不同,注意区分。view和reshape处理后,张量中元素顺序都不会有变化,而permute转置后元素的排列会发生变化,因为坐标系变化了。

5 torch.cat([a,b],dim)

在第dim维度进行张量拼接,要注意维度保持一致
假设a为h1w1的二维张量,b为h2w2的二维张量,torch.cat(a,b,0)表示在第一维进行拼接,即在列方向拼接,所以w1和w2必须相等。torch.cat(a,b,1)表示在第二维进行拼接,即在行方向拼接,所以h1和h2必须相等
假设a为c1h1w1的二维张量,b为c2h2w2的二维张量,torch.cat(a,b,0)表示在第一维进行拼接,即在特征的通道维度进行拼接,其他维度必须保持一致,即w1=w2,h1=h2。torch.cat(a,b,1)表示在第二维进行拼接,即在列方向拼接,必须保证w1=w2,c1=c2;torch.cat(a,b,2)表示在第三维进行拼接,即在行方向拼接,必须保证h1=h2,c1=c2;
image.png

6 torch.stack()

该函数在维度上连接若干个形状相同的张量,最终结果会升维;即若干个张量在某一维度上连接生成一个扩维的张量。 堆叠的感觉。
image.png

7 torch.chunk()和torch.split()

torch.chunk(input, chunks, dim)

**torch.chunk()**的作用是把一个tensor均匀分成若干个小tensor。input是被分割的tensor。chunks是均匀分割的份数,如果在进行分割的维度上的size不能被chunks整除,则最后一份tensor会略小(也可能为空)。dim是确定在某个维度上进行分割。该函数返回的是由小tensor组成的tuple。
image.png

**torch.split()**可以说是torch.chunk()的升级版,它不仅可以按份数均匀分割,还可以按特定的方案进行分割。

torch.split(input, split_size_or_sections, dim=0)

与torch.chunk()的区别就在于第二个参数上面。如果第二个参数是分割份数,这就和torch.chunk()一样了;第二种是分割方案,是一个list类型的数据,待分割的张量将会被分割为len(list)份,每一份的大小取决于list中的元素。
image.png

8 与tensor相乘运算

  • 元素积(element-wise),即相同形状的矩阵对应元素相乘,得到的元素为结果矩阵中各个元素的值,对应函数为torch.mul()(和*的效果一样)。

image.png

  • 矩阵乘法,对应函数为torch.mm()(只能用于2d的tensor)或者torch.matmul()(和符号@效果一样)。对于torch.matmul(),定义其矩阵乘法仅在最后的两个维度上,前面的维度需要保持一致。如果前面的维度符合broadcast_tensor机制,也会自动扩展维度,保证两个矩阵前面的维度一致。

image.png
image.png

9 与tensor相加运算

遵循下面两点:

  • 当两个tensor的维度相同时,对应轴的值要一样(每个维度的大小相等),或者某些维度大小为1。相加时把所有为1的轴进行复制扩充得到两个维度完全相同的张量,然后对应位置相加即可。
  • 当两个相加的tensor维度不一致时,首先要把维度低的那个张量从右边和维度高的张量对齐,用1扩充维度至和高维度张量的维度一致,然后进行<1>的操作。

image.png

10 tensor.expand()

扩展张量,通过值复制的方式,将单个维度扩大为更大的尺寸。使用expand()函数不会使原tensor改变,需要将结果重新赋值。下面是具体的实例:
以二维张量为例:tensor是1n或n1维的张量,分别调用tensor.expand(s, n)或tensor.expand(n, s)在行方向和列方向进行扩展。
expand()的填入参数是size

image.png

11 tensor.narrow(dim, start, len)

narrow()函数起到了筛选一定维度上的数据作用.

torch.narrow(input, dim, start, length)->Tensor

input是需要切片的张量,dim是切片维度,start是开始的索引,length是切片长度,实际应用如下:

image.png

12 tensor.resize_()

尺寸变化,将tensor截断为resize_后的维度.
image.png

13 tensor.repeat()

tensor.repeat(a,b)将tensor整体在行方向复制a份,在列方向上复制b份

image.png

14 unbind()

torch.unbind()移除指定维后,返回一个元组,包含了沿着指定维切片的各个切片。

torch.unbind(input, dim=0)->seq

image.png

参考:

pytorch中与tensor维度变化相关的函数(持续更新) - weili21的文章 - 知乎
https://zhuanlan.zhihu.com/p/438099006

【pytorch tensor张量维度转换(tensor维度转换)】
https://blog.csdn.net/x_yan033/article/details/104965077

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

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

相关文章

RESTful接口实现与测试

目录标题 是什么&#xff1f;设计风格HTTP协议四种传参方式常用注解RequestBody与ResponseBodyRequestMapping注解RestController与ControllerPathVariable 与RequestParam 接受复杂嵌套对象参数Http数据转换的原理自定义HttpMessageConverter统一规划接口响应的数据格式实战&a…

为什么重写 redisTemplate

为什么重写 redisTemplate 1.安装 redis 上传 redis 的安装包tar -xvf redis-5.0.7.tar.gzyum -y install gcc-cmakemake PREFIX/soft/redis installcd /soft/redis/bin./redis-server redis.conf 2. 集成 redisTemplate maven 依赖 <dependency><groupId>org…

详解Java经典数据结构——HashMap

Java 的 HashMap 是一个常用的基于哈希表的数据结构&#xff0c;它实现了 Map 接口&#xff0c;可以存储键值对。下面我们进行详细介绍&#xff1a; 基本结构&#xff1a;HashMap 底层是基于哈希表来实现的&#xff0c;每次插入一个键值对时&#xff0c;会先对该键进行 Hash 运…

Locust:可能是一款最被低估的压测工具

01、Locust介绍 开源性能测试工具https://www.locust.io/&#xff0c;基于Python的性能压测工具&#xff0c;使用Python代码来定义用户行为&#xff0c;模拟百万计的并发用户访问。每个测试用户的行为由您定义&#xff0c;并且通过Web UI实时监控聚集过程。 压力发生器作为性…

本地部署Jellyfin影音服务器并实现远程访问影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

【Python3】【力扣题】219. 存在重复元素 II

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;哈希表。遍历每个元素&#xff0c;将元素及下标添加到字典&#xff0c;若当前元素已在字典中且下标之间距离k&#xff0c;则存在重复元素。 知识点&#xff1a;{}&#xff1a;创建空字典…

【OpenCV实现图像梯度,Canny边缘检测】

文章目录 概要图像梯度Canny边缘检测小结 概要 OpenCV中&#xff0c;可以使用各种函数实现图像梯度和Canny边缘检测&#xff0c;这些操作对于图像处理和分析非常重要。 图像梯度通常用于寻找图像中的边缘和轮廓。在OpenCV中&#xff0c;可以使用cv2.Sobel()函数计算图像的梯度…

都是80m²小户型,凭啥她家那么好看!福州中宅装饰,福州装修

杨桥新苑 本案来自杨桥新苑的住宅&#xff0c; 质朴弥漫在80㎡的小家&#xff0c; 自然淡雅的木纹&#xff0c;精炼的玄关隔断&#xff0c; 简约的设计里传达着中式的静谧风雅&#xff0c; 简练的空间加入中国元素&#xff0c; 让人从进门开始就沾染一丝艺术气息。 风格&a…

瑞禧生物分享~今天是 碲化银粉体 Ag2Te CAS:12002-99-2

碲化银粉体 Ag2Te CAS&#xff1a;12002-99-2 纯度&#xff1a;99% 仅用于科研 储藏条件&#xff1a;冷藏-20℃ 简介&#xff1a;碲化银是一种无机化合物&#xff0c;化学式是Ag2Te。它是一种单斜晶体&#xff0c;并以矿物的形式存在于自然界中。化学计量的碲化银具有n型半导…

AI:50-基于深度学习的柑橘类水果分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

【Linux】Nignx及负载均衡动静分离

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

系列四、全局配置文件mybatis-config.xml

一、全局配置文件中的属性 mybatis全局配置中的文件非常多&#xff0c;主要有如下几个&#xff1a; properties&#xff08;属性&#xff09;settings&#xff08;全局配置参数&#xff09;typeAliases&#xff08;类型别名&#xff09;typeHandlers&#xff08;类型处理器&am…

服务上千家企业,矩阵通2.0重磅上线,全链路管理新媒体矩阵

自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…

华纳云:centos系统中怎么查看cpu信息?

在CentOS系统中&#xff0c;我们可以使用一些命令来查看CPU的详细信息。下面介绍几个常用的命令&#xff1a; 1. lscpu lscpu命令可以显示CPU的架构、型号、核心数、线程数、频率等信息。 # lscpu 执行以上命令后&#xff0c;会输出类似以下内容&#xff1a; 2. cat /proc/…

配置OpenCV

Open CV中包含很多图像处理的算法&#xff0c;因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV&#xff0c;需要进行手动配置&#xff0c;下面给出在VS2017中配置Open CV的详细步骤。 1.下载并安装OpenCV3.4.1与VS2017的软件。 2.配置Open CV环…

07、vue : 无法加载文件 C:\Users\JH\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。

目录 问题解决&#xff1a; 问题 vue : 无法加载文件 C:\Users\JH\AppData\Roaming\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。 在使用 VSCode 时&#xff0c;创建 Vue 项目报的错 创建不了 Vue 项目 解决&#xff1a; 因为在此系统上禁止运行该脚本&#xff0…

【排序算法】 计数排序(非比较排序)详解!了解哈希思想!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️计数排序的概念☁️什么是计数排序&#xff1f;☁️计数排序思想⭐绝对…

四川天蝶电子商务有限公司:短视频运营怎么样?

短视频是一种以短小精悍的内容来吸引用户的新型媒体形式&#xff0c;近年来在社交网络平台上迅速走红&#xff0c;成为当今互联网世界的新宠。然而&#xff0c;要想成功运营短视频&#xff0c;需要借助一系列的策略和技巧&#xff0c;通过精心的规划和执行&#xff0c;才能够吸…

后端开发基本步骤(未完成继续写中)

1.使用spring initializr创建项目 注意&#xff1a;然后低下提供的依赖可用可不用&#xff0c;先不用&#xff0c;后边Maven统一配置依赖&#xff0c; 2.导入依赖 <!-- web --> <dependency><groupId>org.springframework.boot</groupId><artifa…

使用IO完成端口实现简单回显服务器

说明 使用IO完成端口实现简单回显服务器&#xff0c;因为是测试用的&#xff0c;所以代码很粗糙。 提醒 使用的是ReadFile、WriteFile来实现Overlapped IO&#xff0c;正式场合应该用WSARecv、WSASend&#xff0c;原因&#xff1a;来自《Windows网络编程技术》 8.2.5节 在这里…