PyTorch使用教程(3)-Tensor包

在这里插入图片描述

1、张量Tensor

张量(Tensor)是PyTorch深度学习框架中的核心数据结构,在PyTorch软件框架中,几乎所有的数据计算和信息流都是以Tensor的形式在表达。官方给出的定义是:

一个 torch.Tensor是一个包含单个数据类型元素的多维矩阵
关键词

  • 单个数据类型:在一个张量数据结构内,只会包含一种数据类型。
  • 多维矩阵:简单来说张量就是为了高维矩阵而创建的,常用的NCHW格式矩阵,就是4维矩阵。

学习Tensor这个包的时候,主要是关注张量的数据类型、张量的一些基本操作。

2、数据类型

为了支持各种精度的训练、推理,Tensor支持的数据类型繁多。这里,仅列出在做计算机视觉相关的常用数据类型。

数据类型dtype
32 位浮点数torch.float32 或 torch.float
64 位浮点数torch.float64 或 torch.double
16 位浮点数1torch.float16 或 torch.half
16 位浮点数 2torch.bfloat16
8 位整数(无符号)torch.uint8
32 位整数(无符号)torch.uint32
8 位整数(带符号)torch.int8
32 位整数(带符号)torch.int32 或 torch.int
布尔值torch.bool
量化 8 位整数(无符号)torch.quint8
量化 8 位整数(带符号)ttorch.qint8
量化 32 位整数(带符号)torch.qint32
量化 4 位整数(无符号)torch.quint4x2

要构造张量,建议使用工厂函数,例如 torch.empty(),其中使用 dtype 参数。 torch.Tensor 构造函数是默认张量类型 (torch.FloatTensor) 的别名。也就是说,在构造张量时,不传入数据类型参数,默认就是32位浮点数

3、初始化(构造张量)

可以使用 torch.tensor() 构造函数从 Python list 或序列构造张量。

>>> torch.tensor([[1., -1.], [1., -1.]])
tensor([[ 1.0000, -1.0000],
        [ 1.0000, -1.0000]])
>>> torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))
tensor([[ 1,  2,  3],
        [ 4,  5,  6]])

有几个注意点:

  • torch.tensor() 始终复制 data。也就是说使用list或者序列构造张量时,均为以深拷贝的方式创建。
  • 可以通过将 torch.dtype 和/或 torch.device 传递给构造函数或张量创建操作来构造特定数据类型的张量。例如:
>>> torch.zeros([2, 4], dtype=torch.int32)
tensor([[ 0,  0,  0,  0],
        [ 0,  0,  0,  0]], dtype=torch.int32)
>>> cuda0 = torch.device('cuda:0')
>>> torch.ones([2, 4], dtype=torch.float64, device=cuda0)
tensor([[ 1.0000,  1.0000,  1.0000,  1.0000],
        [ 1.0000,  1.0000,  1.0000,  1.0000]], dtype=torch.float64, device='cuda:0')

更多的张量构造方式可以参考我的上一篇博文《PyTorch使用教程(2)-torch包》

4、常用操作

张量支持索引、切片、连接、修改等操作,也支持大量的数学计算操作。常见的操作可以参考我的上一篇博文《PyTorch使用教程(2)-torch包》。这里,仅讲述张量操作需注意的几个点。

  1. 仅对一个单个值的张量的使用进行说明:
    使用 torch.Tensor.item() 从包含单个值的张量中获取 Python 数字。
>>> x = torch.tensor([[1]])
>>> x
tensor([[ 1]])
>>> x.item()
1
>>> x = torch.tensor(2.5)
>>> x
tensor(2.5000)
>>> x.item()
2.5
  1. 操作张量的方法如果用下划线后缀标记,则表示该操作时inplace操作:操作后的张量和输入张量共享一个Storage。使用inplace操作,可以减小GPU缓存的使用。如torch.FloatTensor.abs_() 在原地计算绝对值并返回修改后的张量,而 torch.FloatTensor.abs() 在新张量中计算结果。
>>> x = torch.tensor([[1., -1.], [1., -1.]])
>>> x2=x.abs_()
>>> x.storage
<bound method Tensor.storage of tensor([[1., 1.],
        [1., 1.]])>
>>> x2.storage
<bound method Tensor.storage of tensor([[1., 1.],
        [1., 1.]])>

5、常用属性

5.1 存储(storage)

每个张量都与一个关联的 torch.Storage,它保存其数据,可以理解为数据缓地址。

