【pytorch进阶】| 各类张量形状变化函数总结对比分析,view,reshape,pernute,transpose,squeeze,unsqueeze

文章目录

  • 1 view()函数
    • 1.1 基本用法
  • 2 view_as()函数
  • 3 reshape()函数
  • 4 permute()函数
  • 5 transpose() 函数
  • 6 squeeze()函数 和 unsqueeze()函数

1 view()函数

1.1 基本用法

view是将一个张量改变形状

函数原型

torch.Tensor.view(*shape) → Tensor

其中参数shape 可以是一个整数元组,或者是一个 系列整数

示例:两种不同参数比较

import torch# 创建一个3x4的张量
x = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 参数用整数元组,变形为2x6的张量
y = x.view((2, 6))
print(y)
# Output:
# tensor([[ 1,  2,  3,  4,  5,  6],
#         [ 7,  8,  9, 10, 11, 12]])# 参数用系列整数值,将其变形为1x12的张量
z = x.view(1, 12)
print(z)
# Output:
# tensor([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

要求 变化后元素总的个数和变化前相同,对应上面的例子,变化前后都得是12个元素~(3,4)(2,6)(1,12)

注意上面的x,y,z都是共享底层内存的,怎么理解呢?x,y,z本质还是一个东西,y,z并不是x的副本

就是只要改变x,y,z中的其中一个,其他的张量都会受到影响改变

比如如下

# 修改视图中的元素,原始张量也会受到影响
y[0, 0] = 99
print(x)
# Output:
# tensor([[99,  2,  3,  4],
#         [ 5,  6,  7,  8],
#         [ 9, 10, 11, 12]])
print(y)
# Output:
# tensor([[99,  2,  3,  4,  5,  6],
#         [ 7,  8,  9, 10, 11, 12]])print(z)
# Output:
# tensor([[99,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

还有一种常见的写法 -1,意味着这个值不是固定的,取决于其他维度,保证乘积不变即可

比如如下

import torch# 创建一个3x4的张量
x = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])y=x.view(-1,4)
print(y.shape)
z=x.view(6,-1)
print(z.shape)

输出

torch.Size([3, 4])
torch.Size([6, 2])

2 view_as()函数

view 函数,不需要指定形状,只需要指定要保持的那个对应的张量即可

view_as 可以将一个张量的形状改为与另外一个张量相同

import torch# 创建一个形状为(4, 2)的张量
x = torch.randn(4, 2)
print(x.shape)  # 输出:torch.Size([4, 2])# 创建一个形状为(2, 2, 2)的张量
y = torch.randn(2, 2, 2)
print(y.shape)  # 输出:torch.Size([2, 2, 2])# 使用view_as方法将x的形状改变为与y相同的形状
x = x.view_as(y)
print(x.shape)  # 输出:torch.Size([2, 2, 2])

注意区别

view方法需要你明确指定新的形状。例如,如果你有一个形状为(4, 2)的张量,你可以使用view(2, 4)来将其形状改变为(2, 4)

view_as方法则需要一个目标张量,它会将原始张量的形状改变为与目标张量相同的形状。

相同点是生成的 新的张量和原来张量都是共享底层内存的

3 reshape()函数

reshape使用整体和view差不多

reshape和view,大概率情况下会共享底层内存,但是在不连续的张量情况下(不连续发生在切片或者转置的时候),这时候会建立新的副本,这时候必须用reshape

例子

import torch# 创建一个不连续的张量
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])strided_tensor = tensor[:, ::2]  # 通过切片操作创建不连续的张量# 使用 reshape 函数
reshaped_tensor =strided_tensor.reshape(4,1)reshaped_tensor[0, 0] = 0
print("Original Tensor:", tensor)
print("Strided Tensor:", strided_tensor)
print("Reshaped Tensor:", reshaped_tensor)

输出

Original Tensor: tensor([[1, 2, 3],[4, 5, 6]])
Strided Tensor: tensor([[1, 3],[4, 6]])
Reshaped Tensor: tensor([[0],[3],[4],[6]])

