张量(Tensor)是 PyTorch 中的 核心数据结构,它是一个多维数组,类似于 NumPy 的 ndarray
,但具有更强大的功能,比如可以在 GPU 上加速计算。
张量的特性
-
多维数组:
- 张量是一个可以具有 任意维度(1D、2D、3D 或更多) 的数据结构。例如:
- 标量:0D 张量(如一个单独的数字)。
- 向量:1D 张量(如
[1.0, 2.0, 3.0]
)。 - 矩阵:2D 张量(如 3 × 3 矩阵)。
- 更高维度:3D 或更多维度(如图像批次)。
- 张量是一个可以具有 任意维度(1D、2D、3D 或更多) 的数据结构。例如:
-
数据存储:
- PyTorch 张量可以存储在 CPU 或 GPU 上。
- 张量支持在 CPU 和 GPU 之间的快速切换,使其成为深度学习任务的核心。
-
自动求导:
- PyTorch 张量可以跟踪计算图,并通过反向传播计算梯度,支持深度学习中的优化任务。
张量与 NumPy 的比较
特性 | PyTorch Tensor | NumPy ndarray |
---|---|---|
多维数组 | 支持 | 支持 |
GPU 支持 | 是 | 否 |
自动求导 | 是(支持自动梯度计算) | 否 |
与其他框架兼容 | 是(与 NumPy 无缝兼容) | 是 |
张量的基本概念
1. 张量的维度
-
0D 张量(标量):
- 只有一个值,没有维度。
import torch t = torch.tensor(3.14) print(t.shape) # 输出:torch.Size([])
-
1D 张量(向量):
- 例如,表示
[1.0, 2.0, 3.0]
。
t = torch.tensor([1.0, 2.0, 3.0]) print(t.shape) # 输出:torch.Size([3])
- 例如,表示
-
2D 张量(矩阵):
- 例如,一个3 × 2 的矩阵。
t = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]]) print(t.shape) # 输出:torch.Size([3, 2])
-
3D 张量(立体数据):
- 用于表示更复杂的数据,例如一批图片。
t = torch.ones((4, 3, 2)) # 表示 4 个样本,每个样本是 3x2 的矩阵 print(t.shape) # 输出:torch.Size([4, 3, 2])
张量的创建
PyTorch 提供了多种方法来创建张量:
1. 从 Python 数据创建
- 使用
torch.tensor()
将 Python 列表或标量转换为张量:t = torch.tensor([1, 2, 3]) # 1D 张量 print(t) # 输出:tensor([1, 2, 3])
2. 初始化特殊张量
- 全 0 张量:
t = torch.zeros(3, 3) # 创建 3x3 的全 0 张量
- 全 1 张量:
t = torch.ones(2, 4) # 创建 2x4 的全 1 张量
- 随机数张量:
t = torch.rand(3, 3) # 创建 3x3 的随机数张量
3. 从 NumPy 数组创建
- NumPy 转 PyTorch 张量:
import numpy as np arr = np.array([1, 2, 3]) t = torch.from_numpy(arr)
- PyTorch 张量转 NumPy 数组:
arr = t.numpy()
张量的计算
张量支持与 NumPy 类似的数学运算,但同时可以利用 GPU 加速:
a = torch.tensor([1.0, 2.0, 3.0])
b = torch.tensor([4.0, 5.0, 6.0])
print(a + b) # 输出:tensor([5.0, 7.0, 9.0])
print(a * b) # 输出:tensor([4.0, 10.0, 18.0])
张量在 GPU 上的使用
- 创建 GPU 张量:
t = torch.tensor([1.0, 2.0, 3.0], device='cuda')
- 将 CPU 张量移动到 GPU:
t_cpu = torch.tensor([1.0, 2.0, 3.0]) t_gpu = t_cpu.to('cuda')
总结
- 张量(Tensor) 是 PyTorch 的核心数据结构,类似于 NumPy 的多维数组,但支持 GPU 加速和自动求导。
- 核心特点:
- 支持高效的数学计算。
- 可以在 CPU 和 GPU 之间自由切换。
- 与 NumPy 完美兼容。
- 它是深度学习模型训练中的基础,可以表示输入数据、参数、梯度等各种信息。