>>> t = torch.rand((2,2))
>>> t.storage 
<bound method Tensor.storage of tensor([[0.3267, 0.8759],
        [0.9612, 0.1931]])>

5.2 形状(shape)

可以使用shape属性或者size()方法查看张量在每一维的长度。

>>> x = torch.randn((3,3))
>>> x.shape
torch.Size([3, 3])
>>> x.size()
torch.Size([3, 3])

可以通过torch的reshape方法或者张量本身的View()方法进行形状的改变。

>>> t = torch.rand((3, 3))
>>> t
tensor([[0.8397, 0.6708, 0.8727],
        [0.8286, 0.3910, 0.9540],
        [0.8672, 0.4297, 0.1825]])
>>> m=t.view(1,9) 
>>> m
tensor([[0.8397, 0.6708, 0.8727, 0.8286, 0.3910, 0.9540, 0.8672, 0.4297, 0.1825]])

5.3 数据类型(dtype)

张量的数据类型(如torch.float32, torch.int64等)。

>>> t = torch.rand((3, 3))
>>> t.dtype
torch.float32

5.4 设备(device)

张量所在的设备(如CPU或GPU)。

>>> m = torch.rand((3, 3))
>>> m.device
device(type='cpu')

如需要在CPU和GPU之间进行张量的移动,可以使用张量的to()方法。

  • 将张量移动到GPU(如果可用)。
>>> m=torch.rand((2,2))
>>> m.device
device(type='cpu')
>>> m.to('cuda')
tensor([[0.5340, 0.0079],
        [0.2983, 0.5315]], device='cuda:0')
  • 将张量移动至CPU
>>> m.to('cpu')
tensor([[0.5340, 0.0079],
        [0.2983, 0.5315]])

6、小结下

用一个表格,汇总下PyTorch中tensor(张量)的常用数据结构及其相关属性:

