您的位置:首页>>无极3官网

如何用Paddle Fluid API搭建一个简单的神经网络?这里有一份编程指南

发布时间:2019-05-27 17:26:37  来源:互联网    采编:王涵  背景:

  PaddlePaddle 是百度自主研发,集深度学习核心框架、工具组件和服务平台为一体的开源深度学习平台。该平台技术领先、功能完备。Paddle Fluid 是 PaddlePaddle 的核心框架,满足模型开发、训练、部署的全流程需求。本文将展示如何用 Paddle Fluid API 编程并搭建一个简单的神经网络。

  那么,Paddle Fluid 有哪些核心概念?如何在 Paddle Fluid 中定义运算过程?如何使用executor 运行 Paddle Fluid 操作?如何从逻辑层对实际问题建模?如何调用 API(层,数据集,损失函数,优化方法等等)呢?

  一、 使用 Tensor 表示数据

  Paddle Fluid 和其它主流框架一样,使用 Tensor 数据结构来承载数据。Tensor 可以简单理解成一个多维数组,一般而言可以有任意多的维度。不同的 Tensor 可以具有自己的数据类型和形状,同一 Tensor 中每个元素的数据类型是一样的,Tensor 的形状就是 Tensor 的维度。

  下图直观地表示 1~6 维的 Tensor:

  在 Paddle Fluid 中存在三种特殊的 Tensor:

  1. 模型中的可学习参数 : 模型中的可学习参数(包括网络权重、偏置等)生存期和整个训练任务一样长,会接受优化算法的更新,在 Paddle Fluid 中以 Variable 的子类 Parameter 表示。

  在 Paddle Fluid 中可以通过 fluid.layers.create_parameter 来创建可学习参数:

  一般情况下,您不需要自己来创建网络中的可学习参数,Paddle Fluid 为大部分常见的神经网络基本计算模块都提供了封装。以最简单的全连接模型为例,下面的代码片段会直接为全连接层创建连接权值(W)和偏置(bias)两个可学习参数,无需显式地调用 Parameter 相关接口来创建。

  2.输入输出 Tensor :整个神经网络的输入数据也是一个特殊的 Tensor,在这个 Tensor 中,一些维度的大小在定义模型时无法确定(通常包括:batch size,如果 mini-batch 之间数据可变,也会包括图片的宽度和高度等),在定义模型时需要占位。

  Paddle Fluid 中使用 fluid.layers.data 来接收输入数据,fluid.layers.data 需要提供输入 Tensor 的形状信息,当遇到无法确定的维度时,相应维度指定为 None 或 -1,如下面的代码片段所示:

  其中,dtype="int64" 表示有符号 64 位整数数据类型,更多 Paddle Fluid 目前支持的数据类型请在官网查阅:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/howto/prepare_data/feeding_data.html#fluid。

  3.常量 Tensor : Paddle Fluid 通过 fluid.layers.fill_constant 来实现常量 Tensor,用户可以指定 Tensor 的形状,数据类型和常量值。代码实现如下所示:

  需要注意的是,上述定义的 tensor 并不具有值,它们仅表示将要执行的操作,如您直接打印 data 将会得到描述该 data 的一段信息:

  输出结果:

  具体输出数值将在 Executor 运行时得到,详细过程会在后文展开描述。

  数据传入

  Paddle Fluid 有特定的数据传入方式:

  您需要使用 fluid.layers.data 配置数据输入层,并在 fluid.Executor 或 fluid.ParallelExecutor 中,使用 executor.run(feed=...) 传入训练数据。

  具体的数据准备过程,您可以阅读官网使用指南「准备数据」章节。

  使用 Operator 表示对数据的操作

  在 Paddle Fluid 中,所有对数据的操作都由 Operator 表示,您可以使用内置指令来描述它们的神经网络。为了便于用户使用,在 Python 端,Paddle Fluid 中的 Operator 被一步封装入 paddle.fluid.layers,paddle.fluid.nets 等模块。这是因为一些常见的对 Tensor 的操作可能是由更多基础操作构成,为了提高使用的便利性,框架内部对基础 Operator 进行了一些封装,包括创建 Operator 依赖可学习参数,可学习参数的初始化细节等,减少用户重复开发的成本。例如用户可以利用 paddle.fluid.layers.elementwise_add() 实现两个输入 Tensor 的加法运算:

  输出结果:

  本次运行时,输入 a=7,b=3,得到 outs=10。

  您可以复制这段代码在本地执行,根据指示输入其它数值观察计算结果。

  如果想获取网络执行过程中的 a,b 的具体值,可以将希望查看的变量添加在 fetch_list 中。

  输出结果:

  使用 Program 描述神经网络模型

  Paddle Fluid 不同于其它大部分深度学习框架,去掉了静态计算图的概念,代之以 Program 的形式动态描述计算过程。这种动态的计算描述方式兼具网络结构修改的灵活性和模型搭建的便捷性,在保证性能的同时极大地提高了框架对模型的表达能力。

  开发者的所有 Operator 都将写入 Program,在 Paddle Fluid 内部将自动转化为一种叫作 ProgramDesc 的描述语言,Program 的定义过程就像在写一段通用程序,有开发经验的用户在使用 Paddle Fluid 时,会很自然的将自己的知识迁移过来。

  其中,Paddle Fluid 通过提供顺序、分支和循环三种执行结构的支持,让用户可以通过组合描述任意复杂的模型。

  顺序执行:

  用户可以使用顺序执行的方式搭建网络:

  条件分支——switch、if else:

  Paddle Fluid 中有 switch 和 if-else 类来实现条件选择,用户可以使用这一执行结构在学习率调节器中调整学习率或其它希望的操作:

  关于 Paddle Fluid 中 Program 的详细设计思想,可以参考阅读官网进阶使用「设计思想」中更多 Fluid 中的控制流,可以参考阅读 API 文档。

  使用 Executor 执行 Program

  Paddle Fluid 的设计思想类似于高级编程语言 C++和 JAVA 等。程序的执行过程被分为编译和执行两个阶段。用户完成对 Program 的定义后,Executor 接受这段 Program 并转化为 C++后端真正可执行的 FluidProgram,这一自动完成的过程叫做编译。编译过后需要 Executor 来执行这段编译好的 FluidProgram。例如上文实现的加法运算,当构建好 Program 后,需要创建 Executor,进行初始化 Program 和训练 Program:

  代码实例

  您已经对 Paddle Fluid 核心概念有了初步认识了,不妨尝试配置一个简单的网络吧。如果感兴趣的话可以跟随本部分,完成一个非常简单的数据预测。

  从逻辑层面明确了输入数据格式、模型结构、损失函数以及优化算法后,需要使用 Paddle Fluid 提供的 API 及算子来实现模型逻辑。一个典型的模型主要包含 4 个部分,分别是:输入数据格式定义,模型前向计算逻辑,损失函数以及优化算法。

  1、问题描述 : 给定一组数据 <x,y>,求解出函数 f,使得 y=f(x),其中 X,Y 均为一维张量。最终网络可以依据输入 x,准确预测出 y_predict。

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

  3、搭建网络(定义前向计算逻辑) : 接下来需要定义预测值与输入的关系,本次使用一个简单的线性回归函数进行预测:

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

  输出结果:

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

  

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

  输出结果:

  可以看到第一轮计算后的损失函数为 9.0,仍有很大的下降空间。

  5、网络优化 : 确定损失函数后,可以通过前向计算得到损失值,然后通过链式求导法则得到参数的梯度值。获取梯度值后需要更新参数,最简单的算法是随机梯度下降法:w=w−η⋅g,由 fluid.optimizer.SGD 实现:

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

  输出结果:

  可以看到 100 次迭代后,预测值已经非常接近真实值了,损失值也从初始值 9.05 下降到了 0.01。至此,恭喜您!已经成功使用 PaddlePaddle 核心框架 Paddle Fluid 搭建了一个简单网络。如果您还想尝试更多,可以从官网继续阅读相关的文档及更多丰富的模型实例。

  参考:

  PaddlePaddle 项目地址:https://github.com/PaddlePaddle

  PaddlePaddle 官网使用指南地址:http://paddlepaddle.org/documentation/docs/zh/1.4/user_guides/index_cn.html




