入门PaddlePaddle的编程实践

本项目主要用于学习和了解飞桨框架的使用方法,从实践体会飞桨框架正确的"打开方式"

在Fluid中,所有对数据的操作都由Operator表示。

为了便于用户使用,在Python端,Fluid中的Operator被一步封装入paddle.fluid.layers,paddle.fluid.nets 等模块。

这是因为一些常见的对Tensor的操作可能是由更多基础操作构成,为了提高使用的便利性,框架内部对基础 Operator 进行了一些封装,包括创建 Operator 依赖可学习参数,可学习参数的初始化细节等,减少用户重复开发的成本。

例如可以利用paddle.fluid.layers.elementwise_add()实现两个输入Tensor的加法运算:

#定义网络
import paddle.fluid as fluid
a = fluid.layers.data(name="a",shape=[1],dtype='float32')
b = fluid.layers.data(name="b",shape=[1],dtype='float32')

result = fluid.layers.elementwise_add(a,b)

#定义Exector
cpu = fluid.core.CPUPlace() #定义运算场所,这里选择在CPU下训练
exe = fluid.Executor(cpu) #创建执行器
exe.run(fluid.default_startup_program()) #网络参数初始化

#准备数据
import numpy
data_1 = int(1)
data_2 = int(2)
x = numpy.array([[data_1]])
y = numpy.array([[data_2]])

#执行计算
outs = exe.run(
feed={'a':x,'b':y},
fetch_list=[result.name])

#验证结果
print("%d+%d=%d"%(data_1,data_2,outs[0][0]))
1+2=3
#执行计算
outs = exe.run(
    feed={'a':x,'b':y},
    fetch_list=[a,b,result.name])
#查看输出结果
print(outs)
[array([[1]], dtype=int64), array([[2]], dtype=int64), array([[3]], dtype=int64)]

在执行以下代码时,请重启项目

开发机器学习模型的全流程

问题描述

给定一组数据 <X,Y>,求解出函数 f,使得 y=f(x),其中X,Y均为一维张量。最终网络可以依据输入x,准确预测出y p r e d i c t y_{predict}ypredict​。

定义数据

假设输入数据X=[1 2 3 4],Y=[2,4,6,8],在网络中定义:

#定义X数值
train_data=numpy.array([[1.0],[2.0],[3.0],[4.0]]).astype('float32')
#定义期望预测的真实值y_true
y_true = numpy.array([[2.0],[4.0],[6.0],[8.0]]).astype('float32')

搭建网络(定义前向计算逻辑)

接下来需要定义预测值与输入的关系,使用一个简单的线性回归函数进行预测:

# 定义输入数据类型
x = fluid.data(name="x", shape=[None, 1], dtype='float32')
y = fluid.data(name="y", shape=[None, 1], dtype='float32')
# 搭建全连接网络
y_predict = fluid.layers.fc(input=x, size=1, act=None)

这样的网络就可以进行预测了,但是输出结果只是一组随机数,离预期结果相差甚远:

# 加载库
import paddle.fluid as fluid
import numpy

# 定义输入数据
train_data=numpy.array([[1.0],[2.0],[3.0],[4.0]]).astype('float32')
y_true = numpy.array([[2.0],[4.0],[6.0],[8.0]]).astype('float32')

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

# 网络参数初始化
cpu = fluid.CPUPlace()
exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program())

outs = exe.run(
    feed={'x':train_data, 'y':y_true},
    fetch_list=[y_predict])

# 输出训练结果
print(outs)
[array([[-0.5525701],
       [-1.1051402],
       [-1.6577103],
       [-2.2102804]], dtype=float32)]

添加损失函数

完成模型搭建后,如何评估预测结果的好坏呢?我们通常在设计的网络中添加损失函数,以计算真实值与预测值的差。在本例中,损失函数采用均方差函数:

# 定义损失函数
cost = fluid.layers.square_error_cost(input=y_predict,label=y)
avg_cost = fluid.layers.mean(cost)

输出一轮计算后的预测值和损失函数:

# 加载库
import paddle.fluid as fluid
import numpy

# 定义输入数据
train_data=numpy.array([[1.0],[2.0],[3.0],[4.0]]).astype('float32')
y_true = numpy.array([[2.0],[4.0],[6.0],[8.0]]).astype('float32')

# 组建网络
x = fluid.data(name="x",shape=[None, 1],dtype='float32')
y = fluid.data(name="y",shape=[None, 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)

# 网络参数初始化
cpu = fluid.CPUPlace()
exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program())

outs = exe.run(
    feed={'x':train_data, 'y':y_true},
    fetch_list=[y_predict, avg_cost])

# 输出训练结果
print(outs)
[array([[-0.65462136],
       [-1.3092427 ],
       [-1.9638641 ],
       [-2.6184855 ]], dtype=float32), array([52.852608], dtype=float32)]

可以看到cost现在挺大的,说明还有下降的空间

网络优化

确定损失函数后,可以通过前向计算得到损失值,然后通过链式求导法则得到参数的梯度值。

获取梯度值后需要更新参数,最简单的算法是随机梯度下降法:w=w−η⋅g,由fluid.optimizer.SGD实现:

# 选择优化方法
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.01)
sgd_optimizer.minimize(avg_cost)

让我们的网络训练100次,查看结果:

# 加载库
import paddle.fluid as fluid
import numpy

# 定义输入数据
train_data=numpy.array([[1.0],[2.0],[3.0],[4.0]]).astype('float32')
y_true = numpy.array([[2.0],[4.0],[6.0],[8.0]]).astype('float32')

# 组建网络
x = fluid.data(name="x",shape=[None, 1],dtype='float32')
y = fluid.data(name="y",shape=[None, 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.01)
sgd_optimizer.minimize(avg_cost)

# 网络参数初始化
cpu = fluid.CPUPlace()
exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program())

# 开始训练,迭代100次
for i in range(100):
    outs = exe.run(
        feed={'x':train_data, 'y':y_true},
        fetch_list=[y_predict, avg_cost])

# 输出训练结果
print(outs)
[array([[2.440328],
       [4.213369],
       [5.98641 ],
       [7.759451]], dtype=float32), array([0.07436587], dtype=float32)]

可以看到100次迭代后,预测值已经非常接近真实值了,损失值也下降到了0.01。

https://blog.csdn.net/zbp_12138/article/details/109253924

猜你喜欢

转载自blog.csdn.net/qq_27009517/article/details/112994370