beginner/examples_tensor/polynomial_tensor
在 Google Colab 中运行
Colab
下载 Notebook
Notebook
在 GitHub 上查看
GitHub
注意
转到末尾 下载完整的示例代码。
PyTorch: 张量#
创建于:2020 年 12 月 03 日 | 最后更新:2020 年 12 月 03 日 | 最后验证:2024 年 11 月 05 日
一个三阶多项式,通过最小化平方欧几里德距离,训练用于预测从 \(-\pi\) 到 \(\pi\) 的 \(y=\sin(x)\)。
此实现使用 PyTorch 张量手动计算前向传播、损失和反向传播。
PyTorch 张量与 numpy 数组基本相同:它对深度学习、计算图或梯度一无所知,只是一个通用的 N 维数组,用于任意数值计算。
numpy 数组和 PyTorch 张量之间最大的区别在于 PyTorch 张量可以在 CPU 或 GPU 上运行。要在 GPU 上运行操作,只需将张量转换为 cuda 数据类型即可。
99 2783.07080078125
199 1856.5316162109375
299 1239.9876708984375
399 829.5586547851562
499 556.2243041992188
599 374.11029052734375
699 252.716796875
799 171.7584686279297
899 117.73885345458984
999 81.67414093017578
1099 57.58317947387695
1199 41.48060989379883
1299 30.710966110229492
1399 23.50325584411621
1499 18.67608070373535
1599 15.440985679626465
1699 13.27116584777832
1799 11.814750671386719
1899 10.83635139465332
1999 10.178570747375488
Result: y = 0.021165532991290092 + 0.8265973329544067 x + -0.0036514054518193007 x^2 + -0.08904273808002472 x^3
import torch
import math
dtype = torch.float
device = torch.device("cpu")
# device = torch.device("cuda:0") # Uncomment this to run on GPU
# Create random input and output data
x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)
# Randomly initialize weights
a = torch.randn((), device=device, dtype=dtype)
b = torch.randn((), device=device, dtype=dtype)
c = torch.randn((), device=device, dtype=dtype)
d = torch.randn((), device=device, dtype=dtype)
learning_rate = 1e-6
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')
脚本总运行时间: (0 分钟 0.226 秒)