如果这时候继续用view

会报如下错

RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.

4 permute()函数

这段代码是在使用PyTorch处理张量时对张量的维度进行重新排序的操作。

X.permute(1,0,2)是将X的维度进行重新排序。permute方法接收一组维度索引,然后按照这个索引的顺序重新排列张量的维度。

例如,如果X是一个三维张量,其维度是(batch_size, seq_length, feature_size),那么X.permute(1,0,2)将返回一个张量(也是共享底层内存)其维度是(seq_length, batch_size, feature_size)

这种操作在处理序列数据时非常常见,因为某些模型(如RNN、LSTM、GRU等)在输入数据时,需要序列长度(seq_length)在前,批量大小(batch_size)在后。所以,我们通常会使用permute或者transpose方法来调整维度的顺序。

示例如下

import torch# 创建一个3维张量
x = torch.randn(2, 3, 4)# 使用permute进行维度的置换
y = x.permute(1, 0, 2)
print(y.size())  # Output: torch.Size([3, 2, 4])# 可以使用负数表示从最后一个维度开始的相对索引
z = x.permute(2, 1, 0)
print(z.size())  # Output: torch.Size([4, 3, 2])

5 transpose() 函数

在PyTorch中,transpose()函数用于交换张量(tensor)的维度。该函数返回一个新的张量,其维度顺序是原始张量维度的重新排列。

函数签名如下:

torch.transpose(input, dim0, dim1) -> Tensor
  • input: 输入的张量。
  • dim0: 第一个维度的索引。
  • dim1: 第二个维度的索引。

这个函数将input张量的dim0dim1两个维度进行交换。例如,如果input张量的形状是(a, b, c),并且你使用transpose(input, 0, 1),则返回的张量的形状将是(b, a, c),即交换了第一个和第二个维度。

以下是一个简单的示例:

import torch# 创建一个3x4的张量
x = torch.rand((3, 4))# 使用transpose函数交换维度
y = torch.transpose(x, 0, 1)print("原始张量:", x)
print("交换维度后的张量:", y)

请注意,transpose()函数生成的张量并不会和原始张量共享内存,并不会修改原始张量,而是返回一个新的张量副本。如果你希望在原地操作(修改原始张量),可以使用transpose_()方法:

# 在原地操作,修改原始张量
x.transpose_(0, 1)
print("原地操作后的张量:", x)

这里的下划线表示原地操作。

6 squeeze()函数 和 unsqueeze()函数

在PyTorch中,squeezeunsqueeze是用于操作张量形状的函数,用于增加或减少维度。

  1. squeeze函数:

    • torch.squeeze(input, dim=None, out=None)函数用于删除张量中维度为1的轴。如果指定了dim参数,则只会在指定轴上删除大小为1的维度,否则会删除所有大小为1的维度。
    • 参数:
      • input: 输入的张量。
      • dim (可选): 要挤压的维度,如果指定,则只删除指定维度上的大小为1的轴。
      • out (可选): 输出张量,如果指定,则将结果存储在此张量中。
    • 返回值:挤压后的张量。

    示例:

    import torchx = torch.randn(1, 3, 1, 4)
    y = torch.squeeze(x)  # 在所有大小为1的维度上进行挤压
    z = torch.squeeze(x, dim=2)  # 只在维度2上挤压大小为1的轴print(x.shape)  # 输出: torch.Size([1, 3, 1, 4])
    print(y.shape)  # 输出: torch.Size([3, 4])
    print(z.shape)  # 输出: torch.Size([1, 3, 4])
    
  2. unsqueeze函数:

    • torch.unsqueeze(input, dim)函数用于在张量的指定位置插入维度为1的轴。
    • 参数:
      • input: 输入的张量。
      • dim: 插入维度为1的轴的位置。
    • 返回值:插入维度为1的轴后的张量。

    示例:

    import torchx = torch.randn(3, 4)
    y = torch.unsqueeze(x, dim=1)  # 在维度1上插入大小为1的轴print(x.shape)  # 输出: torch.Size([3, 4])
    print(y.shape)  # 输出: torch.Size([3, 1, 4])
    