关注无极3娱乐公众号(itbear365 ),每天推送你感兴趣的科技内容。

特别提醒:本网内容转载自其他媒体,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。


返回网站首页 本文来源:互联网

本文评论
如何用Paddle Fluid API搭建一个简单的神经网络?这里有一份编程指南
PaddlePaddle 是百度自主研发,集深度学习核心框架、工具组件和服务平台为一体的开源深度学习平台。...
日期:05-27
一键就能换新机 360家庭防火墙这个功能超赞!
随着智能电子设备的发展,家庭中用到无线网络的电子设备越来越多,再加上宽带升级等情况,路由器的...
日期:05-10
WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
前端开发工具包 WijmoJS 在2019年的第一个主要版本2019V1已经发布,本次发布包括了更加易用的在线De...
日期:05-07
开启容器时代的未来之路 看KubeSphere如何“举重若轻”
“当微服务变得越来越多时,管理就会出问题。就像汽车的轮子,单个轮子肯定不行,需要整装、驱...
日期:04-30
闪退?卡顿?统统再见!自从用了WPS,一切工作666
一个月前,公司进入疯狂比稿季,各种比稿方案仿佛抱团一样都向我扑来!作为公司NO.1职场女战士,我义...
日期:04-22
【知道创宇404实验室】Oracle WebLogic远程命令执行漏洞预警
2019年04月17日,国家信息安全漏洞共享平台(CNVD)官方发布安全公告 http://www.cnvd.org.cn/webinfo...
日期:04-22
UMCloud混合云存储,备份、归档、容灾一个也不能少
人人都说,混合云/多云是未来。IDC曾预测,2018年,85%以上的大型企业都将采用混合云。RightScale发...
日期:04-18
易查分—用微信做自己的考试成绩查询系统
近来,各地区教育部门相继下发规定,为了保护学生自尊心,明令禁止各个学校公开张榜学生的成绩排名...
日期:04-18
QuestMobile APP用户精细化运营“三大法宝”:拉新、促活、搏回流,看看淘集集、全民小视频、网易云音乐是怎么做的
红利结束之后移动互联网如何搞的问题,其中,打通巨头流量、全渠道流量之外,精细化运营是重中之重...
日期:04-16
腾讯安全预警:3700余台SQL服务器被控制 威胁企业数据安全
4月4日中午前后,小刘像往常一样,照例检查公司网络系统和相关配置工作,当观看总控系统时,发现专...
日期:04-15
临近升级,BCH的开发者和爱好者们都在做什么?
开发者们推出了客户端的更新版本
  临近BCH 5月份硬分叉升级,Bitcoin ABC开发组在本周...
