评价此页

PyTorch: Tensors#

创建日期:2020 年 12 月 03 日 | 最后更新:2025 年 09 月 29 日 | 最后验证:2024 年 11 月 05 日

一个三阶多项式,通过最小化欧几里得距离平方,从 \(-\pi\)\(\pi\) 训练以预测 \(y=\sin(x)\)

此实现使用 PyTorch Tensors 手动计算前向传播、损失和反向传播。

PyTorch Tensor basically the same as a numpy array: it does not know anything about deep learning or computational graphs or gradients, and is just a generic n-dimensional array to be used for arbitrary numeric computation.

PyTorch Tensor 与 numpy array 最大的区别在于,PyTorch Tensor 可以在 CPU 或 GPU 上运行。要在 GPU 上运行操作,只需将 Tensor 转换为 cuda 数据类型即可。

99 949.525146484375
199 632.3920288085938
299 422.2398376464844
399 282.9600830078125
499 190.6369171142578
599 129.4294891357422
699 88.84382629394531
799 61.92726135253906
899 44.072265625
999 32.22596740722656
1099 24.364370346069336
1199 19.146005630493164
1299 15.681275367736816
1399 13.380207061767578
1499 11.851539611816406
1599 10.835738182067871
1699 10.160508155822754
1799 9.711515426635742
1899 9.412845611572266
1999 9.214092254638672
Result: y = -0.0071981302462518215 + 0.8385370969772339 x + 0.0012417974648997188 x^2 + -0.09074106812477112 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.213 秒)