由浅入深,带你搞懂 Pytorch 中的张量 tensor 是什么

目录

  • 1、tensor 是什么?
  • 2、tensor 的三个属性
    • 2.1 Rank 秩
    • 2.2 Axis(复数 为 Axes) 轴
    • 2.3 Shape 形状
  • 3、Pytorch 中 torch.Tensor 的三个属性
    • 3.1 torch.dtype
    • 3.2 torch.device
    • 3.3 torch.layout
  • 4、创建张量的两种方法
    • 4.1 从现有数据创建张量
    • 4.2 凭空创建张量
  • 5、改变张量
    • 5.1 改变 dtype 和 device
    • 5.1 改变 shape

1、tensor 是什么?

tensor 即张量,是一种数据结构,被广泛用于神经网络模型(编程)中,用来表示或者编码神经网络模型的输入、输出和模型参数等等。

  • number(数字), array(数组), 2d-array(二维数组)
  • scalar(标量), vector(向量), matrix(矩阵)

相信大家对上面两行名词都不会陌生,第一行的名词来源于计算机科学,第二行的名词则来源于数学,它们实际上是相同的概念:

获取一个元素所需要的索引数计算机科学数学
0数字标量
1数组向量
2二维数组矩阵

所谓的获取一个元素所需要的索引数,我们如果有 t = [1, 2, 3, 4],想得到 3 的话就得写 t[2],如果有 t = [[1,2,3], [4,5,6], [7,8,9]],想取出 3 就得写 t[0][2]

当所需要的索引数 n 大于 2 时,计算机科学和数学就会分别表示为 ndarray(n 维数组)和 nd-tensor(n 维张量):

获取一个元素所需要的索引数计算机科学数学
nn 维数组n 维张量

因此,我们所说的张量其实就是 n 维数组。

2、tensor 的三个属性

2.1 Rank 秩

秩就是张量中存在的维度的数目,或者说从张量中获取一个元素所需要的索引数,例如矩阵、二维数组、二维张量,它们的秩都是 2

2.2 Axis(复数 为 Axes) 轴

轴就是张量中某一个特定的维度,一个秩等于 1 的张量有一个轴(Axis),一个秩等于 2 的张量有两个轴(Axes)等等。
每个轴的长度很重要,因为它可以告诉我们沿每个轴有多少索引可用,例如已知张量 t 的第一个轴长度为 3,我们就只能索引到 t[0] t[1] t[2] ,大于 2 就越界了。

2.3 Shape 形状

张量的秩告诉我们张量有多少个轴,张量的每个轴的长度告诉我们该轴有多少索引可用。于是,将它们结合起来,就是张量的形状,在 Pytorch 中使用
.shapesize() 方法即可得到一个张量的形状。

在这里插入图片描述

3、Pytorch 中 torch.Tensor 的三个属性

此节更详细的内容可以参考官方文档

3.1 torch.dtype

dtype 表示张量的数据类型,张量之间的张量运算必须发生在具有相同数据类型的张量之间,使用 .dtype 可知一个张量的数据类型:

在这里插入图片描述

张量之间的张量运算必须发生在具有相同数据类型的张量之间

3.2 torch.device

device 表示张量被分配到的设备(CPU 或者 GPU,又或者是哪一个 GPU),张量之间的张量运算必须发生在同一设备上存在的张量之间,使用 .device 可知一个张量被分配到的设备:

在这里插入图片描述

3.3 torch.layout

layout 表示张量在内存中的存储方式,也就是布局。分为 torch.strided(密集张量)和 torch.sparse_coo(稀疏 COO 张量)两种。常用的是 torch.strided,使用 stride() 方法即可获得张量的内存布局:

在这里插入图片描述
a 是两行三列的矩阵(二维张量),其布局为(3,1)表示在第一个维度(行)上,走 3 格可以得到下一个元素(下一行的元素),在第二个维度(列)上,走 1 格可以得到下一个元素(下一列的元素),以此类推。

4、创建张量的两种方法

4.1 从现有数据创建张量

从数据 data 创建张量有以下四种方法:

  • torch.Tensor(data)
  • torch.tensor(data)
  • torch.as_tensor(data)
  • torch.from_numpy(data)

data 可以是列表、元组、NumPy 数组、标量和其他类型。torch.Tensor() 和
torch.tensor() 的区别看这篇博客,torch.as_tensor() 和 torch.from_numpy() 的区别看这篇博客。

