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

深度学习02-pytorch-06-张量的形状操作

在 PyTorch 中,张量的形状操作是非常重要的,可以让你灵活地调整和处理张量的维度和数据结构。以下是一些常用的张量形状函数及其用法,带有详细解释和举例说明:

1. reshape()

功能: 改变张量的形状,但不改变数据的顺序。

语法: tensor.reshape(*shape)

示例:

import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
x_reshaped = x.reshape(3, 2)
print(x_reshaped)

输出:

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

在这个例子中,张量 x 被从形状 (2, 3) 重塑为 (3, 2)

2. squeeze()

功能: 去除张量中大小为1的维度(例如,形状是 (1, 3, 1) 会变成 (3))。

语法: tensor.squeeze(dim=None)

示例:

x = torch.tensor([[[1, 2, 3]]])  # shape: (1, 1, 3)
x_squeezed = x.squeeze()
print(x_squeezed)

输出:

tensor([1, 2, 3])

在这个例子中,squeeze() 去除了前两个大小为1的维度。

3. unsqueeze()

功能: 在指定的维度插入大小为1的新维度。

语法: tensor.unsqueeze(dim)

示例:

x = torch.tensor([1, 2, 3])  # shape: (3,)
x_unsqueezed = x.unsqueeze(0)  # 插入新的0维
print(x_unsqueezed.shape)  # 输出: torch.Size([1, 3])

在这个例子中,

unsqueeze(0) 在第0个维度插入一个新的大小为1的维度,将形状从 (3,) 变成 (1, 3)

4. transpose()

功能: 交换张量的两个维度。

语法: tensor.transpose(dim0, dim1)

示例:

x = torch.tensor([[1, 2, 3], [4, 5, 6]])  # shape: (2, 3)
x_transposed = x.transpose(0, 1)
print(x_transposed)

输出:

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

在这个例子中,transpose(0, 1) 交换了维度0和维度1,使张量的形状从 (2, 3) 变成 (3, 2)

5. permute()

功能: 改变张量的维度顺序,允许对多个维度进行交换。

语法: tensor.permute(*dims)

示例:

x = torch.randn(2, 3, 5)  # shape: (2, 3, 5)
x_permuted = x.permute(2, 0, 1)
print(x_permuted.shape)  # 输出: torch.Size([5, 2, 3])

在这个例子中,permute(2, 0, 1) 重新排列了维度顺序,

使得形状从 (2, 3, 5) 变为 (5, 2, 3)

6. view()

功能: 类似于 reshape(),但是 view() 需要张量在内存中是连续的。

语法: tensor.view(*shape)

示例:

x = torch.tensor([[1, 2, 3], [4, 5, 6]])
x_viewed = x.view(3, 2)
print(x_viewed)

输出:

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

view() 的使用需要张量是连续的,否则会报错。

关于连续性,可以结合 contiguous() 使用。

7. contiguous()

功能: 将非连续的张量转换为在内存中连续存储的张量。

语法: tensor.contiguous()

示例:

x = torch.randn(2, 3, 5)
x_permuted = x.permute(2, 0, 1)  # 这使得张量不再连续
x_contiguous = x_permuted.contiguous().view(5, 6)  # 转换为连续后再进行view操作
print(x_contiguous.shape)

permute() 操作后的张量不一定是连续的,因此需要 contiguous() 来保证可以使用 view()

8. expand()repeat()

功能: 扩展张量到更高的维度。

  • expand() 只是广播,不复制内存。

  • repeat() 会实际复制数据。

示例:

x = torch.tensor([1, 2, 3])
x_expanded = x.expand(3, 3)  # 广播
x_repeated = x.repeat(3, 1)  # 重复数据
print(x_expanded)
print(x_repeated)

输出:

tensor([[1, 2, 3],[1, 2, 3],[1, 2, 3]])
​
tensor([[1, 2, 3],[1, 2, 3],[1, 2, 3]])

区别在于 expand() 不会占用更多内存,而 repeat() 会真正复制数据。

总结

上述这些张量操作函数在处理多维数据时非常有用,能够灵活地调整和转换张量的形状,以便进行各种操作和模型设计。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++的 try-catch 结构
  • Gitlab学习(008 gitlab开发工作流GitFlow)
  • 这是一篇给Java小白看的JVM文章
  • Diffusion Models/Score-based Generative Models背后的深度学习原理(7):估计配分函数
  • 【机器学习】——支持向量机
  • antd table 可展开行的多种控制
  • PS教程,从零开始学PS
  • css基础知识笔记
  • 告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件
  • [数据集][目标检测]中草药类型识别检测数据集VOC+YOLO格式7976张45类别
  • JVM 虚拟机的编译器、类加载过程、类加载器有哪些?
  • 信息技术的革新与未来展望
  • 面试金典题2.6
  • TLV解码 - 华为OD统一考试(E卷)
  • C++第十二节课 模板初阶和string引入
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • CentOS7 安装JDK
  • github指令
  • JavaScript-Array类型
  • Koa2 之文件上传下载
  • Laravel 中的一个后期静态绑定
  • Map集合、散列表、红黑树介绍
  • nodejs:开发并发布一个nodejs包
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP 小技巧
  • PV统计优化设计
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 产品三维模型在线预览
  • 成为一名优秀的Developer的书单
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 计算机常识 - 收藏集 - 掘金
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 优秀架构师必须掌握的架构思维
  • 云大使推广中的常见热门问题
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​io --- 处理流的核心工具​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #每天一道面试题# 什么是MySQL的回表查询
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (C++)八皇后问题
  • (HAL库版)freeRTOS移植STMF103
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore
  • .libPaths()设置包加载目录
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET BackgroundWorker
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core 的缓存方案
  • .NET 发展历程
  • .net 提取注释生成API文档 帮助文档
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter