前言
提示:本篇博客主要是记录pytorch的学习过程,当作是一个笔记来使用。
本篇内容如下:
- NumPy
- 张量
本文任务:使用NumPy和Tensor完成三阶多项式拟合y = sin(x)的问题。该网络将具有四个参数,并且将通过使网络输出与实际输出之间的欧几里德距离最小化来进行梯度下降训练,以适应随机数据。
一、NumPy
1.1 知识点记录
1. 要点:在本实现中,我们使用 numpy 手动实现前向传播,损失(loss)和反向传播。
2. 注意:numpy 数组是一种通用的 n 维数组;它跟深度学习,梯度或计算图没啥关系,只是执行通用数值计算的一种方法。
3.步骤:
① 创建随机的输入数据和输出数据
② 随机初始化权重
③ 前向传播:计算预测y值
④ 计算和打印loss
⑤ 反向传播计算 a、b、c、d 相对于损失的梯度
⑥ 更新权重
1.2 核心代码
提示:全部代码点这里
for t in range(2000):
# Forward pass: compute predicted y
# y = a + b x + c x^2 + d x^3
y_pred = a + b*x + c*x**2 + d*x**3
# Compute and print loss
loss = np.square(y_pred - y).sum()
if t % 100 == 99:
print(t, loss)
# Backprop to compute gradients of a, b, c, d with respect to loss
grad_y_pred = 2.0 * (y_pred - y)
grad_a = grad_y_pred.sum()
grad_b = (grad_y_pred * x).sum()
grad_c = (grad_y_pred * x**2).sum()
grad_d = (grad_y_pred * x**3).sum()
# Update weights
a -= learning_rate * grad_a
b -= learning_rate * grad_b
c -= learning_rate * grad_c
d -= learning_rate * grad_d
print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')
二、张量
2.1 知识点记录
本小节主要是使用tensor来实现第一节中的任务,值得注意的是:
1. PyTorch 的张量基本上与 numpy 数组一样:它跟深度学习,梯度或计算图也没啥关系,只是用于任意数值计算的一种通用 n 维数组。
2. numpy 数组和 PyTorch 张量之间的最大区别在于,PyTorch 张量可以在 CPU 或 GPU 上运行。如果要在 GPU 上运行,只需将张量转换为 cuda 数据类型。
2.2 核心代码
提示:全部代码点这里
for t in range(2000):
# Forward pass: compute predicted y
y_pred = a + b * x + c * x ** 2 + d * x ** 3
# Compute and print loss
loss = (y_pred - y).pow(2).sum().item()
if t % 100 == 99:
print(t, loss)
# Backprop to compute gradients of a, b, c, d with respect to loss
grad_y_pred = 2.0 * (y_pred - y)
grad_a = grad_y_pred.sum()
grad_b = (grad_y_pred * x).sum()
grad_c = (grad_y_pred * x ** 2).sum()
grad_d = (grad_y_pred * x ** 3).sum()
# Update weights using gradient descent
a -= learning_rate * grad_a
b -= learning_rate * grad_b
c -= learning_rate * grad_c
d -= learning_rate * grad_d
print(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x^3')
总结
本章难点在于反向传播的实现部分,可以返回 PyTorch学习02 进行回顾。