当前位置: 首页 > news >正文

PyTorch 张量变形指南:彻底搞懂 view, reshape, permute, transpose

简介

PyTorch中,viewreshapepermutetranspose都是用于改变张量(Tensor)形状或维度的操作,但它们的实现机制、使用限制和底层原理存在关键区别。

下面我将为你详细解析它们的功能、区别与联系。

接口主要功能核心特点
view改变张量形状返回新张量,与原张量共享内存,要求张量在内存中是连续的。
reshape改变张量形状功能与view类似,但更灵活,能处理非连续张量。
permute重排所有维度顺序返回新张量,交换维度,不改变元素总数。
transpose交换两个指定维度permute的特例,专门用于交换两个维度。

实例

1、viewreshape

创建一个 2×3 的张量

importtorch x=torch.arange(6).reshape(2,3)print(x)print(x.shape)

输出:

tensor([[0,1,2],[3,4,5]])torch.Size([2,3])

view:改变形状

y_view=x.view(6)print(y_view)

输出:

tensor([0,1,2,3,4,5])

transpose:交换两个指定维度,会使张量在内存中变得不在连续

y_transpose=x.transpose(0,1)print(y_transpose)print(y_transpose.is_contiguous())

输出:

由原始的(2,3)变为(3,2)

tensor([[0,3],[1,4],[2,5]])False

直接对x_transpose使用view会报错,因为view只能处理在内存中连续的张量