增加维度还可以通过None的方式增加

import torch# 二维张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])# 在第一个轴上增加维度
y = x[:, None, :]
# 或者使用 torch.unsqueeze
# y = torch.unsqueeze(x, dim=1)print(x.shape)  # 输出: torch.Size([2, 3])
print(y.shape)  # 输出: torch.Size([2, 1, 3])

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

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

相关文章

为什么建议不要买入耳式的耳机?有没有不伤听力的蓝牙耳机

为什么建议不要买入耳式的耳机?因为长时间佩戴入耳式耳机可能会导致耳朵不适甚至疼痛,且存在听力损伤、耳膜损伤的风险,还可能诱发耳道发炎。那么有没有不伤听力的蓝牙耳机呢?当然是有的,我建议尝试一下骨传导蓝牙耳机…

简单实践 java spring cloud 负载均衡

1 概要 1.1 实现一个最简单的微服务。远程调用负载均衡&#xff0c;基本上完成了最核心的微服务框架。 远程调用&#xff1a;RestTemplate 注册中心&#xff1a;eureka 负载均衡&#xff1a;Ribbon 1.2 要点 1.2.1 依赖 1.2.1.1 主框架依赖 spring boot 依赖 <depe…

HarmonyOS鸿蒙 虚拟像素 图片显示

Android中&#xff0c;有的sp&#xff0c;dp&#xff0c;dpi&#xff0c;px等概念。 dpi&#xff0c;dots per inch&#xff0c;代表屏幕像素密度。是指屏幕上每英寸&#xff08;1英寸 2.54 厘米&#xff09;距离中有多少个像素点。 dp&#xff0c;device independent pixels&…

Camille-接口测试

* 接口&#xff1a;不同的系统之间相互连接的部分&#xff0c;是一个传递数据的通道 * 接口测试&#xff1a;检查数据的交换、传递和控制管理过程 网络模型&#xff1a; OSI七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP/IP四层模型 应用层 传输层 网络…

GPT-4 Vision根据应用程序截图生成博客和Readme 升级Streamlit八

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

虚拟机(VMware)ubuntu16.04 直接连接网口设备 USRP 吊舱

编辑虚拟网络编辑器 点击之后 选择网卡之后&#xff0c;点击确定。 电脑配置 使用了&#xff1a;192.168.2.56 虚拟机内部配置 和PC的配置一致

leetcode刷题(剑指offer) 101.对称二叉树

101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; …

Elasticsearch性能调优

背景 项目上是用 ES 做数据库&#xff0c;存储的告警数据&#xff0c;量级在千万级别左右。测试在压测之后&#xff0c;系统频繁出现告警记录查询报错&#xff0c;系统不可用。基于此排查分析项目上 Elasticsearch 的使用是否合理。 版本及硬件 环境&#xff1a;10.xx.xxx.x…

vue前端html导出pdf

package.json中添加依赖 调用方&#xff1a; import htmlToPdf from ../../../utils/file/htmlToPdf.js// 下载方法&#xff0c;pdfDownloadDpi为onClickDownLoad() {htmlToPdf.getPdf(标题1, jsfgyzcpgxmShow, this.pdfDownloadDpi)}htmlToPdf.js // 页面导出为pdf格式 imp…

漏洞01-目录遍历漏洞/敏感信息泄露/URL重定向

目录遍历漏洞/敏感信息泄露/URL重定向 文章目录 目录遍历敏感信息泄露URL重定向 目录遍历 敏感信息泄露 于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; ---通过访问url下的目录&#xff0c;可以直接列出目录下…

秋招面试—JS篇

