Pytorch实战
标准流程

Pytorch实现线性回归
import torch
# 反向传播示例:使用 PyTorch 实现简单的线性回归
# 准备数据集
x_data = torch.tensor([[1.0], [2.0], [3.0], [4.0], [5.0]]) # 调整输入形状为二维张量
y_data = torch.tensor([[2.0], [4.0], [6.0], [8.0], [10.0]]) # 调整目标形状为二维张量
w = torch.tensor([0.0], requires_grad=True) # 初始化权重 requires_grad=True 表示需要计算梯度
# 建立线性回归模型
class LinearRegressionModel(torch.nn.Module):
def __init__(self):
super(LinearRegressionModel, self).__init__() # 初始化父类
self.linear = torch.nn.Linear(1, 1) # 定义线性层
def forward(self, x):
return self.linear(x)
# 实例化模型
model = LinearRegressionModel() # 实例化模型
criterion = torch.nn.MSELoss(reduction='mean') # 定义损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 定义优化器
# 训练模型
# 批量梯度下降法(Batch Gradient Descent)进行训练
for epoch in range(100):
# 1. 前向传播:计算预测值
y_pred = model(x_data) # 使用整个数据集进行前向传播
# 2. 计算损失
loss = criterion(y_pred, y_data) # 使用整个数据集计算损失
print('Epoch [{}/100], Loss: {:.4f}'.format(epoch + 1, loss.item())) # 打印每个epoch的损失
# 3. 反向传播:计算梯度
optimizer.zero_grad() # 清零梯度
loss.backward() # 反向传播
# 4. 更新权重
optimizer.step() # 更新参数
print('w =',model.linear.weight.item())# 打印最终的权重
print('b =',model.linear.bias.item()) # 打印偏置
x_test = torch.Tensor([[6.0]]) # 测试数据
y_test = model(x_test) # 预测
print('预测值:', y_test.item()) # 打印预测结果x_data = torch.tensor([[1.0], [2.0], [3.0], [4.0], [5.0]])
- 描述的是5个独立样本,每个样本只有一个特征
nn.Linear(in_features, out_features)
in_features: 输入特征数。它描述的是单个样本有多少个特征,与样本数量(批大小)完全无关。out_features: 输出特征数。它描述的是模型对单个样本会输出多少个数字。
torch.nn.MSELoss(reduction='mean')
reduction='mean'(默认): 计算平均损失。reduction='sum': 计算损失总和。
torch.optim.SGD(model.parameters(), lr=0.01)
- 梯度下降算法
model.parameters()自动遍历模型内部的所有参数
torch.tensor
import torch
# 创建一个0维张量 (标量)
scalar = torch.tensor(5)
print(f"标量: {scalar}, 形状: {scalar.shape}")
# 创建一个1维张量 (向量)
vector = torch.tensor([1.0, 2.0, 3.0])
print(f"向量: {vector}, 形状: {vector.shape}")
# 创建一个2维张量 (矩阵)
matrix = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(f"矩阵:\n{matrix}\n形状: {matrix.shape}")shape (形状): 描述张量在每个维度上的大小。这是最重要的属性,能帮你理解数据的结构。例如,torch.Size([2, 3]) 表示一个2行3列的矩阵。
深度学习中看到 shape: [5, 1] 时
- 这是一个2维张量(因为它有两个轴/维度:行和列)。
- 第一个维度的大小是5,代表我们有5个样本。
- 第二个维度的大小是1,代表每个样本有1个特征。
torch.tensor 之所以成为深度学习的核心,它拥有 NumPy 两大能力:
- GPU加速张量可以被轻松地移动到GPU上进行计算,利用GPU成千上万个核心进行大规模并行运算
- 自动求导
创建一个张量时,可以设置 requires_grad=True。
PyTorch 的 Autograd 引擎会开始追踪所有涉及到这个张量的计算,并在内存中构建一个计算图。基于这些计算最终得到一个标量损失 loss 并调用 loss.backward() 时,PyTorch 会沿着计算图反向传播,自动计算出 loss 相对于每一个设置了 requires_grad=True 的张量的梯度。计算出的梯度值会累加并存储在该张量的 .grad 属性
torch.tensor 对象结构

.data 是一个指向该张量底层存储的原始数值的指针。它本身也是一个张量,与原张量共享同一块内存。你可以把它理解为张量的“肉身”,存放着具体的数字。
.grad 是用来存储和累加梯度的地方。它也是一个张量,形状与原张量完全相同。
一个完整的训练步骤:
import torch
# 1. 初始化: 创建一个需要学习的权重w
w = torch.tensor([3.0], requires_grad=True)
# 此时: w.data 是 tensor([3.0]), w.grad 是 None
# 2. 前向传播: 计算loss
x = torch.tensor([2.0])
y_true = torch.tensor([10.0])
y_pred = w * x
loss = (y_pred - y_true) ** 2
# 此时: w.data 仍然是 tensor([3.0]), w.grad 仍然是 None
# 3. 反向传播: 计算梯度
loss.backward()
# loss = (2w - 10)^2, d(loss)/dw = 2 * (2w - 10) * 2 = 4 * (2*3 - 10) = -16
# 此时: w.data 仍然是 tensor([3.0]), w.grad 被填充为 tensor([-16.0])
# 4. 更新权重: 优化器使用 .grad 来更新 .data
learning_rate = 0.01
with torch.no_grad():
# 更新规则: w_new = w_old.data - lr * w_old.grad
w -= learning_rate * w.grad
# 此时: w.data 被更新为 tensor([3.16]) (3.0 - 0.01 * -16), w.grad 仍然是 tensor([-16.0])
# 5. 梯度清零: 为下一轮做准备
w.grad.zero_()
# 此时: w.data 是 tensor([3.16]), w.grad 被清空为 tensor([0.])