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

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

文章目录

  • 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:在张量的指定位置添加一个维度。

相关文章:

  • Linux笔记之Ubuntu系统设置自动登录tty1界面
  • 七种驱动器综合对比——《器件手册--驱动器》
  • 14-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))
  • Mysql是怎么存储数据的
  • 从代码学习深度学习 - 序列到序列学习数据预处理 PyTorch 版
  • Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案
  • [Effective C++]条款27:尽量少做转型动作
  • VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr
  • 安卓ConstraintLayout + Barrier 实战:让 TextView 动态宽度但不超过另一个控件
  • QT ARM 开发环境搭建
  • 深度解析LinkedList工作原理
  • 一个极简的反向传播实现
  • 【数据分享】1999—2023年地级市地区生产总值及一二三产构成数据(Shp/Excel格式)
  • 快速排序笔记
  • 16、Swift框架微调实战(1)-自我认知数据LORA微调
  • 基于大模型的病态窦房结综合征预测及治疗方案研究报告
  • 【Git “rev-parse“ 命令详解】
  • Redis的常用数据结构
  • 【数学建模】描述统计量与常见概率分布:从理论到实践的深度解析
  • I/O进程1
  • 上海市政府党组赴全面从严治党警示教育基地参观学习,推进作风建设走深走实
  • 阳朔兴坪镇:在建乾元桥“垮塌”是谣言,系降雨导致工程挡土墙倾斜
  • 上海国际电影电视节 | 奔赴电影之城,开启光影新程
  • 河北省纪委原副书记、省监委原副主任陈玉祥一审获刑十二年
  • 外交部:国际调解院着眼以调解定分止争,更好维护国际公平正义
  • 两次通话、三点诉求,泽连斯基对美称愿与俄签署和平备忘录