y_transpose_view=y_transpose.view(6)print(y_transpose_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.

必须先使用contiguous()把张量变为连续

y_transpose_view=y_transpose.contiguous().view(6)print(y_transpose_view)

输出:

tensor([0,3,1,4,2,5])

reshape:会自动处理不连续的情况

y_reshape=y_transpose.reshape(6)print(y_reshape)

输出:

tensor([0,3,1,4,2,5])

2、permutetranspose

创建出一个三维张量

importtorch z=torch.randn(2,3,4)print(z.shape)

输出:

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

transpose::交换最后两个维度

z_transpose=z.transpose(1,2)print(f"交换维度后的形状:{z_transpose.shape}")

输出:

原来的形状是[2, 3, 4]

​ 0,1,2 交换1和2 也就是 [2, 4, 3]

交换维度后的形状:torch.Size([2,4,3])

permute:将维度顺序完全颠倒

z_permute=z.permute(2,1,0)print(f"重排维度后的形状:{z_permute.shape}")

输出:

原来的形状是[2, 3, 4]

​ 0,1,2 维度变为 2,1,0 也就变为[4, 3, 2],如果permute(2,0,1) 则是 [4, 2, 3]

重排维度后的形状:torch.Size([4,3,2])

对比

viewvsreshape: 改变形状

这两个方法都用于改变张量的“外观”(形状),而不改变其内部元素的总数。

  • view
    • 工作原理:它只是创建了一个指向原始数据的新“视图”,不会复制数据。因此,修改view返回的张量也会影响原始张量。
    • 关键限制:它要求原始张量在内存中是**连续存储(contiguous)**的。如果你对张量进行了transposepermute等操作,它在内存中的存储顺序会变得不连续,此时直接调用view会报错。
    • 解决方法:在不连续的张量上调用view前,必须先调用.contiguous()方法,使其在内存中变为连续。
  • reshape
    • 工作原理:它是view的一个更“智能”和“宽容”的版本。如果原始张量是连续的,reshape的行为和view完全一样(共享内存)。如果张量不连续,reshape自动复制数据,创建一个新的连续张量并返回。
    • 优点:使用更方便,不用担心连续性问题。
    • 缺点:由于可能触发数据复制,在某些情况下性能开销会比view稍大。

一句话总结:在确定张量是连续的情况下,优先使用view;如果不确定或想图省事,就用reshape

permutevstranspose: 交换维度

这两个方法都用于改变张量的维度顺序,而不是改变形状本身。

  • permute
    • 功能:可以对张量的所有维度进行任意顺序的重排。你需要传入一个包含所有维度索引的元组。
    • 示例:一个形状为(C, H, W)的图像张量,如果想变为(H, W, C),就需要使用tensor.permute(1, 2, 0)
  • transpose
    • 功能:是permute的一个特例,专门用于交换两个指定的维度
    • 示例:一个形状为(N, C)的二维矩阵,进行转置操作tensor.transpose(0, 1)后,形状变为(C, N)。对于二维张量,transpose(0, 1)permute(1, 0)的效果是完全一样的。

一句话总结:当只需要交换两个维度时,使用transpose更直观;当需要重排多个维度时,必须使用permute

核心区别与联系

  1. 功能目的不同
    • view/reshape用于改变形状(例如,将[2, 3]变为[6])。
    • permute/transpose用于改变维度顺序(例如,将[2, 3]变为[3, 2])。
  2. 内存连续性要求不同
    • view对内存连续性有严格要求。
    • reshapepermutetranspose通常不要求张量是连续的(reshape会自动处理,permute/transpose会返回一个非连续的新视图)。
  3. 联系
    • reshape可以看作是view的“超集”,功能上包含了view
    • transposepermute在二维情况下的特例。
    • 一个常见的组合操作是:先使用permutetranspose交换维度,然后调用.contiguous(),最后使用view来改变形状。

完整代码

importtorch# view 与 reshapex=torch.arange(6).reshape(2,3)print(x)print(x.shape)y_view=x.view(6)print(y_view)y_transpose=x.transpose(0,1)print(y_transpose)print(y_transpose.is_contiguous())y_transpose_view=y_transpose.contiguous().view(6)print(y_transpose_view)y_reshape=y_transpose.reshape(6)print(y_reshape)# permute 与 transposez=torch.randn(2,3,4)print(z.shape)z_transpose=z.transpose(1,2)print(f"交换维度后的形状:{z_transpose.shape}")z_permute=z.permute(2,1,0)print(f"重排维度后的形状:{z_permute.shape}")
http://www.jsqmd.com/news/706196/

相关文章:

  • AI写论文秘籍!4款AI论文生成工具,帮你轻松完成学术大作
  • 淘宝淘金币自动化脚本:每天节省30分钟的全任务智能解决方案
  • LLM应用开发模块化工具箱:从设计模式到实战构建智能体
  • 基于深度强化学习的LC-RIS毫米波通信优化方案
  • MCP 2026适配不是选修课——为什么2026年Q2后所有新车型公告将自动驳回未通过MCP-TPMv2.1验证的申报?
  • 2026出国务工选劳务公司:正规出国务工机构、出国务工公司派遣、出国务工正规劳务公司、出国劳务出国务工、出国劳务哪里工资高选择指南 - 优质品牌商家
  • 企业级实战:从零手写 Spring Boot Starter,打造公司级组件库
  • SpringBoot+Vue垃圾分类回收管理系统源码+论文
  • 机器学习自学路线:从基础到深度学习实战
  • GitHub Profile深度定制:从静态展示到动态自动化名片
  • AI环境管理框架AEnvironment:解决多模型开发部署难题
  • 【MySQL深入详解】第10篇:MySQL配置原理——从配置文件到动态变量
  • Spring Boot 优雅实现异步调用:从入门到自定义线程池与异常处理
  • 论文阅读:ICLR 2026 AlphaAlign: Incentivizing Safety Alignment with Extremely Simplified Reinforcement Le
  • 如何快速提升麻将水平:终极雀魂AI助手Akagi完整指南
  • 深度强化学习实战:从DQN到PPO的算法实现与调参指南
  • 卷烟卷接包产线CPM1A控制器以太网化改造:一机多联通讯架构设计
  • 【限时开放】Docker官方2026安全基线评估工具(非开源版)内测资格仅剩47席:自动扫描你的AI训练镜像是否存在LLM提示注入残留、权重后门及CUDA驱动提权路径
  • R语言描述性统计:数据分析第一步与实战技巧
  • 基于LangChain与Azure OpenAI构建智能问答云函数实战指南
  • 一文吃透微服务:从单体到RPC、服务治理、下一代架构Service Mesh
  • 探索论文写作新宇宙:书匠策AI,毕业论文的“星际导航员”!
  • Akagi麻雀助手:终极指南 - 如何用AI提升你的雀魂麻将水平
  • Spring Boot AOP 面向切面编程:从原理到实战,一篇就会
  • Go语言怎么做AES加密_Go语言AES加密解密教程【精选】
  • 基于安卓的快递包裹隐私保护系统毕业设计源码
  • OpenCV中SVM算法原理与图像分类实战
  • 广西广告标识源头厂家哪家好?深度对比TOP10榜单揭晓 - 速递信息
  • AI模型推理沙箱化实践(Docker+gVisor+eBPF三重加固方案)
  • 手把手教你搞定移远EC200U/EC25的Linux驱动:从硬件检查到串口映射的保姆级教程