日期:04-12
愚人节防骗手册待查收,小心“整蛊玩笑”变电信网络诈骗
一年一度的愚人节到了,朋友同事之间开启了“整人”较量。愚人节是从19世纪开始在西方兴...
日期:04-01
重大安装Bug  微软撤回Windows 10 19H1慢速预览版18362
3月27日消息 3月23日,Windows 10 19H1预览版18362系统更新开始面向慢速预览通道推送,这意味着Wind...
日期:03-27
微软Outlook iOS v3.15正式版更新:全新Office 365图标  都能用上了
3月20日消息 先前微软推送了iOS版Outlook App客户端的测试版,带来了全新设计的新图标,其风格和Off...
日期:03-20
微软新决定:Windows 10家庭版允许用户暂停更新35天
3月14日消息 微软几乎完成了Windows 10 v1903版本,并计划在4月份某个时候推出。本次更新带来了不少...
日期:03-14
Win10能以镜像屏方式直接操控安卓手机了
对于把手机镜像投射到电脑上这个点子,你感觉如何?
日期:03-13
Apex英雄加速器推荐奇游 终身卡免费领倒计时最后一天
从《绝地求生大逃杀》到《堡垒之夜》再到如今的《Apex英雄》,一年又一年大逃杀游戏还是活跃在大家...
日期:03-10
Windows 10设备超过8亿  微软近15%的收入来自Windows
3月8日消息 微软高管Yusuf Mehdi在推特上宣布,微软Windows 10已经在8亿多台设备上。这一数字高于9...
日期:03-08
Android Q还没正式发布,已经被开发者Root了
谷歌Google I/O 2019开发者大会已经定档5月7日到9日,届时最新版的安卓系统Android Q将会正式亮相。...
日期:03-04