依据《动手学深度学习》理解并复现“线性规划”章节代码
一、背景
- 利用线性规划模型进行拟合,解决预测问题。
- 在这章的学习过程中,能够很好地理解SGD优化算法的实现过程,这也是深度学习最经典最常用的优化算法。
- 并且能够建立深度学习的一个使用框架,即:
①构建模型(设置网络层数等)
②构建损失函数(MSE均方误差等)
③设置超参数(学习率learning_rate、批量大小batch_size、迭代次数num_epoch等)
④迭代优化(SGD等)
(个人理解:数学本质上就是一个优化问题,目标为最小化损失函数)
二、流程
- 前向传播:net(X, w, b)计算模型的预测输出。
- 计算损失:loss()计算预测输出与真实标签之间的均方误差损失。
- 反向传播:调用 .backward() 计算梯度。
- 更新参数:使用随机梯度下降(SGD)更新参数。with torch.no_grad()
用于临时禁用梯度计算,因为参数更新不需要计算梯度。 - 清零梯度:在每次迭代结束后,.grad.zero_()清零参数的梯度,以便在下一次迭代中重新计算梯度。
- 打印损失:每1个epoch打印一次损失值,以便观察训练过程。
三、代码版本-v1(从零开始)
- 基于上述流程的代码复现及注释
import random
import torch
from d2l import torch as d2l
def synthetic_data(w, b, num_examples):
"""生成 y = Xw + b + 噪声。"""
X = torch.normal(0, 1, (num_examples, len(w))) #均值为0,方差为1的随机数
y = torch.matmul(X, w) + b
y += torch.normal(0, 0.01, y.shape) #随机噪声
return X, y.reshape(-1, 1)
#自定义真实w,b
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
print('features:', features[0], '\nlabel:', labels[0])
#绘制生成的真值数据
d2l.set_figsize()
d2l.plt.scatter(features[:, 1].detach().numpy(),
labels

最低0.47元/天 解锁文章
5951

被折叠的 条评论
为什么被折叠?



