評價此頁

熱身:numpy#

建立日期:2020 年 12 月 03 日 | 最後更新:2025 年 09 月 29 日 | 最後驗證:2024 年 11 月 05 日

一個三階多項式,透過最小化歐幾里得距離平方,從 \(-\pi\)\(\pi\) 訓練以預測 \(y=\sin(x)\)

此實現使用 numpy 手動計算前向傳播、損失和後向傳播。

numpy 陣列是一個通用的 n 維陣列;它對深度學習、梯度或計算圖一無所知,僅僅是一種執行通用數值計算的方式。

99 388.2964989863209
199 263.5660647475677
299 179.9730610087652
399 123.9069187280723
499 86.27394654264089
599 60.99339907554943
699 43.9965872505971
799 32.55926734037074
899 24.856098205214266
999 19.663135374221856
1099 16.159059600215066
1199 13.792291629971178
1299 12.192097440995827
1399 11.109081657079427
1499 10.375325826526202
1599 9.87766683807366
1699 9.539770381012872
1799 9.310095230101755
1899 9.153805984344647
1999 9.047334329770528
Result: y = 0.011369133497771914 + 0.8463253638436126 x + -0.0019613647115636528 x^2 + -0.09184887781889801 x^3

import numpy as np
import math

# Create random input and output data
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)

# Randomly initialize weights
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()

learning_rate = 1e-6
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')

指令碼總執行時間: (0 分 0.232 秒)