PaddlePaddle一步一步搭建简单网络

PaddlePaddle一步一步搭建简单网络

如何开始

在这里插入图片描述
对于新手入门来说,个人建议先看Fluid编程指南,明白了如何使用之后,再看线性回归、数字识别。

现实问题

我们有一堆数据x和数据y,数据x与数据y之间存在某种规律,我们的目标是当新的x出现后,我们通过这种规律确定y的值,根据y的值可以指导我们的决策。所以首先我们得先得到规律,这就要通过深度学习让机器学到,然后我们给出新的x值,通过已学习到的关系得到新的y值。

上面一段话,总结3个关键点

  1. 已有的一堆数据x和数据y为历史数据,也成为训练数据
  2. 这种规律称为f
  3. 新的x值确定的y值成为预测值

数学表达出来就是

y = f ( x ) y=f(x)

PaddlePaddle如何解决现实问题

数据如何传入到PaddlePaddle中进行学习?
如何通过PaddlePaddle进行学习?
学习完成后,如何进行预测?

1.我们通过numpy.array给了4个x的数据1.0、2.0、3.0、4.0,4个y的数据2.0、4.0、6.0、8.0,作为训练数据。

train_x = numpy.array([[1.0], [2.0], [3.0], [4.0]]).astype('float32')
train_y = numpy.array([[2.0], [4.0], [6.0], [8.0]]).astype('float32')

2.定义2个空间x和y,存放train_x和train_y,建立全连接网络,将x与预测y联系到一起。

x = fluid.layers.data(name="x", shape=[1], dtype='float32')
y = fluid.layers.data(name="y", shape=[1], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, act=None)

3.如何确定学习的好与不好,标准是什么?cost就是y_predict与y的方差,avg_cost就是均方差,sgd_optimizer就是使用随机梯度下降算法来最小化均方差。

cost = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_cost = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(avg_cost)

4.获得学习到的规律(参数保存到文件中)

model_path="./demo_paddle_model"
fluid.io.save_params(executor=exe,dirname=model_path,main_program=None)

5.使用已经学到的模型做预测(从文件读取参数)

param_path = "./demo_paddle_model"
prog = fluid.default_main_program()
fluid.io.load_params(executor=exe, dirname=param_path,
                     main_program=prog)

完整代码

文件SimpleNN.py

import paddle.fluid as fluid
import numpy
import time

# 定义数据
train_x = numpy.array([[1.0], [2.0], [3.0], [4.0]]).astype('float32')
train_y = numpy.array([[2.0], [4.0], [6.0], [8.0]]).astype('float32')
# 定义网络
x = fluid.layers.data(name="x", shape=[1], dtype='float32')
y = fluid.layers.data(name="y", shape=[1], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, act=None)
# 定义损失函数
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_cost = fluid.layers.mean(cost)
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(avg_cost)
# 参数初始化
cpu = fluid.core.CPUPlace()
exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program())



# 开始训练
for i in range(10000):
    outs = exe.run(
        feed={'x': train_x, 'y': train_y},
        fetch_list=[y_predict.name, avg_cost.name])

    # time.sleep(1)
print(outs)

model_path="./demo_paddle_model"
fluid.io.save_params(executor=exe,dirname=model_path,main_program=None)

文件SimpleNNInfer.py

import paddle.fluid as fluid
import numpy

# 定义数据
new_x = numpy.array([[9.0]]).astype('float32')

# 定义网络
x = fluid.layers.data(name="x", shape=[1], dtype='float32')
y = fluid.layers.data(name="y", shape=[1], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, act=None)

# 参数初始化
cpu = fluid.core.CPUPlace()
exe = fluid.Executor(cpu)

param_path = "./demo_paddle_model"
prog = fluid.default_main_program()
fluid.io.load_params(executor=exe, dirname=param_path,
                     main_program=prog)

outs = exe.run(
    feed={'x': new_x},
    fetch_list=[y_predict.name])

print(outs)

结果:
在这里插入图片描述