在学习Pytorch之前,我们将首先使用numpy实现拟合sin函数。Numpy和Pytorch中的tensor(张量)异曲同工,它提供了一个n维数组对象,以及许多用于操作这些数组的函数,但是它不能完成图形计算,深度学习等的复杂计算任务。这里通过设置一个三次多项式,手动地实现向前和向后传播网络来拟合sin函数。话不多说直接上代码:
#导入相关模块
import numpy as np
import math
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)
#随机初始化四个权重
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):
# 三次函数输出 y = a + b x + c x^2 + d x^3
y_pred = a + b * x + c * x ** 2 + d * x ** 3
#设置平方差为损失函数,每迭代100次就打印出loss值
loss = np.square(y_pred - y).sum()
if t % 100 == 0:
print(t, loss)
# 反向传播计算abcd的梯度
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()
#更新权重
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')
以上代码可以在jupyter notebook运行,训练过程和结果如下:
result.png
可视化代码和效果如下,三次函数拟合效果还是有点差强人意:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 8))
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)
y_pred = a + b*x + c*x**2 + d*x**3
plt.plot(x,y,linewidth = 0.8,label = "y")
plt.plot(x,y_pred,linewidth = 0.8,label = "y_pred")
plt.legend()
plt.show()
curve.png