属性/方法描述示例代码
维度(Dimension)张量的维度,标量为0维,向量为1维,矩阵为2维,以此类推x = torch.tensor([[1, 2], [3, 4]]) (2维张量)
形状(Shape)张量在各维度上的大小,返回一个元组print(x.shape) 输出: torch.Size([2, 2])
大小(Size)张量中元素的总数,或各维度大小的元组(通过size()方法)print(x.size()) 输出: torch.Size([2, 2])print(x.numel()) 输出: 4
数据类型(Dtype)张量中元素的数据类型x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)print(x.dtype) 输出: torch.float32
设备(Device)张量所在的设备(CPU或GPU)x = x.to('cuda')(如果GPU可用);print(x.device) 输出: cuda:0(或类似的)
是否要求梯度(Requires Grad)一个布尔值,指示是否需要对该张量进行梯度计算x.requires_grad_(True)print(x.requires_grad) 输出: True
梯度(Grad)如果requires_grad=True,则存储该张量的梯度y = x.sum()y.backward()print(x.grad) 输出张量的梯度
数据(Data)张量中存储的实际数据x = torch.tensor([[1, 2], [3, 4]])print(x) 输出张量的数据
索引与切片使用整数、切片或布尔索引来访问或修改张量的元素x[0, 1] 访问第1行第2列的元素;x[:, 0] 访问第1列的所有元素
视图操作.view().reshape()改变张量的形状,但不改变其数据x_reshaped = x.view(4)x_reshaped = x.reshape(4) 将2x2张量变为1x4张量
数学运算支持加法、减法、乘法、除法、幂运算等y = x + 2z = x.pow(2)
统计函数如求和(.sum())、均值(.mean())、最大值(.max())等sum_val = x.sum()mean_val = x.mean()
类型转换转换为其他数据类型或设备上的张量x_float64 = x.to(dtype=torch.float64)x_cpu = x.to('cpu')
<think>首先,用户要求查询关于PyTorchTensor使用和特性。用户提供了多个引用,这些引用是关于PyTorch Tensor的概述、创建、属性、操作等。 系统级指令: - 使用$...$格式行内数学表达式。 - 独立公式用$$...$$。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 用户的问题:PyTorchTensor使用和特性。 从引用中提取关键信息: - 引用[1]: Tensor是核心数据结构,支持多维数组、自动求导、GPU加速。 - 引用[2]: Tensor类方便创建、操作、计算张量,隐藏底层细节。 - 引用[3]: 详细结构:概念、特点、数据类型、创建方式、属性、数据转换、常见操作。 - 引用[4]: 示例代码,展示形状操作如view()和resize()。 我需要结构化回答: 1. **介绍Tensor**:简要定义Tensor及其重要性。 2. **特性**:列出Tensor的主要特性,如多维数组、自动求导、GPU支持。 3. **使用方法**: - 创建Tensor- 操作Tensor(如形状操作、运算)。 - 数据类型和属性。 - 与NumPy的转换。 4. **示例**:参考引用[4],提供简单代码示例。 5. **引用标识**:在相关段落末尾添加引用标识。 6. **生成相关问题**:在最后添加相关问题部分。 步骤: - **开头介绍**:解释什么是PyTorch Tensor- **详细内容**: - 特性:多维数据、自动求导、GPU加速、高效计算。 - 创建方式:使用torch.tensor, torch.Tensor等。 - 常见操作:如view(), reshape(), transpose(), 元素运算。 - 属性:shape, dtype, device。 - 数据类型转换和设备切换。 - 与NumPy互操作。 - **添加引用**:基于引用内容,在适当位置添加[^1], [^2], [^3], [^4]。 - **示例代码**:保持简短,使用Python代码块。 - **结尾**:总结重要性。 - **相关问题**:生成至少三个相关问题,如优化、应用场景等。 确保数学表达式格式: - 如果有数学,使用$...$,例如在描述形状时,或是运算。 -PyTorch上下文中,可能没有太多数学,但如果有,如形状变换,可以用数学表示。 最终输出格式: - 回答主体。 - 相关问题部分,以"§§相关问题§§"开头。 现在,草拟回答结构: 1. **Tensor概述**:定义和重要性。引用[1]和[^2]。 2. **主要特性**: - 多维数组功能。 - 自动求导(关键于深度学习)。 - GPU加速计算。 - 灵活性:支持多种数据类型和设备。 3. **创建Tensor**: - 基本创建如torch.tensor(), torch.rand()- 创建线性和随机张量。 4. **Tensor操作**: - 形状操作:view(), reshape(), transpose(), permute()- 元素运算:加法、乘法等。 - 索引和切片。 5. **属性管理**: - 获取shape, dtype, device。 - 切换设备(CPU到GPU)。 - 数据类型转换。 6. **示例**:引用[4]的代码,简要说明。 7. **与NumPy交互**。 8. **总结**。 9. **相关问题**。 添加引用标识: - 在描述特性时加[^1]。 - 在创建部分加[^3]。 - 在操作部分加[^3]和[^4]。 - 在示例加[^4]。 生成相关问题: 1. 如何优化Tensor操作以提高性能? 2. Tensor深度学习模型中的应用? 3. Tensor和NumPy数组的优缺点比较? </think>### PyTorch Tensor使用和特性详解 PyTorch 中的 Tensor 是其核心数据结构,用于表示多维数组,支持高效计算、自动求导和 GPU 加速,是深度学习模型开发的基础。下面我将逐步介绍 Tensor 的主要特性、使用方法,并结合示例帮助您理解。内容基于站内引用,确保真实可靠。 #### 1. Tensor 概述 PyTorchTensor 是多维数组的封装,类似于 NumPy 的 ndarray,但增加了自动求导和 GPU 支持等高级功能。它允许用户在 Python 层面轻松创建、操作数据,同时隐藏底层实现细节,使开发者能专注于模型构建。Tensor 的核心概念括维度、数据类型和存储设备,这些特性使其在深度学习任务中不可或缺[^1][^2]。 #### 2. 主要特性 Tensor 的设计目标是为深度学习提供高效、灵活的计算基础。以下是其关键特性: - **多维数组功能**:Tensor 可以表示标量(0 维)、向量(1 维)、矩阵(2 维)或更高维数据,例如图像数据可存储为 $ \text{shape}~(C \times H \times W) $ 的 3D Tensor,其中 $ C $ 是通道数,$ H $ 和 $ W $ 是高度和宽度。这使得处理复杂数据(如卷积神经网络输入)变得简单[^1]。 - **自动求导(Autograd)**:Tensor 支持梯度计算,通过设置 `requires_grad=True`,PyTorch 会自动跟踪操作并构建计算图,便于反向传播优化模型参数。例如,在损失函数计算中,梯度可通过 `.backward()` 方法自动获取[^1][^2]。 - **GPU 加速**:Tensor 可以轻松迁移到 GPU 设备(如 NVIDIA CUDA),利用并行计算大幅提升训练速度。使用 `.to(&#39;cuda&#39;)` 方法即可将 Tensor 从 CPU 移动到 GPU,显著加速大规模矩阵运算[^1]。 - **灵活的数据类型**:支持多种数据类型,如整数 (`torch.int32`)、浮点数 (`torch.float32`),以及布尔型 (`torch.bool`)。数据类型可通过 `.dtype` 属性查询,并用 `.to()` 方法转换,例如 `tensor.to(torch.float64)`[^3]。 - **内存连续性优化**:Tensor 的存储是连续的,操作如 `view()` 或 `reshape()` 可高效改变形状而不复制数据(前提是内存连续)。这减少了资源开销,提升了性能[^3][^4]。 #### 3. Tensor 的创建 Tensor 的创建方式多样,常用方法括: - **基本创建**:使用 `torch.tensor()` 或 `torch.Tensor()` 从 Python 列表或 NumPy 数组初始化。例如,`tensor = torch.tensor([1, 2, 3])` 创建一个 1D Tensor。`torch.IntTensor()` 等函数指定特定数据类型[^3]。 - **创建特定张量**: - **随机张量**:`torch.rand(shape)` 生成均匀分布的随机数 Tensor,如 `rand_tensor = torch.rand(2, 3)`。 - **线性张量**:`torch.linspace(start, end, steps)` 创建等间隔序列,如 `lin_tensor = torch.linspace(0, 10, 5)` 生成 $[0, 2.5, 5, 7.5, 10]$。 - **特殊张量**:`torch.zeros()`, `torch.ones()`, 或 `torch.eye()` 创建零矩阵、单位矩阵等[^3]。 #### 4. Tensor 的常见操作 Tensor 支持丰富的操作,括形状调整、运算和索引: - **形状操作**:关键于数据预处理: - `view()` 或 `reshape()`:改变 Tensor 形状而不复制数据(如果内存连续)。例如,一个 $2 \times 3$ Tensor 可重塑为 $3 \times 2$,形状变换满足元素总数不变,即原始形状 $a \times b$ 和变换后 $c \times d$ 满足 $ a \times b = c \times d $。 - `transpose()` 或 `permute()`:交换维度,如将 $ \text{shape}~(N \times C \times H \times W) $ 转置为 $ \text{shape}~(N \times H \times W \times C) $。 - `squeeze()` 和 `unsqueeze()`:压缩或增加维度。例如,`unsqueeze(dim=0)` 在指定维度添加大小为 1 的维度[^3][^4]。 - **元素运算**:支持逐元素操作,括加法、乘法(阿达玛积)、矩阵乘法 (`torch.matmul()`)。例如,两个 Tensor $A$ 和 $B$ 的逐元素乘法为 $ A \odot B $。 - **索引和切片**:类似 NumPy,使用索引获取子集,如 `tensor[0, :]` 获取第一行所有元素[^3]。 - **数据类型和设备切换**:使用 `.to()` 方法,如 `tensor.to(&#39;cuda&#39;)` 移动到 GPU 或 `tensor.to(torch.float16)` 转换精度[^3]。 #### 5. 示例代码 以下代码演示了 Tensor 的创建和形状操作,基于引用[^4]。它展示了 `view()` 方法改变形状,并验证内存共享(原 Tensor 和重塑后的 Tensor 指向相同存储): ```python import torch # 创建一个 2x3 的随机 Tensor tensor = torch.rand(2, 3) print("原始形状:", tensor.shape) # 输出: torch.Size([2, 3]) # 使用 view() 改变形状为 3x2 new_tensor = tensor.view(3, 2) print("新形状:", new_tensor.shape) # 输出: torch.Size([3, 2]) # 检查内存地址,相同表示共享存储 print("原 Tensor 存储地址:", tensor.storage().data_ptr()) print("新 Tensor 存储地址:", new_tensor.storage().data_ptr()) # 地址相同 ``` #### 6. 与 NumPy 互操作 Tensor 可与 NumPy 数组无缝转换: - `torch.from_numpy(np_array)` 将 NumPy 数组转为 Tensor- `tensor.numpy()` 将 Tensor 转为 NumPy 数组。 这在数据加载和预处理中非常实用,允许结合 PyTorch 和传统科学计算库的优势[^3]。 #### 总结 PyTorch Tensor 提供了高效、灵活的数据处理能力,是深度学习开发和优化的核心。通过多维数组支持、自动求导和 GPU 加速,它简化了模型实现。掌握创建、操作和属性管理,能提升您在项目中的效率[^1][^2][^3]。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深图智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值