PyTorch 入门指南 2:Tensor 的深度解析(操作篇)
🚀PyTorch 入门指南 2:Tensor 的深度解析(操作篇)
💡一、Tensor 的类型
在 PyTorch 中,Tensor 拥有多种数据类型,满足不同计算需求。以下是常见类型及对应表示:
数据类型描述 | PyTorch 类型表示(方式一) | PyTorch 类型表示(方式二) | 旧版 Tensor 类型表示 |
---|---|---|---|
32 位浮点数 | torch.float32 | torch.float | torch.*.FloatTensor |
64 位浮点数 | torch.float64 | torch.double | torch.*.DoubleTensor |
16 位浮点数 | torch.float16 | torch.half | torch.*.HalfTensor |
8 位无符号整数 | torch.uint8 | — | torch.*.ByteTensor |
8 位有符号整数 | torch.int8 | — | torch.*.CharTensor |
16 位有符号整数 | torch.int16 | torch.short | torch.*.ShortTensor |
32 位有符号整数 | torch.int32 | torch.int | torch.*.IntTensor |
64 位有符号整数 | torch.int64 | torch.long | torch.*.LongTensor |
布尔类型 | torch.bool | — | torch.*.BoolTensor |
不同类型在存储和精度上有差异,需根据任务(如模型精度、内存占用)选择。例如,图像数据常用 torch.float32
,内存敏感场景可用 torch.float16
。
🛒二、Tensor 的创建
PyTorch 提供丰富函数创建 Tensor,以下是常用函数、功能说明及代码示例:
📝2.1 基础构造函数与数据转换
Tensor(*size)
:按指定维度创建未初始化的 Tensor(值随机,不建议直接用其值)Tensor(data)
:类似np.array
,根据输入数据(如列表)创建 Tensor
1 | import torch |
✨2.2 特殊值 Tensor
ones(*size)
:创建全 1 的 Tensorzeros(*size)
:创建全 0 的 Tensoreye(*size)
:创建对角线为 1、其余为 0 的 Tensor(适用于方阵)
1 | # ones 示例 |
📈2.3 序列与分布 Tensor
arange(s, e, step)
:创建从s
到e
(不包含e
)、步长为step
的 1 维 Tensorlinspace(s, e, steps)
:创建从s
到e
、均匀切分成steps
份的 1 维 Tensorrand(*size)
:创建服从均匀分布的 Tensorrandn(*size)
:创建服从标准正态分布的 Tensor
1 | # arange 示例 |
🎲2.4 特定分布 Tensor
normal(mean, std)
:创建指定均值和标准差的正态分布 Tensoruniform_(from, to)
:对已有 Tensor 填充区间均匀分布的值randperm(m)
:创建 0 到m-1
的随机排列 1 维 Tensor
1 | # normal 示例 |
📜三、Tensor 的属性
每个 Tensor 包含三种核心属性:torch.dtype
(数据类型)、torch.device
(存储设备)、torch.layout
(内存布局)。
📍3.1 torch.dtype
:数据类型
表示 Tensor 存储的数据类型,创建时可显式指定,也可通过已有 Tensor 查看。
1 | import torch |
💾3.2 torch.device
:存储设备
标识 Tensor 存储在 'cpu'
或 'cuda'
(需 GPU 可用)。可创建时指定,或通过 to()
方法移动。
1 | import torch |
📦3.3 torch.layout
:内存布局
- 密集布局(
torch.strided
):普通 Tensor 的默认布局,连续存储元素。 - 稀疏布局(如
torch.sparse_coo
):用于稀疏张量,存储非零元素的坐标和值。
1 | import torch |
🗄️四、Tensor 的属性——稀疏的张量
对于大部分元素为零的矩阵,PyTorch 用稀疏张量优化存储和计算,仅存储非零元素的坐标和值,减少内存占用,提升计算效率。
🔍4.1 稀疏张量的原理
稀疏张量通过记录非零元素的索引(坐标)和对应值,省略零元素存储。例如一个 100×100 的矩阵若只有 10 个非零元素,稀疏张量只需存储这 10 个元素的位置和值,而非 10000 个元素。
🧰4.2 稀疏张量的创建
使用 torch.sparse_coo_tensor
,需传入非零元素索引 indices
、值 values
和形状 shape
。
1 | import torch |
🌐4.3 稀疏张量的应用场景
- 自然语言处理(NLP):词袋模型中,文档 - 词项矩阵稀疏,用稀疏张量存储可节省内存。
- 推荐系统:用户 - 物品评分矩阵稀疏,稀疏张量优化存储和协同过滤计算。
- 图神经网络:邻接矩阵常稀疏,稀疏张量提升图数据处理效率。
🔄4.4 稀疏张量与密集张量的转换
1 | import torch |
🎯五、总结
通过以上内容,全面学习了 Tensor 的类型、创建方法、核心属性以及稀疏张量的相关知识。实际应用中,可根据任务需求灵活选择 Tensor 的类型、创建方式和存储设备,对稀疏数据合理使用稀疏张量优化流程。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Coisini!
评论