惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
量子位
有赞技术团队
有赞技术团队
博客园 - 三生石上(FineUI控件)
博客园 - Franky
M
MIT News - Artificial intelligence
U
Unit 42
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
J
Java Code Geeks
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
MyScale Blog
MyScale Blog
T
Tailwind CSS Blog
T
The Blog of Author Tim Ferriss
V
V2EX

博客园 - xiezhengcai

日志分层设计 Ai阅读代码的局限性 业务系统缓存加速的五种缓存设计 The CustomResourceDefinition "applications.apps.abc.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes vscode ssh开发无法读取go env配置 deepspeed ray + nccl + 张量并行 训练 ray集群 ray 分布式, 工作节点、reylet、 主节点、GCS ray分布式 nccl & mpi 跨节点通信 cudaMemsetParams 参数详细 cuda 中的内存拷贝 cuda 编程 cuda vllm 参数分类 张量计算流程图标注方法 为什么nn.Linear 的weight 是 (out_features, in_features) PyTorch交叉熵损失函数详解
torch.view、unsqueeze、reshape、transpose 和 permute
xiezhengcai · 2025-03-26 · via 博客园 - xiezhengcai

好的!在 PyTorch 中,调整张量形状和维度的常用操作包括 torch.viewunsqueezereshapetransposepermute。以下是它们的详细对比总结:


1. torch.view

  • 功能:调整张量形状,不改变数据顺序,要求张量是连续的(contiguous)。
  • 特点
    • 共享底层数据,修改新张量会影响原张量。
    • 如果张量不连续,需先调用 .contiguous()
  • 示例
    x = torch.arange(6)          # shape (6,)
    y = x.view(2, 3)             # shape (2, 3)
    

2. torch.reshape

  • 功能:类似 view,但自动处理非连续张量(必要时复制数据)。
  • 特点
    • 行为与 view 一致时共享数据,否则生成新张量。
    • 更通用,但可能有性能开销。
  • 示例
    x = torch.arange(6)
    y = x.reshape(2, 3)          # 结果同 view
    

3. torch.unsqueeze

  • 功能:在指定维度插入大小为 1 的维度。
  • 用途:扩展维度(如添加批次维度或适配广播)。
  • 示例
    x = torch.tensor([1, 2, 3])  # shape (3,)
    y = x.unsqueeze(0)           # shape (1, 3)
    

4. torch.transpose

  • 功能:交换两个指定维度,改变数据顺序
  • 特点
    • 返回的可能是非连续张量,需配合 .contiguous() 使用。
    • 共享底层数据(视图操作)。
  • 示例
    x = torch.randn(2, 3, 4)     # shape (2, 3, 4)
    y = x.transpose(0, 1)         # shape (3, 2, 4)(交换维度0和1)
    

5. torch.permute

  • 功能:按指定顺序重新排列所有维度,灵活调整维度顺序
  • 特点
    • transpose 更通用(可一次调整多个维度)。
    • 可能返回非连续张量,需配合 .contiguous()
  • 示例
    x = torch.randn(2, 3, 4)     # shape (2, 3, 4)
    y = x.permute(2, 0, 1)        # shape (4, 2, 3)
    

对比总结

方法 作用 是否共享数据 连续性要求 是否改变数据顺序 典型场景
view 调整形状 必须连续 高效调整连续张量形状
reshape 调整形状(更安全) 可能不共享 通用形状调整
unsqueeze 插入维度 扩展维度(如添加批次)
transpose 交换两个维度 交换维度(如矩阵转置)
permute 重新排列所有维度顺序 复杂维度重排(如通道顺序调整)

关键区别

  1. view vs reshape

    • view 要求张量连续,否则报错;reshape 自动处理非连续张量(可能复制数据)。
    • 优先用 view(高效),不确定连续性时用 reshape
  2. transpose vs permute

    • transpose 只能交换两个维度;permute 可一次性调整任意多个维度顺序。
    • 例如,将形状 (B, C, H, W) 转换为 (B, H, W, C)permute(0, 2, 3, 1)
  3. 是否改变数据顺序

    • view/reshape/unsqueeze 仅调整形状或扩展维度,不改变数据顺序
    • transpose/permute 改变数据顺序(维度交换后,内存布局可能不连续)。

常见问题

  1. 何时需要 contiguous()
    当使用 transposepermute 后,若需要调用 view,需先调用 .contiguous() 确保数据连续:

    x = x.permute(0, 2, 1).contiguous().view(-1, 10)
    
  2. 如何恢复原始维度顺序?
    使用 permutetranspose 的逆操作:

    x = torch.randn(4, 2, 3)
    y = x.permute(1, 2, 0)  # shape (2, 3, 4)
    z = y.permute(2, 0, 1)  # 恢复原状 (4, 2, 3)
    
  3. unsqueeze 的逆操作是什么?
    使用 squeeze 删除大小为 1 的维度:

    x = torch.randn(1, 3, 1, 4)
    y = x.squeeze()  # 删除所有大小为1的维度,shape (3, 4)
    

实际应用场景

  1. 图像维度调整

    • (N, H, W, C) 转换为 (N, C, H, W)(适配卷积输入):
      x = x.permute(0, 3, 1, 2)
      
  2. 矩阵转置

    • transpose 交换最后两个维度:
      x = torch.randn(3, 4)
      y = x.transpose(0, 1)  # shape (4, 3)
      
  3. 添加批次维度

    • 单样本数据增加批次维度:
      x = torch.randn(3, 224, 224)
      x = x.unsqueeze(0)  # shape (1, 3, 224, 224)
      

掌握这些操作能灵活处理张量形状和维度,适配不同模型的输入需求!