深度学习(3):Tensor和Optimizer
文章目录
- 是什么
- Tensor
- 1. Tensor 的基本概念
- 2. 自动求导(Autograd)机制
- 3. `requires_grad` 属性
- 4. `.data` 和 `.item()`
- 5. 梯度清零
- Optimizer
是什么
Tensor(张量):在 PyTorch 中,Tensor 是一种多维数组, 可以在 GPU 上进行高效的数值计算。
Optimizer(优化器):在 PyTorch 中,优化器负责管理和更新模型的参数,特别是在训练过程中根据计算出的梯度来更新参数以最小化损失函数。
Tensor
1. Tensor 的基本概念
- 定义:Tensor 是 PyTorch 中的基本数据结构,表示多维数组。
- 创建:使用
torch.tensor()
或其他方法(如torch.zeros()
、torch.ones()
等)创建。 - 属性:
data
:Tensor 的数据部分。grad
:Tensor 的梯度,只有当requires_grad = True
时,才会在反向传播后被赋值。requires_grad
:是否需要对该 Tensor 计算梯度,默认值为False
。
2. 自动求导(Autograd)机制
- 计算图:PyTorch 通过记录 Tensor 的操作,构建一个有向无环图(DAG),称为计算图。
- 反向传播:调用
loss.backward()
,PyTorch 会自动计算损失对所有叶子节点的梯度。 - 梯度累积:在默认情况下,梯度会在每次反向传播中累积,需要手动清零。
3. requires_grad
属性
- 作用:指定 Tensor 是否需要计算梯度。
- 设置方法:在创建 Tensor 时,通过参数
requires_grad=True
,或者在已有的 Tensor 上设置tensor.requires_grad = True
。
4. .data
和 .item()
.data
:tensor.data
:获取 Tensor 的数据部分,不会影响计算图的构建。- 这个地方得注意,在老版本里面可以使用,但新版本里面有时候会导致梯度计算出现问题,一般使用使用
with torch.no_grad():
块来避免计算图的影响
.item()
:- 作用:将单元素 Tensor 转换为 Python 数值。
- 用途:用于打印、记录损失值或中间结果。
5. 梯度清零
- 原因:防止梯度累积,确保每次反向传播计算的梯度是针对当前样本或批次的。
- 方法:
w.grad.data.zero_()
:将梯度清零。
Optimizer
优化器位于 torch.optim 包中,是实现各种优化算法的核心组件。它们的主要功能是调整网络参数以减少计算出的损失值。每一个优化器都继承自 torch.optim.Optimizer,并实现特定的优化策略。
使用主要包括三个步骤:计算梯度、执行参数更新和清除梯度。
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 2) # 示例模型
criterion = nn.MSELoss() # 损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001) # 初始化优化器
for inputs, targets in data_loader:
optimizer.zero_grad() # 清除过去的梯度
outputs = model(inputs) # 前向传播
loss = criterion(outputs, targets) # 计算损失
loss.backward() # 反向传播,计算当前梯度
optimizer.step() # 根据梯度更新参数