张量是 PyTorch 中的核心数据结构,可以理解为多维数组,支持高效的数值计算和自动微分。
- 标量(0维张量):torch.tensor(3.14)
- 向量(1维张量):torch.tensor([1, 2, 3])
- 矩阵(2维张量):torch.tensor([[1, 2], [3, 4]])
- 高维张量:如图像数据(3维:通道×高×宽)、视频数据(4维:时间×通道×高×宽)。
张量的创建
直接创建
import torch
# 从列表创建
a = torch.tensor([1, 2, 3], dtype=torch.float32, device='cuda')
# 特殊初始化
b = torch.zeros(2, 3) # 全零张量
c = torch.ones_like(b) # 与b同形状的全1张量
d = torch.rand(3, 3) # 均匀分布随机数
e = torch.randn(3, 3) # 标准正态分布随机数
从 NumPy 数组转换
import numpy as np
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array) # 共享内存(修改一个会影响另一个)
张量操作
按是否修改原数据
- In-place 操作:直接修改原张量,以 _ 结尾(如 add_())。
x.add_(1) # 等价于 x = x + 1,但内存地址不变(可能破坏梯度计算链)
- 非 In-place 操作:返回新张量,原数据不变。
按功能分类
操作类型 | 示例函数 |
数学运算 | add(), mul(), matmul(), exp() |
形状操作 | view(), reshape(), transpose() |
索引与切片 | x[0, :2], masked_select() |
归约操作 | sum(), mean(), max(), argmax() |
内存操作 | clone(), detach(), contiguous() |
张量与自动微分
通过 requires_grad=True 追踪梯度:
x = torch.tensor(2.0, requires_grad=True)
y = x ** 2 + 3 * x
y.backward() # 计算梯度
print(x.grad) # dy/dx = 2x + 3 → 7.0