目录
一、核心属性
复数支持
转置与视图操作
元信息
梯度相关
二. 常用方法
基本操作
转置与视图
数学运算
深度学习相关
3. 使用示例
梯度计算
设备管理
自定义反向传播
4. 注意事项
总结
一、核心属性
1.requires_grad: _bool:
该属性标记这个张量是否需要参与梯度计算,若为Ture,则计算时追踪其梯度,反之不会
x = torch.tensor([1.0], requires_grad=True)
y = x * 2
print(y.requires_grad)
2.retains_grad: _bool:
在requires_grad=False的情况下是否保留梯度,默认为False,用于临时计算梯度
3.shape
张量的维度信息,类似numpy收的shape
4.data:Tensor
直接访问tensor的底层数据
5.device:_device
张量储存的设备类型(CPU/GPU)
6.dtype
数据类型
7.layout:_layout
内存布局类型(如连续存储或稀疏等),通常无需直接操作
复数支持
real
复数张量的实部
imag
复数张量的虚部
转置与视图操作
T
: 返回二维张量的共轭转置视图(原地操作)。mat = torch.randn(2, 3) mat_T = mat.T # 转置(无共轭) mat_conj_T = mat.T.conj() # 共轭转置
H
: 返回二维张量的共轭转置视图(等价于.conj().transpose()
)。mT
: 转置最后两个维度(适用于高维张量)。mH
: 类似H
,但作用于多维张量的最后两个维度。
元信息
ndim
(_int
): 张量的维度数量。output_nr
(_int
): 在计算图中作为输出的序号(仅在requires_grad=True
时有效)。_version
(_int
): 张量版本标识符(用于自动微分缓存)。_base
(Optional[Tensor]
): 如果张量是通过视图操作(如切片)创建的,指向原始张量。_cdata
(_int
): 内部 C 层面的数据指针(开发者无需直接使用)。
梯度相关
grad_fn
(Optional[_Node]
):
记录该张量的梯度计算函数(节点),用于反向传播链追踪。_grad
(Optional[Tensor]
): 存储梯度值。grad
(Optional[Tensor]
): 公共接口访问梯度(与_grad
同步)。_backward_hooks
(Optional[Dict[_int, Callable]]
):
自定义反向传播钩子,用于修改梯度计算流程。
二. 常用方法
基本操作
.clone()
: 创建张量副本(独立存储)。.detach()
: 断开与计算图的连接(返回新张量,requires_grad=False
)。.numpy()
: 转换为 NumPy 数组(需在 CPU 上且 dtype 支持)。.to(device, dtype=None)
: 移动设备并转换数据类型。
转置与视图
.transpose(dim1, dim2)
: 交换指定维度的轴。.reshape(*shape)
: 改变形状(需保持元素总数一致)。.squeeze(dim=None)
: 移除单维度轴。.expand(*sizes)
: 扩展张量为更大的尺寸(元素不复制)。
数学运算
.add()
,.sub()
,.mul()
,.div()
等逐元素运算符。.sum()
,.mean()
,.max()
,.min()
等聚合操作。- 矩阵乘法:
@
运算符或.matmul()
方法。
深度学习相关
.zero_()
: 将所有元素置零。.ones_()
: 将所有元素置一。.normal_(mean=0, std=1)
: 从正态分布初始化。.relu()
,.sigmoid()
等激活函数。
3. 使用示例
梯度计算
x = torch.tensor([2.0], requires_grad=True)
y = x * x + 3
y.backward() # 自动计算梯度
print(x.grad) # 输出: tensor(4.0)
设备管理
x = torch.randn(3, 3).cuda() # 创建 GPU 张量
y = x.to("cpu") # 移动到 CPU
z = y.to("cuda", dtype=torch.float16) # 移动到 GPU 并转换 dtype
自定义反向传播
def custom_backward_hook(grad):
return grad * 2 # 修改梯度
t = torch.tensor([1.0], requires_grad=True)
t.register_backward_hook(custom_backward_hook)
# 前向计算
y = t * 2
y.backward()
print(t.grad) # 输出: tensor(4.0) (原梯度 2.0 * 2)
4. 注意事项
-
视图与拷贝:
- 视图操作(如切片、转置)不会复制数据,修改视图会影响原张量。
- 使用
.clone()
或.copy()
创建独立副本。
-
内存优化:
- 优先使用视图操作(如
.reshape()
)而非复制数据。
- 优先使用视图操作(如
-
混合精度训练:
- 通过
.to(dtype=torch.float16)
启用 FP16 训练,需 GPU 支持。
- 通过
-
避免常见错误:
- 在
requires_grad=False
的张量上调用.backward()
会报错。 - 确保计算图的
grad_fn
链未被意外切断。
- 在
总结
PyTorch 张量的属性和方法设计旨在简化深度学习开发流程,同时保持灵活性和高效性。理解这些属性(尤其是梯度相关和设备管理)对编写高性能模型至关重要。建议结合官方文档和实际案例深入学习具体用法。