美文网首页
从Numpy到PaddlePaddle1

从Numpy到PaddlePaddle1

作者: LabVIEW_Python | 来源:发表于2021-02-14 05:54 被阅读0次

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》

相关文章

网友评论

      本文标题:从Numpy到PaddlePaddle1

      本文链接:https://www.haomeiwen.com/subject/lsmsxltx.html