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

Pytorch使用教学2-Tensor的维度

在这里插入图片描述

PyTorch使用的过程中,维度转换一定少不了。而PyTorch中有多种维度形变的方法,我们该在什么场景下使用什么方法呢?

本小节我们使用的张量如下:

# 一维向量
t1 = torch.tensor((1, 2))
# 二维向量
t2 = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 三维向量
t3 = torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]]])

1 张量的维度与形状

张量为一组数的结构化表示。简单理解,向量就是一维数组,矩阵为二维数组,此外我们还可以定义更高维度的数组。张量的高维数组和Numpy中高维Array概念类似。

1.1 ndim查看张量维度

print(t1.ndim, t2.ndim, t3.ndim, sep = ', ')
# 1, 2, 3
# t1为1维向量
# t2为2维矩阵
# t3为3维张量

1.2 shape&size()查看向量的形状

print(t1.shape, t2.shape, t3.shape, sep = ', ')
# torch.Size([2]), torch.Size([2, 3]), torch.Size([2, 2, 2])print(t1.size(), t2.size(), t3.size(), sep = ', ')
# torch.Size([2]), torch.Size([2, 3]), torch.Size([2, 2, 2])

t1向量torch.Size([2])的理解:向量的形状是1行2列。

t2矩阵torch.Size([2, 3])的理解:包含两个一维向量,每个一维向量的形状是1行3列。

t3矩阵torch.Size([2, 2, 2])的理解:包含两个二维矩阵,每个二维矩阵的形状是2行2列。

1.3 numel()查看张量中的元素个数

print(t1.numel(), t2.numel(), t3.numel(), sep = ', ')
# 2, 6, 8
# t1向量中共有2个元素
# t2矩阵中共有6个元素
# t3张量中共有8个元素

1.4 形状相同的数组可创建一个高维张量

import numpy as np
a1 = np.array([[1, 2], [3, 4]])
a2 = np.array([[5, 6], [7, 8]])
t3 = torch.tensor([a1, a2])
print(t3)
# tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

2 张量的形变

2.1 flatten()将任意维度张量转为一维张量

t2.flatten()
# tensor([1, 2, 3, 4, 5, 6])t3.flatten()
# tensor([1, 2, 3, 4, 5, 6, 7, 8])

2.2 reshape()任意变形

形变维度的乘积需要等于张量元素的个数。

# 将`t3`变成2×4的矩阵
t3.reshape(2, 4)
#tensor([[1, 2, 3, 4],[5, 6, 7, 8]])# 将`t3`变成1×4×2的矩阵
t3.reshape(1, 4, 2)
# tensor([[[1, 2], [3, 4], [5, 6], [7, 8]]])

2.3 squeeze()&unsqueeze()

  • squeeze()的作用是压缩张量,去掉维数为1位置的维度
# 将t3的维度变为2×1×4
t_214 = t3.reshape(2, 1, 4)
print(t_214)
# tensor([[[1, 2, 3, 4]], [[5, 6, 7, 8]]])# 使用squeeze()将其变成2×4,去掉维度为1位置的维度
t_24 = t_214.squeeze(1)
print(t_24)
# tensor([[1, 2, 3, 4], [5, 6, 7, 8]])
  • unsqueeze()的作用是解压张量,给指定位置加上维数为一的维度。
# 将2×4的维度再转换成2×1×4,在第二个维度上加一维
# 索引是从0开始的。参数0代表第一维,参数1代表第二维,以此类推
print(t_24.unsqueeze(1))
tensor([[[1, 2, 3, 4]], [[5, 6, 7, 8]]])

2.4 维度变化总结

一般我们最常使用的就是flatten()reshape()。仔细思考的同学们肯定也可以发现,reshape()也可以实现flatten()的功能,reshape()所需的参数就是张量中的元素数。

print(t3.flatten())
# tensor([1, 2, 3, 4, 5, 6, 7, 8])print(t3.reshape(t3.numel()))
# tensor([1, 2, 3, 4, 5, 6, 7, 8])

3 特殊的零维张量

Tensor的零维张量只包含一个元素,可以理解为标量,只有大小,没有方向。

3.1 零维张量的属性

# 零维张量的创建只有一个数,不具备一维或多维的概念
t0 = torch.tensor(1)# 因为它是标量,所以维度是0
print(t0.ndim)
# 0# 因为它是标量,所以也不具有形状
print(t0.shape)
# torch.Size([])# 它没有维度,但是有一个数
print(t0.numel())
# 1

3.2 零维张量的转化

使用flatten()reshape()可以将标量转为向量。

t0 = torch.tensor(1)
print(t0.flatten())
# tensor([1])t0 = torch.tensor(1)
print(t0.reshape(1))
# tensor([1])

4 再谈什么是张量

在这里插入图片描述
Tensor是一个多维数组,它是标量、向量、矩阵的高维拓展。

Pytorch张量操作大全:

Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结

有关Pytorch建模相关的AI干货请扫码关注公众号「AI有温度」阅读获取
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探索Python的进度条神器:tqdm
  • 51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计
  • springcloud rocketmq 新增的消费者组从哪里开始消费
  • 【开发学习笔记】什么是Springboot?
  • 【AI大模型】Prompt 提示词工程使用详解
  • SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置
  • docker 构建 mongodb
  • 阿里服务器购买与java环境搭建 实践
  • kafka高性能的底层原理分析
  • 若依ruoyi+AI项目二次开发(智能售货机运营管理系统)
  • 0719_驱动1 arm裸机开发与linux驱动开发区别
  • centos7安装redis数据库步骤
  • 数据库编程中游标 连接 commit 字符集
  • 键盘是如何使用中断机制的?当打印一串字符到显示屏上时发生了什么???
  • 【科大讯飞笔试题汇总】2024-07-27-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/Python)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 08.Android之View事件问题
  • angular学习第一篇-----环境搭建
  • canvas 高仿 Apple Watch 表盘
  • JavaScript 一些 DOM 的知识点
  • js 实现textarea输入字数提示
  • JS字符串转数字方法总结
  • Just for fun——迅速写完快速排序
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Unix命令
  • ViewService——一种保证客户端与服务端同步的方法
  • 安装python包到指定虚拟环境
  • 欢迎参加第二届中国游戏开发者大会
  • 通过git安装npm私有模块
  • 微服务核心架构梳理
  • 微信小程序:实现悬浮返回和分享按钮
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我的zsh配置, 2019最新方案
  • 一个完整Java Web项目背后的密码
  • 一个项目push到多个远程Git仓库
  • 仓管云——企业云erp功能有哪些?
  • # 达梦数据库知识点
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #职场发展#其他
  • (C语言)字符分类函数
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日一问)基础知识:堆与栈的区别
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)EOS中账户、钱包和密钥的关系
  • *Django中的Ajax 纯js的书写样式1
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 使用 XPath 来读写 XML 文件
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .Net实现SCrypt Hash加密
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析