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

介绍PyTorch张量

介绍PyTorch张量

介绍PyTorch张量

PyTorch张量是我们在PyTorch中编程神经网络时将使用的数据结构。

在编程神经网络时,数据预处理通常是整个过程的第一步,数据预处理的一个目标是将原始输入数据转换为张量形式。

torch.Tensor​类的实例

PyTorch张量是torch.Tensor​ Python类的实例。我们可以使用类构造函数创建一个torch.Tensor​对象,如下所示:

> t = torch.Tensor()
> type(t)
torch.Tensor

这创建了一个空张量(没有数据的张量),但我们很快就会添加数据。

张量属性

首先,让我们看看一些张量属性。每个torch.Tensor​都有这些属性:

  • torch.dtype
  • torch.device
  • torch.layout

查看我们的张量t​,我们可以看到以下默认属性值:

> print(t.dtype)
> print(t.device)
> print(t.layout)
torch.float32
cpu
torch.strided
张量具有torch.dtype

dtype​,在我们的例子中是torch.float32​,指定了张量中包含的数据类型。张量包含统一(相同类型)的数值数据,类型如下:

数据类型dtypeCPU张量GPU张量
32位浮点数torch.float32torch.FloatTensortorch.cuda.FloatTensor
64位浮点数torch.float64torch.DoubleTensortorch.cuda.DoubleTensor
16位浮点数torch.float16torch.HalfTensortorch.cuda.HalfTensor
8位整数(无符号)torch.uint8torch.ByteTensortorch.cuda.ByteTensor
8位整数(有符号)torch.int8torch.CharTensortorch.cuda.CharTensor
16位整数(有符号)torch.int16torch.ShortTensortorch.cuda.ShortTensor
32位整数(有符号)torch.int32torch.IntTensortorch.cuda.IntTensor
64位整数(有符号)torch.int64torch.LongTensortorch.cuda.LongTensor

注意每种类型都有CPU和GPU版本。关于张量数据类型的一点需要注意,张量之间的张量操作必须在具有相同数据类型的张量之间进行。然而,这个声明只适用于PyTorch版本低于1.3​。有关详细信息,请参阅下面的_PyTorch张量类型提升_部分。

PyTorch张量类型提升

从PyTorch版本1.3​开始,算术和比较操作可以执行混合类型操作,这些操作提升为共同的dtype​。

下面的例子在版本1.2​中是不允许的。然而,在版本1.3​及以上,相同的代码返回一个dtype=torch.float32​的张量。

torch.tensor([1], dtype=torch.int) +
torch.tensor([1], dtype=torch.float32)

有关更多详细信息,请参阅完整文档。

  • torch.result_type​ 提供函数以确定混合类型操作的结果
  • torch.can_cast​ 公开类型提升的转换规则
  • torch.promote_types​ 公开提升逻辑
张量具有torch.device

设备,在我们的例子中是cpu​,指定了张量数据分配的设备(CPU或GPU)。这决定了给定张量的张量计算将在哪里执行。

PyTorch支持使用多个设备,它们使用索引指定:

> device = torch.device('cuda:0')
> device
device(type='cuda', index=0)

如果我们有这样的设备,我们可以通过将设备传递给张量的构造函数来在设备上创建张量。关于使用多个设备的一点需要注意,张量之间的张量操作必须在存在于同一设备上的张量之间进行。

使用多个设备通常是我们在成为更高级用户时会做的事情,所以现在不必担心。

张量具有torch.layout

布局,在我们的例子中是strided​,指定了张量如何在内存中存储。要了解更多关于步幅的信息,请点击这里。

目前,这就是我们需要知道的全部。

从张量属性中提取的信息

作为神经网络程序员,我们需要意识到以下几点:

  1. 张量包含统一类型的数据(dtype​)。
  2. 张量之间的张量计算取决于dtype​和device​。

现在,让我们看看在PyTorch中使用数据创建张量的常见方法。

使用数据创建张量

这些是在PyTorch中使用数据(类似数组)创建张量对象(torch.Tensor​类的实例)的主要方法:

  1. torch.Tensor(data)
  2. torch.tensor(data)
  3. torch.as_tensor(data)
  4. torch.from_numpy(data)

让我们看看这些选项。它们都接受某种形式的数据,并给我们一个torch.Tensor​类的实例。有时,当有多种方法可以实现相同的结果时,事情可能会变得混乱,所以让我们来分解一下。

