新手第四课-PaddlePaddle快速入门

文章目录

  • 新手第四课-PaddlePaddle快速入门
    • PaddlePaddle基础命令
      • 计算常量的加法:1+1
      • 计算变量的加法:1+1
    • 使用PaddlePaddle做线性回归

PaddlePaddle基础命令

PaddlePaddle是百度开源的深度学习框架,类似的深度学习框架还有谷歌的 Tensorflow、Facebook的 Pytorch等,在入门深度学习时,学会并使用一门常见的框架,可以让学习效率大大提升。

在 PaddlePaddle中,计算的对象是张量,我们可以先使用PaddlePaddle来计算一个[[1, 1], [1, 1]] * [[1, 1], [1, 1]]。

计算常量的加法:1+1

首先导入 PaddlePaddle库

import paddle.fluid as fluid

定义两个张量的常量x1和x2,并指定它们的形状是[2, 2],并赋值为1铺满整个张量,类型为int64.

# 定义两个张量
x1 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')
x2 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')

接着定义一个操作,该计算是将上面两个张量进行加法计算,并返回一个求和的算子。PaddlePaddle提供了大量的操作,比如加减乘除、三角函数等,读者可以在 fluid.layers找到。

# 将两个张量求和
y1 = fluid.layers.sum(x=[x1, x2])

然后创建一个解释器,可以在这里指定计算使用CPU或GPU。当使用CPUPlace()时使用的是CPU,如果是CUDAPlace()使用的是GPU。解析器是之后使用它来进行计算过的,比如在执行计算之前我们要先执行参数初始化的program也是要使用到解析器的,因为只有解析器才能执行program。

# 创建一个使用CPU的解释器
place = fluid.CPUPlace()
exe = fluid.executor.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())

最后执行计算,program的参数值是主程序,不是上一步使用的是初始化参数的程序,program默认一共有两个,分别是default_startup_program()和default_main_program()。fetch_list参数的值是在解析器在run之后要输出的值,我们要输出计算加法之后输出结果值。最后计算得到的也是一个张量。

# 进行运算,并把y的结果输出
result = exe.run(program=fluid.default_main_program(),fetch_list=[y1])
print(result)

计算结果为:[array([[2, 2], [2, 2]])]

计算变量的加法:1+1

上面计算的是张量常量的1+1,并不能随意修改常量的值,所以下面我们要编写一个使用张量变量作为乘数的程序,类似是一个占位符,等到将要计算时,再把要计算的值添加到占位符中进行计算。

导入PaddlePaddle库和numpy的库。

import paddle.fluid as fluid
import numpy as np

定义两个张量,并不指定该张量的形状和值,它们是之后动态赋值的。这里只是指定它们的类型和名字,这个名字是我们之后赋值的关键。

# 定义两个张量
a = fluid.layers.create_tensor(dtype='int64', name='a')
b = fluid.layers.create_tensor(dtype='int64', name='b')

使用同样的方式,定义这个两个张量的加法操作。

# 将两个张量求和
y = fluid.layers.sum(x=[a, b])

这里我们同样是创建一个使用CPU的解析器,和进行参数初始化。

# 创建一个使用CPU的解释器
place = fluid.CPUPlace()
exe = fluid.executor.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())

然后使用numpy创建两个张量值,之后我们要计算的就是这两个值。

# 定义两个要计算的变量
a1 = np.array([3, 2]).astype('int64')
b1 = np.array([1, 1]).astype('int64')

这次exe.run()的参数有点不一样了,多了一个feed参数,这个就是要对张量变量进行赋值的。赋值的方式是使用了键值对的格式,key是定义张量变量是指定的名称,value就是要传递的值。在fetch_list参数中,笔者希望把a, b, y的值都输出来,所以要使用3个变量来接受返回值。

# 进行运算,并把y的结果输出
out_a, out_b, result = exe.run(program=fluid.default_main_program(),feed={'a': a1, 'b': b1},fetch_list=[a, b, y])
print(out_a, " + ", out_b," = ", result)

计算结果为:[3 2] + [1 1] = [4 3]

使用PaddlePaddle做线性回归

在上面的教学中,教大家学会用PaddlePaddle做基本的算子运算,下面来教大家如何用PaddlePaddle来做简单的线性回归,包括从定义网络到使用自定义的数据进行训练,最后验证我们网络的预测能力。

首先导入PaddlePaddle库和一些工具类库。

import paddle.fluid as fluid
import paddle
import numpy as np

定义一个简单的线性网络,这个网络非常简单,结构是:输出层–>>隐层–>>输出层__,这个网络一共有2层,因为输入层不算网络的层数。更具体的就是一个大小为100,激活函数是ReLU的全连接层和一个输出大小为1的全连接层,就这样构建了一个非常简单的网络。这里使用输入fluid.layers.data()定义的输入层类似fluid.layers.create_tensor(),也是有name属性,之后也是根据这个属性来填充数据的。这里定义输入层的形状为13,这是因为波士顿房价数据集的每条数据有13个属性,我们之后自定义的数据集也是为了符合这一个维度。