2024 JavaScript面试题 1.new 操作符的工作原理 ①.创建一个新的空对象 ②.将这个对象的原型设置为函数的 prototype 对象 ③.让函数的this指向该对象&#xff0c;为函数添加属性和方法 ④.最后返回这个对象 2.什么是DOM&#xff0c;什么是BOM? DOM&#xff1a;文档对象…

代码随想录算法训练营第二十二天|235 二叉搜索树的最近公共祖先、701 二叉搜索树中的插入操作、450 删除二叉搜索树中的节点

235 二叉搜索树的最近公共祖先 题目链接&#xff1a;二叉搜索树的最近公共祖先 思路 因为二叉搜索树是有序的&#xff0c;因此p和q的最近公共祖先一定在两者之间&#xff0c;所以每到一个节点&#xff0c;该节点的数值如果大于p和q&#xff0c;则朝左子树走&#xff1b;如果…

C/C++ - 函数模板

目录 函数模板基础 函数模板定义 函数模板实例 函数模板调用 函数模板本质 模板函数特化 模板参数限定 默认模板参数 多个模板参数 非类型模板参数 函数模板拓展 模板参数匹配规则 函数模板基础 函数模板定义 使用 template <typename T>​​​​​ 或 templ…

ElementUI Form:Input 输入框

ElementUI安装与使用指南 Input 输入框 点击下载learnelementuispringboot项目源码 效果图 el-input.vue &#xff08;Input 输入框&#xff09;页面效果图 项目里el-input.vue代码 <script> export default {name: el_input,data() {return {input: ,input1: ,i…

SOME/IP SD 协议介绍(五)使用SOME/IP-SD宣布非SOME/IP协议的协议。

使用SOME/IP-SD宣布非SOME/IP协议的协议。 除了SOME/IP之外&#xff0c;车辆内部还使用其他通信协议&#xff0c;例如用于网络管理、诊断或闪存更新。这些通信协议可能需要传递服务实例或具有事件组。 对于非SOME/IP协议&#xff0c;应使用特殊的服务ID&#xff0c;并使用配置…

养猫家庭必备宠物空气净化器吗?性价比猫用空气净化器牌子推荐

家里的可爱猫咪们带来了很多快乐&#xff0c;但是它们的毛发却无处不在&#xff0c;飞舞在整个房间里。而且如果猫砂盆不及时清理&#xff0c;整个屋子都会弥漫着难闻的气味。每天都要清理工作&#xff0c;但是有时候我们也没有那么多精力。虽然享受着猫咪们带来的快乐&#xf…

C# wpf 字体图标预览,html字符与unicode转换

在进行wpf 开发工作过程中遇到字体图标无法预览的问题&#xff0c;特此记录。 1、把需要预览的字体文件上传到网站上进行转换 Create Your Own font-face Kits Font Squirrel2、下载文件后进行解压。 3、找到 Glyph Chart 查看字体html字符编码4、在wpf中直接使用即可 <…

C语言数据结构之二叉树

少年恃险若平地 独倚长剑凌清秋 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 &#x1f3a5;前期回顾-栈和队列 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 目录 树的定义与判定 树的定义 树的判定 树的相关概念 树的运用…

AI魔幻巨制《魔戒4》电影宣传片

AI魔幻巨制《魔戒4》电影宣传片 中土世界的命运悬于一线。 争夺魔戒的最终战斗已经开始。 面对无边的黑暗&#xff0c;光明战士将挺身而出。 光明与黑暗在终极对决中碰撞。 英雄崛起&#xff0c;传奇重生。 最后的战斗即将来临。 谁是拯救世界的英雄&#xff1f; 想看哪部…

Python生态系统中10个强大的 Web 框架

在蓬勃发展的Python生态系统中&#xff0c;一系列强大的 Web 框架可以满足不同的开发人员需求。选择正确的产品对于成功的 Web 开发之旅至关重要。 Django&#xff1a; Django是古老的 Python 框架&#xff0c;以其成熟、安全且功能丰富的架构而屹立不倒。它采用包含插件的理…