PyTorch使用(6)-张量形状操作

news2025/4/16 17:16:19

文章目录

  • 1. reshape函数
    • 1.1. 功能与用法
    • 1.2. 特点
  • 2. transpose和permute函数
    • 2.1. transpose
    • 2.2. permute
    • 2.3. 区别
  • 3. view和contiguous函数
    • 3.1. view
    • 3.2. contiguous
    • 3.3. 特点
  • 4. squeeze和unsqueeze函数
    • 4.1. squeeze
    • 4.2. unsqueeze
  • 5. 应用场景
  • 6. 形状操作综合比较
  • 7. 最佳实践建议
  • 8. 总结

1. reshape函数

1.1. 功能与用法

reshape函数可以改变张量的形状而不改变其数据,新形状的元素总数必须与原张量一致。

import torch

x = torch.arange(6)  # tensor([0, 1, 2, 3, 4, 5])

# 改变形状为2x3
y = x.reshape(2, 3)
"""
tensor([[0, 1, 2],
        [3, 4, 5]])
"""

# 自动推断维度大小
z = x.reshape(3, -1)  # -1表示自动计算该维度大小
"""
tensor([[0, 1],
        [2, 3],
        [4, 5]])
"""

1.2. 特点

  • 不改变原始数据,只改变视图

  • 可以处理非连续内存的张量

  • 当无法返回视图时会自动复制数据

2. transpose和permute函数

2.1. transpose

交换两个指定维度:

x = torch.randn(2, 3, 4)

# 交换维度0和1
y = x.transpose(0, 1)  # 形状变为(3, 2, 4)

# 对于2D张量,transpose相当于矩阵转置
matrix = torch.randn(3, 4)
matrix.T == matrix.transpose(0, 1)  # True

2.2. permute

重新排列所有维度:

x = torch.randn(2, 3, 4, 5)

# 重新排列维度顺序
y = x.permute(2, 0, 3, 1)  # 新形状(4, 2, 5, 3)

2.3. 区别

  • transpose只能交换两个维度
  • permute可以任意重新排列所有维度

3. view和contiguous函数

3.1. view

类似于reshape,但要求张量是连续的:

x = torch.arange(6)

# 改变形状
y = x.view(2, 3)

# 会报错的情况
x_non_contiguous = x.t()  # 转置后不连续
try:
    x_non_contiguous.view(6)
except RuntimeError as e:
    print(e)  # 需要连续张量

3.2. contiguous

使张量在内存中连续排列:

x = torch.randn(3, 4).transpose(0, 1)  # 不连续张量

# 转换为连续张量
x_cont = x.contiguous()  # 可能复制数据

# 现在可以使用view
y = x_cont.view(12)

3.3. 特点

  • view比reshape更快,但有限制

  • 转置、切片等操作可能导致不连续

  • 需要view操作前应检查连续性

4. squeeze和unsqueeze函数

4.1. squeeze

移除所有大小为1的维度:

x = torch.randn(1, 3, 1, 2)

# 移除所有大小为1的维度
y = x.squeeze()  # 形状变为(3, 2)

# 只移除指定维度
z = x.squeeze(dim=0)  # 形状变为(3, 1, 2)

4.2. unsqueeze

在指定位置增加大小为1的维度:

x = torch.randn(3, 4)

# 在维度0增加一个维度
y = x.unsqueeze(0)  # 形状变为(1, 3, 4)

# 在维度1增加一个维度
z = x.unsqueeze(1)  # 形状变为(3, 1, 4)

5. 应用场景

  • unsqueeze常用于广播前的维度对齐

  • squeeze常用于移除不必要的单维度

  • 神经网络输入/输出经常需要调整维度

6. 形状操作综合比较

操作是否改变数据是否要求连续适用场景性能
reshape通用形状改变
view快速形状改变
transpose交换两个维度
permute复杂维度重排
squeeze移除单维度
unsqueeze增加单维度

