PyTorch中的Tensor基础操作详解
Tensor(张量)是PyTorch中最核心的数据结构,理解Tensor的基本操作是掌握PyTorch的关键。本文将系统介绍Tensor的创建、类型转换、命名张量等基础操作。
什么是Tensor?
Tensor可以简单理解为多维数组,它支持高效的科学计算。Tensor可以是:
- 0维:标量(单个数字)
- 1维:向量
- 2维:矩阵
- 更高维:高阶数据
Tensor与NumPy的ndarray类似,但额外支持GPU加速计算,这使得PyTorch特别适合深度学习任务。
Tensor的创建方式
PyTorch提供了多种创建Tensor的方法:
1. 直接创建
import torch as t
# 创建指定形状的Tensor(未初始化)
a = t.Tensor(2, 3)
# 从Python列表创建
b = t.Tensor([[1,2,3],[4,5,6]])
2. 使用工厂函数
PyTorch提供了多种工厂函数来创建特定内容的Tensor:
# 全1张量
t.ones(2, 3)
# 全0张量
t.zeros(2, 3)
# 单位矩阵
t.eye(3, 3)
# 随机张量
t.randn(2, 3) # 标准正态分布
t.rand(2, 3) # 均匀分布[0,1)
# 序列张量
t.arange(1, 10, 2) # [1,3,5,7,9]
t.linspace(1, 10, 5) # 1到10均匀分成5份
3. 从NumPy数组创建
import numpy as np
arr = np.ones((2,3))
a = t.tensor(arr)
命名张量
PyTorch支持为张量的维度命名,这在处理图像、序列等数据时特别有用:
# 创建命名张量
imgs = t.randn(1, 2, 2, 3, names=('N', 'C', 'H', 'W'))
# 查看维度名称
print(imgs.names) # ('N', 'C', 'H', 'W')
# 通过名称操作维度
imgs_rotate = imgs.transpose('H', 'W')
命名张量的优势:
- 代码更易读
- 减少维度混淆错误
- 支持按名称广播
Tensor的类型系统
PyTorch支持多种数据类型,常见的有:
| 数据类型 | dtype | CPU Tensor | GPU Tensor | |---------|-------|------------|------------| | 32位浮点 | torch.float32 | FloatTensor | cuda.FloatTensor | | 64位浮点 | torch.float64 | DoubleTensor | cuda.DoubleTensor | | 16位浮点 | torch.float16 | HalfTensor | cuda.HalfTensor | | 8位整型 | torch.int8 | CharTensor | cuda.CharTensor | | 32位整型 | torch.int32 | IntTensor | cuda.IntTensor | | 64位整型 | torch.int64 | LongTensor | cuda.LongTensor |
类型转换
a = t.rand(2,3)
# 转换为float32
b1 = a.float()
b2 = a.type(t.FloatTensor)
# 转换为int64
c = a.long()
设备转换
# CPU转GPU
if t.cuda.is_available():
a_cuda = a.cuda()
# GPU转CPU
a_cpu = a_cuda.cpu()
最佳实践
-
优先使用torch.tensor而非torch.Tensor:
- torch.tensor()会根据输入数据自动推断类型
- torch.Tensor()默认创建FloatTensor
-
注意inplace操作:
- 以
_
结尾的方法会修改原张量 - 例如:
a.add_(b)
会修改a,而a.add(b)
会返回新张量
- 以
-
合理选择数据类型:
- 训练时通常使用float32
- 推理时可尝试float16减少显存占用
- 整数索引使用int64或int32
掌握这些Tensor基础操作是使用PyTorch进行深度学习开发的第一步。在实际应用中,合理选择数据类型和创建方式可以显著提升代码效率和可读性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考