Numpy是用于科学计算的通用框架,它具备:
- 一个n维数组对象
- 以及许多用于操作n维数组对象的函数
我们先用Numpy实现一个基于梯度下降法的多项式回归模型 - 向前计算
- 计算损失函数
- 计算模型参数相对于损失函数的梯度
- 更新模型参数
代码如下:
import numpy as np
import math
# 创建训练数据和标签值
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)
# 随机初始化权重 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(5000):
# 前向传播: 计算预测值 y
# y = a + b x + c x^2 + d x^3
y_pred = a + b * x + c * x ** 2 + d * x ** 3
# 计算损失函数值
loss = np.square(y_pred - y).sum()
if t % 500 == 499:
print(t, loss)
# 计算参数 a, b, c, d 相对于 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()
# 更新参数
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')
x = 90* math.pi/180
print(f"sin(x)={np.sin(x)}; y(x) = {a + b * x + c * x ** 2 + d * x ** 3}")
运行结果:
4999 [8.817238]
Result: y = [-0.00027947] + [0.8567045] x + [4.8210277e-05] x^2 + [-0.09332521] x^3
sin(x)=1.0; y(x) = [0.9838394]
PaddlePaddle(飞桨)是深度学习框架,将神经网络抽象为计算表示Operator(算子)和数据表示Variable(变量),让开发者能方便快速的搭建深度学习模型。它具备:
- 一个n维数组的张量(Tensor)对象
- 以及许多用于操作张量的函数
- 支持GPU运算
- 可以跟踪计算图(computational graph)并完成自动微分(auto_gradients)功能
PaddlePaddle可以理解为了专为深度学习应用优化的,支持计算图和自动微分的,能在GPU上计算的“Numpy”。显然,PaddlePaddle也可以用于通用科学计算。
用PaddlePaddle改写上面的程序:
import paddle
import math
# 创建训练数据和标签值
x = paddle.linspace(-math.pi, math.pi, 2000)
y = paddle.sin(x)
# 随机初始化权重 weights
a = paddle.randn([1])
b = paddle.randn([1])
c = paddle.randn([1])
d = paddle.randn([1])
learning_rate = 1e-6
for t in range(5000):
# 前向传播: 计算预测值 y
# y = a + b x + c x^2 + d x^3
y_pred = a + b * x + c * x ** 2 + d * x ** 3
# 计算损失函数值
loss = paddle.square(y_pred - y).sum()
if t % 500 == 499:
print(t, loss.numpy())
# 计算参数 a, b, c, d 相对于 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()
# 更新参数
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.numpy()} + {b.numpy()} x + {c.numpy()} x^2 + {d.numpy()} x^3')
x = 90* math.pi/180
a,b,c,d = a.numpy(),b.numpy(),c.numpy(),d.numpy()
import numpy as np
print(f"sin(x)={np.sin(x)}; y(x) = {a + b * x + c * x ** 2 + d * x ** 3}")
运行结果
4999 [8.817238]
Result: y = [-0.00027947] + [0.8567045] x + [4.8210277e-05] x^2 + [-0.09332521] x^3
sin(x)=1.0; y(x) = [0.9838394]
用PaddlePaddle实现的程序框架和计算,跟Numpy实现的程序非常类似
下一节《从Numpy到PaddlePaddle2》
网友评论