# 定义一个简单的线性网络
x = fluid.layers.data(name='x', shape=[13], dtype='float32')
hidden = fluid.layers.fc(input=x, size=100, act='relu')
net = fluid.layers.fc(input=hidden, size=1, act=None)

接着定义神经网络的损失函数,这里同样使用了fluid.layers.data()这个接口,这个可以理解为数据对应的结果,上面name为x的fluid.layers.data()为属性数据。这里使用了平方差损失函数(square_error_cost),PaddlePaddle提供了很多的损失函数的接口,比如交叉熵损失函数(cross_entropy)。因为本项目是一个线性回归任务,所以我们使用的是平方差损失函数。因为fluid.layers.square_error_cost()求的是一个Batch的损失值,所以我们还要对他求一个平均值。

# 定义损失函数
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
cost = fluid.layers.square_error_cost(input=net, label=y)
avg_cost = fluid.layers.mean(cost)

定义损失函数之后,可以在主程序(fluid.default_main_program)中克隆一个程序作为预测程序,用于训练完成之后使用这个预测程序进行预测数据。这个定义的顺序不能错,因为我们定义的网络结构,损失函数等等都是更加顺序记录到PaddlePaddle的主程序中的。主程序定义了神经网络模型,前向反向计算,以及优化算法对网络中可学习参数的更新,是我们整个程序的核心,这个是PaddlePaddle已经帮我们实现的了,我们只需注重网络的构建和训练即可。

# 复制一个主程序,方便之后使用
test_program = fluid.default_main_program().clone(for_test=True)

接着是定义训练使用的优化方法,这里使用的是随机梯度下降优化方法。PaddlePaddle提供了大量的优化函数接口,除了本项目使用的随机梯度下降法(SGD),还有Momentum、Adagrad、Adagrad等等,读者可以更加自己项目的需求使用不同的优化方法。

# 定义优化方法
optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.01)
opts = optimizer.minimize(avg_cost)

然后是创建一个解析器,我们同样是使用CPU来进行训练。创建解析器之后,使用解析器来执行fluid.default_startup_program()初始化参数。

# 创建一个使用CPU的解释器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())

我们使用numpy定义一组数据,这组数据的每一条数据有13个,这是因为我们在定义网络的输入层时,shape是13,但是每条数据的后面12个数据是没意义的,因为笔者全部都是使用0来填充,纯粹是为了符合数据的格式而已。这组数据是符合y = 2 * x + 1,但是程序是不知道的,我们之后使用这组数据进行训练,看看强大的神经网络是否能够训练出一个拟合这个函数的模型。最后定义了一个预测数据,是在训练完成,使用这个数据作为x输入,看是否能够预测于正确值相近结果。