简单总结一下就是:

  • torch.Tensor() 是类 torch.Tensor 的构造函数,由于类 torch.Tensor 是类torch.FloatTensor 的别名,所以 torch.Tensor() = torch.FloatTensor(),因此 torch.Tensor() 的 dtype 一定是 32 位浮点数,无法指定;而 torch.tensor() 是所谓的工厂函数,它就可以指定 dtype、device 等属性
  • torch.Tensor() 和 torch.tensor() 会复制输入数据(深拷贝),而torch.as_tensor() 和 torch.from_numpy() 会与输入对象共享内存(浅拷贝
  • torch.from_numpy() 只接受 Numpy 数组,而 torch.as_tensor() 接受各种类似数组的对象,包括其他 PyTorch 张量
  • 因此首选 torch.tensor(),需要提高性能时再使用 torch.as_tensor()

4.2 凭空创建张量

凭空创建张量常用的有以下四种方法:

  • torch.eye() 单位矩阵(一定是矩阵,无法指定维度)
  • torch.ones() 全 1 张量
  • torch.zeros() 全 0 张量
  • torch.rand() 随机张量
    在这里插入图片描述

5、改变张量

5.1 改变 dtype 和 device

使用 .to() 方法即可,直接指定 dtype 和 device,如下:

在这里插入图片描述

5.1 改变 shape

方法比较多,看我的这篇博客即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯-排序-填空题

一:题目 二:上码 #include <iostream> using namespace std; int main() {// 请在此输入您的代码/**/**冒泡排序中:我们考虑到最坏的情况,那就是全都是逆序 那么就需要交换 N(N-1)/2; 那么100次 最起码需要 15个字符&#xff0c;而15个字符完全逆序的话 需要交换 105次…

打造钉钉事件分发平台之钉钉审批等事件处理

前言上讲和上上讲我们说到了钉钉的审批和钉钉通讯录的一个简单示例&#xff0c;这次我们讲下如何快速打造一个自己的钉钉事件分发平台。让你能够通过监听用户在钉钉上的操作&#xff0c;然后进行对应的业务处理&#xff0c;比如钉钉流程审批完后业务处理、通讯录员工增加后对应…

Pytorch 中 Dataset 和 DataLoader,以及 torchvision 的 datasets 完全理解

目录1、torch.utils.data.Dataset()2、torch.utils.data.Sampler()3、torch.utils.data.DataLoader()4、torchvision.datasets.ImageFolder()5、例子 torchvision.datasets.FashionMNIST()1、torch.utils.data.Dataset() 首先最基础的&#xff0c;是 torch.utils.data.Dataset…

蓝桥杯-成绩分析-编程题

一:题目 二&#xff1a;上码 #include<bits/stdc.h> using namespace std;int main() {int n;cin >> n;vector<int> v(n,0);for (int i 0; i < n; i) {cin >> v[i];}sort(v.begin(),v.end());double sum accumulate(v.begin(),v.end(),0);double…

BeetleX框架详解-小结

到这里BeetleX组件代码讲解完成了&#xff0c;由于组件只封装了TCP基础通讯的功能&#xff0c;因此在内容上并不会有太多&#xff1b;通以上内容相信对BeetleX的设计有一定的了解&#xff0c;在使用上也更加容易。要点Socket对象应用SocketAsyncEventArgs对象应用线程池的应用与…

深度学习入门笔记 —— 循环神经网络 RNN

首先&#xff0c;明确 RNN 的主要任务是用于文本分类&#xff0c;而解决文本分类任务最经典的模型是词袋模型&#xff08;Bag-of-Words Model&#xff09;&#xff0c;如图所示&#xff0c;输入是三个句子&#xff0c;词袋模型首先要定义一个词汇表 vocabulary&#xff0c;里面…

深圳店匠笔试题-4.01

一:题目类型 10个选择10个填空2道编程题 二&#xff1a;编程题 1&#xff1a;34 在排序数组中查找元素的第一个和最后一个位置 class Solution { public:/**思路:1.分为两种情况 那就是该元素是存在于排序数组当中,该元素不存在该排序数组当中。2.如果元素是存在于排序数组当…

进击吧! Blazor !第二期 回顾

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

蓝桥杯-长草-代码(BFS)

一:题目 题目描述 小明有一块空地&#xff0c;他将这块空地划分为 nn 行 mm 列的小块&#xff0c;每行和每列的长度都为 1。 小明选了其中的一些小块空地&#xff0c;种上了草&#xff0c;其他小块仍然保持是空地。 这些草长得很快&#xff0c;每个月&#xff0c;草都会向外…

Pytorch 中 LSTM 和 LSTMCell 的区别

LSTM 的官方文档在这里 在例子中&#xff1a; LSTM 函数的参数为输入特征向量的长度 input_size 10、隐藏层向量的长度 hidden_size 20、隐藏层的数量 num_layers 2&#xff1b; 输入 input 的维度是时间/序列长度&#xff08;句子有多少个单词&#xff09; time_steps 5、…

程序员修神之路--缓存架构不够好,系统容易瘫痪

“灵魂拷问缓存能大幅度提高系统性能&#xff0c;也能大幅度提高系统瘫痪几率怎么样防止缓存系统被穿透&#xff1f;缓存的雪崩是不是可以完全避免&#xff1f;前几篇文章我们介绍了缓存的优势以及数据一致性的问题&#xff0c;在一个面临高并发系统中&#xff0c;缓存几乎成了…

Magicodes.IE之花式导出

总体设计Magicodes.IE是一个导入导出通用库&#xff0c;支持Dto导入导出以及动态导出&#xff0c;支持Excel、Word、Pdf、Csv和Html。在本篇教程&#xff0c;笔者将讲述如何使用Magicodes.IE进行花式导出。在本篇教程&#xff0c;笔者主要讲述如何使用IE进行花式导出并满足客户…

京东笔试4.2-19:00随笔

30道选择考察到了数据结构&#xff0c;计网&#xff0c;linux,数据库&#xff0c;java基础&#xff0c;就记得这些了 两道编程题 一道二叉树 一道 动态规划 一道也没AC出来 第一道需要会做的前提是 需要创建二叉树 并给其赋值 然后再谈算法 因为一直刷leetcode&#xff0c;转换…

我又踩坑了!如何为HttpClient请求设置Content-Type标头?

最近在重构认证代码&#xff0c;认证过程相当常规&#xff1a;POST /open-api/v1/user-info?client_id&timstamp&rd12345&sign***&methodhmac content-type: application/json payload: { "token":"AA2917B0-C23D-40AB-A43A-4C4B61CC7C74&qu…

利用数组创建二叉树并赋值

1:二叉树的创建与赋值 (1):前言知识 这里的创建是利用层序序列进行创建,主要就是根节点的坐标为i 的话 那么左节点的坐标为 2i1,右节点的坐标为2i2;开辟一个结构体 struct Node {int val;Node * left;Node * right;Node () : val(-1),left(NULL),right(NULL) {};Node(int x)…

2020 中国开源年会(COSCon'20)再启程:开源向善(Open Source for Good)

中国开源年会COSCon2020正式启动&#xff01;*本图由开源社设计组叶凯设计时间&#xff1a;2020年10月24-25日线上直播地址&#xff1a;bilibili & Youtube讲师互动平台&#xff1a;Zoom时间弹指飞逝&#xff0c;转眼即过去了一年。不知道各位在这多舛的半年间又和开源这二…

使用Azure Functions玩转Serverless

Serverless&Azure Functions通过无服务器计算&#xff0c;开发者无需管理基础结构&#xff0c;从而可以更快构建应用程序。通过无服务器应用程序&#xff0c;将由云服务提供商自动预配、缩放和管理运行代码所需的基础结构。要理解无服务器计算的定义&#xff0c;注意到服务…

java并发之初识

一:并发编程的难点 1:原子性问题 操作系统做任务切换,可以发生在任何一条CPU指令执行完成后&#xff1b;CPU能保证的原子操作是指令级别的&#xff0c;而不是高级语言的操作符&#xff1b; n不是原子操作的&#xff0c;而是3条指令 2:可见性问题 可见性是指一个线程对一个…

java并发之synchronized实现原理及其优化

1:synchronnized概述 synchronized修饰的方法或代码块相当于并发中的临界区&#xff0c;即在同一时刻jvm只允许一个线程进入执行。synchronized是通过锁机制实现同一时刻只允许一个线程来访问共享资源的。另外synchronized锁机制还可以保证线程并发运行的原子性&#xff0c;有…

.NET 是信息技术应用创新产业重要参与者

今天是国庆节&#xff0c;也是中秋节&#xff0c;月满中秋&#xff0c;举国欢庆&#xff0c;在这里祝各位开发者中秋国庆快乐。放假在家就想把这几年对于.NET发展相关生态做个梳理&#xff0c;写一篇文章来总结一下这两年从腾讯出来自己创业&#xff0c;推动.NET在国内的应用的…