瞎聊深度学习——PaddlePaddle的使用(一)

PaddlePaddle介绍

PaddlePaddle是百度自主研发的集深度学习核心框架、工具组件和服务平台为一体的技术领先、功能完备的开源深度学习平台,有全面的官方支持的工业级应用模型,涵盖自然语言处理、计算机视觉、推荐引擎等多个领域,并开放多个预训练中文模型。

PaddlePaddle同时支持稠密参数和稀疏参数场景的大规模深度学习并行训练,支持千亿规模参数、数百个节点的高效并行训练。PaddlePaddle拥有多端部署能力,支持服务器端、移动端等多种异构硬件设备的高速推理,预测性能有显著优势。目前PaddlePaddle已经实现了API的稳定和向后兼容,具有完善的中英双语使用文档。

PaddlePaddle的使用

PaddlePaddle是一个开源的深度学习平台,而在我们进行使用的时候主要使用的是其核心框架Paddle Fluid。Paddle Fluid提供覆盖深度学习开发、训练、预测及部署全流程的服务。

和其他我们常用的深度学习框架一样,Fluid同样使用Tensor结构来承载数据。

Tensor的示例可以如下来表示:

数学实例实例表示
0常数(只有大小)s = 123
1向量(有大小和方向)v = [1.2,1.3,1.4]
2矩阵m = [[1,2,3],[4,5,6]]
3三阶张量t = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]
nn阶张量以此类推......

用图片来表示一下1-6维的Tensor:

Fluid目前支持的数据类型如下(截止到2019.6):

  • float16: 部分操作支持
  • float32: 主要实数类型
  • float64: 次要实数类型,支持大部分操作
  • int32: 次要标签类型
  • int64: 主要标签类型
  • uint64: 次要标签类型
  • bool: 控制流数据类型
  • int16: 次要标签类型
  • uint8: 输入数据类型,可用于图像像素

Fluid中存在三种特殊的Tensor:

1、模型中的可学习参数

深度学习中可学习的参数(包括网络权值、偏置等)。该类参数在整个训练过程中会不断的接受优化算法的更新。

参数的定义如下(其中name用来表示名称,shape用来表示维度,dtype用来表示数据类型):

w = fluid.layers.create_parameter(name='w',shape=[1],dtype='float32')

通常情况下,我们并不需要自己来创建网络中的可学习参数,Fluid为大部分常见的神经网络基本计算模块都提供了封装。

以全连接模型为示例,Fluid会直接为全连接层创建权值和偏置两个可学习参数,此时我们并不需要像上面一样调用Parameter接口。

y = fluid.layers.fc(input=x,size=128,bias_attr=True)

2、输入输出Tensor

神经网络中输入输出数据也可以看做是一个特殊的Tensor,在这个Tensor中,一些维度的大小在定义模型时无法确定(如batch size,图片的宽度高度等),这些数据在我们定义模型时就需要进行占位。

batch size的定义:一次训练所选取的样本数(选取适当,会有效的防止内存爆炸 )。

Fluid中使用Fluid.layers.data来接收输入数据,我们需要提供形状信息,无法确定的时候可以指定维度为None。

代码示例:

# 定义名称为x,第一维度为3,数据类型为float64的数据
x = fluid.layers.data(name="x", shape=[3, None], dtype="float64")
# batch size无需显示指定,paddle会自动补充0维度为batch size,并且在运行时填充正确的数值
a = fluid.layers.data(name="a", shape=[3, 4], dtype='int64')
# 假如在我们熟知的卷积神经网络中图片的宽、高会不断的发生变化,我们可以有如下的定义方法
b = fluid.layers.data(name="image", shape=[3, None, None], dtype="float32")

3、常量Tensor

Fluid通过fill_constant接口来实现常量Tensor,我们可以指定维度、数据类型、常量值。

data = fluid.layers.fill_constant(shape=[1], dtype="int64", value=3)

注:和其他的框架一样,我们所定义的Tensor是不具有具体值的,知识定义了一个需要执行的操作,后文中会讲到如何运行Tensor。

数据传入

上面一部分我们只说了如何定义数据却没有明确指出如何传入数据,我们定义好数据后需要使用fluid.Executor或者fluid.ParallelExecutor接口来传入数据,Executor发挥着类似于解释器(类似于tf中的session)的作用:

# 创建CPU使用
place = fluid.CPUPlace()
# 创建调试器
output = fluid.Executor(place)
# 初始化调试器
output.run(fluid.default_main_program())

数据操作
Fluid中使用OP(Operator)来表示对数据的操作,我们可以使用内置指令来描述他们的神经网络。

在Python中,Fluid中的OP被封装在paddle.fluid.layers,paddle.fluid.nets等模块中。

举个例子魔门可以用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.CPUPlace() #定义运算场所,这里选择在CPU下训练
exe = fluid.Executor(cpu) #创建执行器
exe.run(fluid.default_startup_program()) #网络参数初始化

#准备数据
import numpy
data_1 = int(input("Please enter an integer: a="))
data_2 = int(input("Please enter an integer: b="))
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]))

输出如下:

我们如果要获取网络执行过程中a,b的值,可以将a,b添加到fetch_list中:fetch_list=[a,b,result.name]

本文就讲述了Fluid的一些基本操作,后续会深入理解高级操作。

 

 

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二哥不像程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值