我们将首先使用每个选项创建一个张量,看看我们得到了什么。我们将首先创建一些数据。

我们可以使用Python列表或序列,但numpy.ndarray​将是更常见的选项,所以我们将使用一个numpy.ndarray​,如下所示:

> data = np.array([1,2,3])
> type(data)
numpy.ndarray

这给我们提供了一个类型为numpy.ndarray​的简单数据。

现在,让我们使用这些选项1-4创建我们的张量,并看看我们得到了什么:

> o1 = torch.Tensor(data)
> o2 = torch.tensor(data)
> o3 = torch.as_tensor(data)
> o4 = torch.from_numpy(data)> print(o1)
> print(o2)
> print(o3)
> print(o4)
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)
tensor([1, 2, 3], dtype=torch.int32)

所有选项(o1​,o2​,o3​,o4​)似乎都产生了相同的张量,除了第一个。第一个选项(o1​)在数字后面有点,表示这些数字是float​,而接下来的三个选项类型为int32​。

// Python代码示例,说明我们的意思> type(2.)
float> type(2)
int

在下一篇文章中,我们将更深入地探讨这种差异以及其他一些重要的差异,这些差异隐藏在幕后。

下一篇文章的讨论将使我们能够看到这些选项中哪一个最适合创建张量。目前,让我们看看一些无需任何数据即可创建张量的创建选项。

无需数据的创建选项

以下是一些其他可用的创建选项。

我们有torch.eye()​函数,它返回一个2-D张量,对角线上是1,其他地方是0。eye()​这个名字与单位矩阵的概念有关,单位矩阵是一个方阵,主对角线上是1,其他地方都是0。

> print(torch.eye(2))
tensor([[1., 0.],[0., 1.]
])

我们有torch.zeros()​函数,它创建一个指定形状参数的零张量。

> print(torch.zeros([2,2]))
tensor([[0., 0.],[0., 0.]
])

同样,我们有torch.ones()​函数,它创建一个1的张量。

> print(torch.ones([2,2]))
tensor([[1., 1.],[1., 1.]
])

我们还有torch.rand()​函数,它创建一个指定参数形状的张量,其值是随机的。

> print(torch.rand([2,2]))
tensor([[0.0465, 0.4557],[0.6596, 0.0941]
])

这是不需要数据的可用创建函数的一小部分。查看PyTorch文档以获取完整列表。

我希望现在你对如何使用PyTorch从数据以及不需要数据的内置函数创建张量有了很好的理解。如果我们使用numpy.ndarray​,这个任务将变得轻而易举,所以如果你已经熟悉NumPy,那么恭喜你。

http://www.lryc.cn/news/520583.html

相关文章:

  • Vision Transformer (ViT)原理
  • 移动云自研云原生数据库入围国采!
  • Unity中对象池的使用(用一个简单粗暴的例子)
  • linux命令行连接Postgresql常用命令
  • 每日一题-单链表排序
  • webpack04服务器配置
  • JDK下载安装配置
  • 30_Redis哨兵模式
  • NLP三大特征抽取器:CNN、RNN与Transformer全面解析
  • 《使用 YOLOV8 和 KerasCV 进行高效目标检测》
  • 从MySQL迁移到PostgreSQL的完整指南
  • 服务器一次性部署One API + ChatGPT-Next-Web
  • 51单片机 和 STM32 的烧录方式和通信协议的区别
  • (STM32笔记)十二、DMA的基础知识与用法 第二部分
  • 【优选算法篇】:模拟算法的力量--解决复杂问题的新视角
  • 探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码
  • 脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)
  • ESP嵌入式开发环境安装
  • Elasticsearch入门学习
  • 黑马linux笔记(03)在Linux上部署各类软件 MySQL5.7/8.0 Tomcat(JDK) Nginx RabbitMQ
  • 《软硬协同优化,解锁鸿蒙系统AI应用性能新高度》
  • 利用 Tree Shaking 提升 React.js 性能
  • RPC实现原理,怎么跟调用本地一样
  • Vue进阶之AI智能助手项目(二)——ChatGPT的调用和开发
  • python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像
  • 2025-微服务—SpringCloud-1~3
  • UnityXR Interaction Toolkit 如何检测HandGestures
  • 使用 Multer 上传图片到阿里云 OSS
  • 2008-2020年各省社会消费品零售总额数据
  • 【大模型入门指南 07】量化技术浅析