7. 最佳实践建议

  • 优先使用view:当确定张量连续时,view性能更好

  • 注意连续性:复杂操作后使用is_contiguous()检查

  • 维度顺序:保持合理的维度顺序(N,C,H,W等)

  • 避免频繁reshape:多次形状改变可能降低性能

  • 使用-1推断:合理利用-1自动计算维度大小

# 形状操作典型工作流示例
def prepare_input(data):
    # 增加batch维度
    data = data.unsqueeze(0)
    
    # 确保内存连续
    if not data.is_contiguous():
        data = data.contiguous()
        
    # 改变形状为网络输入格式
    return data.view(1, -1, data.size(-1))

8. 总结

  • reshape:用来改变张量的形状,返回一个新的张量。
  • transpose:交换张量的两个维度。
  • permute:按指定的维度顺序重新排列张量的所有维度。
  • view:用来改变张量的形状,要求张量在内存中是连续的。
  • contiguous:确保张量是连续的,可以在需要 view 操作时使用。
  • squeeze:去除张量中维度为1的维度。
  • unsqueeze:在张量的指定位置添加一个维度。

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

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

相关文章

SpringBoot底层-数据源自动配置类

SpringBoot默认使用Hikari连接池,当我们想要切换成Druid连接池,底层原理是怎样呢 SpringBoot默认连接池——Hikari 在spring-boot-autoconfiguration包内有一个DataSourceConfiguraion配置类 abstract class DataSourceConfiguration {Configuration(p…

数字内容个性化推荐引擎构建

实时数据驱动推荐优化 现代数字内容体验的核心竞争力在于系统对用户需求的即时捕捉与响应。通过实时数据流处理技术,推荐引擎能够同步采集用户点击、停留时长、交互轨迹等多维度行为数据,并借助分布式计算框架在毫秒级完成特征提取与模式识别。例如&…

【工具】Redis管理工具推荐

【运维】Redis管理工具推荐 Another Redis Desktop Manager 🚀🚀🚀 更快、更好、更稳定的Redis桌面(GUI)管理客户端,兼容Windows、Mac、Linux,性能出众,轻松加载海量键值 AnotherRedisDesktopManager 发行版…

【高校主办】2025年第四届信息与通信工程国际会议(JCICE 2025)

重要信息 会议网址:www.jcice.org 会议时间:2025年7月25-27日 召开地点:哈尔滨 截稿时间:2025年6月15日 录用通知:投稿后2周内 收录检索:EI,Scopus 会议简介 JCICE 2022、JCICE 2023、JCICE 2…

【区块链安全 | 第三十一篇】合约(五)

文章目录 合约库库中的函数签名和选择器库的调用保护合约 库 库与合约类似,但它们的目的是仅在特定地址上部署一次,并通过 EVM 的 DELEGATECALL(在 Homestead 之前是 CALLCODE)功能重复使用其代码。这意味着如果调用库函数,它们的代码将在调用合约的上下文中执行,即 th…

系统与网络安全------Windows系统安全(8)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 DNS DNS概述 为什么需要DNS系统 www.baidu.com与119.75.217.56,哪个更好记? 互联网中的114查号台/导航员 DNS(Domian Name System,域名系统)的功…

ROS云课三分钟-差动移动机器人巡逻报告如何撰写-中等报告

评语: 成绩中等(70/100),具体如下: 1. 摘要部分 问题描述: 内容空洞:摘要过于简短,仅简要概述了研究内容和实现方法,未突出研究的创新点或重要性。缺乏细节&#xff1…

Java8+Spring Boot + Vue + Langchain4j 实现阿里云百炼平台 AI 流式对话对接

1. 引言 在本文中,我们将介绍如何使用 Spring Boot、Vue.js 和 Langchain4j,实现与 阿里云百炼平台 的 AI 流式对话对接。通过结合这些技术,我们将创建一个能够实时互动的 AI 聊天应用。 这是一个基于 Spring Boot Vue.js Langchain4j 的智…

Dify接口api对接,流式接收流式返回(.net)

试了好多种方法除了Console.WriteLine()能打印出来,试了好些方法都不行,不是报错就是打印只有一行,要么就是接收完才返回...下面代码实现调用api接收流式数据,并进行流式返回给前端: using Furion.HttpRemote; using …

代码随想录算法训练营第五十二天|图论专题: 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿

101. 孤岛的总面积 本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。 1、从左边和后边向中间遍历 2、从上边和下边向中间遍历…

仿modou库one thread one loop式并发服务器

源码:田某super/moduo 目录 SERVER模块: Buffer模块: Socket模块: Channel模块: Connection模块: Acceptor模块: TimerQueue模块: Poller模块: EventLoop模块&a…

SpringSecurity6.0 通过JWTtoken进行认证授权

之前写过一个文章,从SpringSecurity 5.x升级到6.0,当时是为了配合公司的大版本升级做的,里面的各项配置都是前人留下来的,其实没有花时间进行研究SpringSecurity的工作机制。现在新东家有一个简单的系统要搭建,用户的认…

【Java】Maven

一、概念 是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建。 二、Maven坐标 <groupId>com.itheima</groupId><artifactId>maven-project01</artifactId>&…

MATLAB中plot函数的详细参数表

LineSpec - 线型、标记和颜色 线型说明-实线--虚线:点线-.点划线 标记说明o圆圈加号*星号.点x叉号_水平线条|垂直线条s方形d菱形^上三角v下三角>右三角<左三角p五角形h六角形 颜色说明 y 黄色 m 品红色 c 青蓝色 r 红色 g 绿色 b 蓝色 w 白色 k 黑色 MarkerFaceColor…

R语言赋能气象水文科研:从多维数据处理到学术级可视化

全球气候变化加剧了极端天气与水文事件的复杂性&#xff0c;气象卫星、雷达、地面观测站及水文传感器每天产生TB级‌时空异质数据‌。传统研究常面临四大瓶颈&#xff1a; ‌数据清洗低效‌&#xff1a;缺失值、异常值处理耗时&#xff1b;‌时空分析模型构建复杂‌&#xff1…

BGP路由协议之属性2

Orgin 起源 公认必遵属性 起源名称标记描述IGPi如果路由是由始发的 BGP 路由器使用 network 命令注入到 BGP 的&#xff0c;那么该 BGP 路由的 origin 属性为 IGPEGPe如果路由是通过 EGP 学习到的&#xff0c;那么该 BGP 路由的 Origin 属性为 EGPIncomplete?如果路由是通过…

纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个

算法索引 01背包优化前空间优化版&#xff08;使用一维数组&#xff09;优化后的模拟流程图为何优化后&#xff0c;j不能使用正序遍历模拟流程图 代码对应实现案例 01背包 优化前 /*** 0-1背包问题解法&#xff08;与下方代码表格示例对应&#xff0c;已模拟验证&#xff09;*…

算法与数据结构线性表之栈和队列

Hello大家好&#xff01; 很高兴与大家见面&#xff01; 给生活添点快乐&#xff0c;开始今天的编程之路。 我的博客:<但愿. 我的专栏:C语言、题目精讲、算法与数据结构、C 欢迎点赞&#xff0c;关注 一 栈 1概念&#xff1a;栈是⼀种特殊的线性表&#xff0c;其只允许…

python应用之使用pdfplumber 解析pdf文件内容

目录标题 一. 通过 pdfplumber.open() 解析复杂PDF&#xff1a;1-2. 报错&#xff1a;V2 &#xff1a; 1-3. v3 使用tk 库&#xff0c;弹框选择文件运行环境准备完整代码保存运行测试步骤方式二&#xff1a;命令行方式&#xff08;适用于自动化&#xff09; 测试用例示例常见问…

Vue中使用antd-table组件实现数据选择、禁用、已选择禁用-demo

实现案例 实现过程 表格代码 关键代码 :row-selection="rowSelection" <div><div class="flex items-center justify-between pt-[24px] pb-[16px]"><p>已选:{{ keysNum }}</p><a-input-search v-model:value="productN…