您的位置:首页>>电脑软件

如何用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

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


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

本文评论
《沉睡魔咒2》与朱莉再续前缘,腾讯手机管家提醒勿下山寨病毒软件
当魔法力量与人类欲望相互碰撞,受人尊重的女王化身毁灭使者,邪恶女巫成为守护一方和平的卫士。迪士...
日期:10-18
Windows 10 Build 19002发布:蓝牙配对优化向快速通道成员开放
10月18日消息 微软今天面向Windows Insider快速通道的用户发布了20H1的最新预览版系统更新,内部版...
日期:10-18
Ubuntu 20.04 LTS代号“Focal Fossa”,明年4月正式发布
Ubuntu 19.10“Eoan Ermine”刚刚发布,20.04版本也已开始亮相。仍然遵循英文字母顺序的...
日期:10-18
金山文档上线“跨表引用”,在线文档分水岭渐显
作为一款专业在线协作文档工具,金山WPS旗下的金山文档日前上线了“跨表格引用数据”功能...
日期:10-17
这两个实用的WPS功能,让PPT制作更轻松
不管是学校里的学生,还是职场的上班族,大部分会选择WPS作为处理办公文档的软件。为了能满足大家日...
日期:10-17
预警!永恒之蓝下载器木马新增BlueKeep漏洞检测代码,未修复比例高达近30%
近日,腾讯安全御见威胁情报中心监测发现,“永恒之蓝下载器”木马再次更新,新增了BlueK...
日期:10-17
微软Windows 10计算器更新:全面支持三角学、 函数(f)
10月16日消息 Windows 10系统内置了一款计算器,也可以从应用商店下载,并且具有一些专用于更高级工...
日期:10-16
谷歌Chrome浏览器测试新功能:解决爱吃内存问题
10月15日消息 谷歌Chrome浏览器是Windows上占用资源最多的应用程序之一,如果安装扩展程序或打开过...
日期:10-15
Safari浏览器欺诈网站警告功能引发用户隐私担忧
有用户发现,在苹果的Safari的隐私条款中有一个特别的条款。叫做 Fraudulent Webstie Warning ,欺...
日期:10-14
Mac终于和iTunes说再见了 那Windows用户呢?
macOS Catalina 的发布可能会减少 Mac iTunes 用户对苹果著名的臃肿的媒体管理和播放应用程序的抱怨...
日期:10-14
微软Windows 10更新助手存漏洞:黑客可执行系统级权限代码
10月12日消息 据外媒报道,Microsoft Windows 10 Update Assistant(微软Win 10更新助手)中的一个安...
日期:10-12
《中国机长》等国庆档大片叫座,手机观影当心中招木马病毒
“我和我的祖国,一刻也不能分割,无论我走到哪里,都流出一首赞歌……”王菲翻...
日期:10-12
PS和LR在苹果macOS Catalina上出现“兼容性问题”
macOS Catalina正式版已经推出多日,但如果你是PhotoShop和Lightroom的重度用户的话,建议你暂时不...
日期:10-09
删除的微信聊天记录怎么恢复?专业软件让恢复变得轻而易举
如果未来的某一天,我很不不幸的遭遇了车祸或者是其他意外,那我一定一定是不愿意死的,因为&hellip...
日期:10-08
苹果手机微信聊天记录怎么彻底删除?左滑删除只是掩耳盗铃!
苹果手机微信聊天记录怎么彻底删除?这个月苹果官网又推出新款手机苹果iPhone11Pro,很多土豪小伙伴...
日期:09-30
淘集集可以提现吗?如何提现?
随着越来越多人用淘集集app进行购物,也听说了淘集集购物返红包,甚至可以直接体现,这是真的吗?要怎么...
日期:09-29
如何用智能电视观看网盘内容?当贝市场一招搞定
智能电视上的视频内容很多时候无法满足我们用户需求,这时应该怎么办?当贝小编今天就给大家解答一下...
日期:09-29
Windows 10补丁KB4517210发布,升级1903版本更顺畅了
9月29日消息 Windows 10版本1903(2019年5月更新)正式准备进行大规模部署推送,并且微软现在正在推出...
日期:09-29
Mozilla的Firefox Nightly不再对TLS 1.0和TLS 1.1提供支持
Mozilla在最新的Firefox Nightly版本中已不再对TLS 1.0和TLS 1.1加密协议提供支持。此举是继苹果、...
日期:09-29
腾讯安全:IE浏览器曝远程执行代码漏洞 腾讯安全强势推出漏洞修复工具
近日,微软发布一例远程执行代码漏洞(CVE-2019-1367)漏洞修复补丁,攻击者可利用网页挂马和邮件进行...
日期:09-27
  专栏介绍
王涵 的专栏
王涵发表的文章
积分:
自我介绍 :