beginner/examples_tensor/polynomial_tensor
在 Google Colab 中執行
Colab
下載 Notebook
Notebook
在 GitHub 上檢視
GitHub
注意
跳轉到末尾 下載完整的示例程式碼。
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 秒)