# 定义训练和测试数据
x_data = np.array([[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype('float32')
test_data = np.array([[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')

定义数据之后,我们就可以使用数据进行训练了。我们这次训练了10个pass,读者可根据情况设置更多的训练轮数,通常来说训练的次数越多,模型收敛的越好。同样我们使用的时profram是fluid.default_main_program(),feed中是在训练时把数据传入fluid.layers.data()定义的变量中,及那个键值对的key对用的就是fluid.layers.data()中的name的值。我们让训练过程中输出avg_cost的值。

在训练过程中,我们可以看到输出的损失值在不断减小,证明我们的模型在不断收敛。

# 开始训练10个passfor pass_id in range(10):train_cost = exe.run(program=fluid.default_main_program(),feed={'x': x_data, 'y': y_data},fetch_list=[avg_cost])print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0]))

训练完成之后,我们使用上面克隆主程序得到的预测程序了预测我们刚才定义的预测数据。预测数据同样作为x在feed输入,在预测时,理论上是不用输入y的,但是要符合输入格式,我们模拟一个y的数据值,这个值并不会影响我们的预测结果。fetch_list的值,也就是我们执行预测之后要输出的结果,这是网络的最后一层,而不是平均损失函数(avg_cost),因为我们是想要预测程序输出预测结果。根据我们上面定义数据时,满足规律y = 2 * x + 1,所以当x为6时,y应该时13,最后输出的结果也是应该接近13的。

# 开始预测
result = exe.run(program=test_program,feed={'x': test_data, 'y': np.array([[0.0]]).astype('float32')},fetch_list=[net])
print("当x为6.0时,y为:%0.5f" % result[0][0][0])

预测结果:当x为6.0时,y为:13.23625

新手第四课-PaddlePaddle快速入门相关推荐

  1. python(十四)--Django学习快速入门

    Django学习快速入门 1. 预备知识 1.1 什么是http协议 1.2 MVC模式和MTV模式 1.2.1 MVC 模式 1.2.2 MTV 模式 2. Django框架介绍 2.1 什么是框架 ...

  2. 新手初学Regular Expression正则表达式--快速入门

    看一段英文视频,本来想着学些Natural Language Processing,看完发现原来这就是正则表达式呀,顿感简单呀.所以不要认为什么事情难,去做,去行动吧.不过,我知道对于正则表达式,我还 ...

  3. spark教程python案例_Spark实战(四)spark+python快速入门实战小例子(PySpark)

    由于目前很多spark程序资料都是用scala语言写的,但是现在需要用python来实现,于是在网上找了scala写的例子改为python实现 1.集群测试实例 代码如下: from pyspark. ...

  4. 【仿真建模】第四课:AnyLogic入门基础课程 - 轨道交通仿真入门讲解

    文章目录 一.轨道库的概念和特点 二.轨道交通仿真 三.更换车头和车身样式 一.轨道库的概念和特点 二.轨道交通仿真 新建模型 搭建轨道 定义轨道上的起点和终点 拖拽出一个trainSource,设置 ...

  5. 想成为淘宝美工需要学什么?零基础怎么快速入门?

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 想成为淘宝美工需要学什么?零基础怎么快速入门?最近就有不少小伙伴私信小编,大多是问淘宝美工需要掌握哪些知识?新手要如 ...

  6. 快速入门 Python 数据分析实用指南

    Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一.那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习 ...

  7. JAVA框架——struts(一)struts快速入门,struts访问流程,struts配置文件详解,动态方法调用

    一. Struts2框架概述 是一种基于MVC模式的轻量级web框架.本质是一个Servlet.作为控制器建立模型与视图的数据交互.Struts2以WebWord为核心,采用拦截器的机制处理客户的请求 ...

  8. 新手必备pr 2021快速入门教程「四」新建序列及参数设置

    PR2021快速入门教程,学完之后,制作抖音视频,vlog,电影混剪,日常记录等不在话下!零基础,欢迎入坑! 本节内容 新建序列功能是Premiere中的一个常用功能,目的是为了确定视频的尺寸和帧率质 ...

  9. 基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)

    文章目录 前言 1.设计创建数据库表tbl_book 2.创建新的SpringBoot模块,勾选相关依赖 3. 添加SpringBoot创建项目时没有提供的相关坐标 4.根据数据库表创建实体类Book ...

最新文章

  1. 嵌入式Linux入门经典笔记
  2. 广播的最佳实践——实现强制下线功能(Android_Broadcast)...
  3. IDEA_Spring Data JPA有关报错Cannot resolve table 'XXX'
  4. ipad如何连接电脑_ipad如何将电脑文件下载到本地?
  5. C#程序只允许运行一个实例的解决方案
  6. centos6.x redhat6.x 升级openssh8.7
  7. WinServer2012 R2忘记密码的解决方案+远程连接另一种莫名其妙故障
  8. 视频时帧率达到15,人眼就感觉是连续的
  9. GoLang爬取花瓣网美女图片
  10. ActiveMQ下载、安装、启动
  11. 革命三部曲系列——《邪不压正》中,究竟布了多大的一个局!
  12. C# 给PowerPoint文档设置背景颜色和背景图片
  13. MediaFormat api详解
  14. 多线程编程模式之Thread-Specific Storage模式
  15. RRT、RRTConnect、RRT*——Matlab算法
  16. android 忘记密码代码,Android-忘记签名文件的密码怎么办
  17. 干支纪年法简便算法_初中阶段常用的四种历史纪年法
  18. C语言视频教程-谭浩强版-小甲鱼主讲—P18
  19. Windows服务器C盘越来越大的原因
  20. ionic知识系列:Could not remove dir ‘/data/data/io.ionic.starter/code_cache/.ll/‘

热门文章

  1. Service Mesh 实践指南:从单体应用到 Service Mesh 的曲折历程
  2. Spring Cloud构建微服务架构(五)服务网关
  3. Java 基础之 Random类和Math.random()方法
  4. Android --- android中Invalidate和postInvalidate的区别
  5. r语言 断轴 画图_R 绘图 – 函数曲线图 | 菜鸟教程
  6. 数据中心节能专题—他山之石可以攻玉
  7. 使用 做签名的post_java组件HuTool相关工具类的使用(五)
  8. cartographer坐标系_cartographer 调参(1)-lua文件配置参考文档
  9. NLP:Transformer的架构详解之详细攻略(持续更新)
  10. ML之NB:利用朴素贝叶斯NB算法(TfidfVectorizer+不去除停用词)对20类新闻文本数据集进行分类预测、评估