Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
af335da0
P
Paddle
项目概览
PaddlePaddle
/
Paddle
大约 1 年 前同步成功
通知
2299
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
af335da0
编写于
11月 17, 2016
作者:
T
tianbingsz
提交者:
GitHub
11月 17, 2016
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update index.md
上级
d980c264
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
18 addition
and
18 deletion
+18
-18
doc_cn/introduction/index.md
doc_cn/introduction/index.md
+18
-18
未找到文件。
doc_cn/introduction/index.md
浏览文件 @
af335da0
# 简介
PaddlePaddle
是起源于百度的开源深度学习平台。它是简单易用的:你可以通过简单的十数行配置搭建经典的神经网络模型;它也是高效强大的:PaddlePaddle可以支撑复杂集群环境下超大模型的训练,令你受益于深度学习的前沿成果。
在百度内部,已经有大量产品线使用了基于PaddlePaddle的深度学习技术。
PaddlePaddle
源于百度的开源深度学习平台,有如下几个特点。首先,简单易用的:用户可以通过简单的十几行配置脚本搭建经典的神经网络模型。其次,高效强大的:PaddlePaddle可以支撑复杂集群环境下超大模型的训练,令你受益于深度学习的前沿成果。最后,
在百度内部,已经有大量产品线使用了基于PaddlePaddle的深度学习技术。
这份简短的介绍将像你展示如何利用PaddlePaddle
解决一个经典的
学习问题。
这份简短的介绍将像你展示如何利用PaddlePaddle
来解决一个经典的机器
学习问题。
## 1. 一个经典的任务
让我们从一个基础问题开始:
<a
href=
"https://www.baidu.com/s?wd=单变量线性回归"
>
单变量的线性回归
</a>
。问题假定观测到了一批二维空间上的点
`(x, y) `
,并且已知
`x`
和
`y`
之间存在着某种线性关系,我们的目标是通过观测数据
还原这个线性关系。作为一个简单基础的模型,线性回归却有着广泛的应用场景。比如可以想象一个资产定价的简化场景,其中
`x`
对应于房屋的大小,
`y`
对应于房屋价格。我们可以通过观察市场上房屋的情况获得二者之间的关系,从而为新房屋的定价提供
参考。
让我们从一个基础问题开始:
<a
href=
"https://www.baidu.com/s?wd=单变量线性回归"
>
单变量的线性回归
</a>
。问题假定观测到了一批二维空间上的点
`(x, y) `
,并且已知
`x`
和
`y`
之间存在着某种线性关系,我们的目标是通过观测数据
来学习这个线性关系。作为一个简单基础的模型,线性回归有着广泛的应用场景。以一个资产定价的问题为例,
`x`
对应于房屋的大小,
`y`
对应于房屋价格。我们可以通过观察市场上房屋销售的情况拟合
`x`
和
`y`
之间的关系,从而为新房屋的定价提供预测和
参考。
## 2. 准备数据
假设变量
`X`
和
`Y`
的真实关系为:
`Y = 2X + 0.3`
,这里展示如何使用观测数据
还原这一线性关系。如下Python代码将随机产生2000个观测点,它们将被用作
PaddlePaddle的输入。产生PaddlePaddle的输入数据和写一段普通的Python脚本几乎一样,你唯一需要增加的就是定义输入数据的类型。
假设变量
`X`
和
`Y`
的真实关系为:
`Y = 2X + 0.3`
,这里展示如何使用观测数据
来拟合这一线性关系。首先,Python代码将随机产生2000个观测点,作为
PaddlePaddle的输入。产生PaddlePaddle的输入数据和写一段普通的Python脚本几乎一样,你唯一需要增加的就是定义输入数据的类型。
```
python
# -*- coding:utf-8 -*-
...
...
@@ -29,7 +29,7 @@ def process(settings, input_file):
## 3. 训练模型
为了还原
`Y = 2X + 0.3`
,我们先从一条随机的直线
`Y' = wX + b`
开始,然后利用观测数据调整
`w`
和
`b`
使得
`Y'`
和
`Y`
的差距不断减小,最终趋于
相同
。这个过程就是模型的训练过程,而
`w`
和
`b`
就是模型的参数,即我们的训练目标。
为了还原
`Y = 2X + 0.3`
,我们先从一条随机的直线
`Y' = wX + b`
开始,然后利用观测数据调整
`w`
和
`b`
使得
`Y'`
和
`Y`
的差距不断减小,最终趋于
接近
。这个过程就是模型的训练过程,而
`w`
和
`b`
就是模型的参数,即我们的训练目标。
在PaddlePaddle里,该模型的网络配置如下。
...
...
@@ -50,33 +50,33 @@ settings(batch_size=12, learning_rate=1e-3, learning_method=MomentumOptimizer())
# 3. 神经网络配置
x
=
data_layer
(
name
=
'x'
,
size
=
1
)
y
=
data_layer
(
name
=
'y'
,
size
=
1
)
# 线性计算
单元
: y_predict = wx + b
# 线性计算
网络层
: y_predict = wx + b
y_predict
=
fc_layer
(
input
=
x
,
param_attr
=
ParamAttr
(
name
=
'w'
),
size
=
1
,
act
=
LinearActivation
(),
bias_attr
=
ParamAttr
(
name
=
'b'
))
#
损失计算,度量 y_predict 和真实 y 之间的差距
#
计算误差函数,即 y_predict 和真实 y 之间的距离
cost
=
regression_cost
(
input
=
y_predict
,
label
=
y
)
outputs
(
cost
)
```
这段简短的配置展示了PaddlePaddle的基本用法:
-
首先,
第一部分定义了数据输入。一般情况下,PaddlePaddle先从一个文件列表里获得数据文件地址,然后交给用户自定义的函数(例如上面的
`process`
函数)进行读入和预处理从而得到真实输入。本文中由于输入数据是随机生成的不需要读输入文件,所以放一个空列表(
`empty.list`
)即可。
-
第一部分定义了数据输入。一般情况下,PaddlePaddle先从一个文件列表里获得数据文件地址,然后交给用户自定义的函数(例如上面的
`process`
函数)进行读入和预处理从而得到真实输入。本文中由于输入数据是随机生成的不需要读输入文件,所以放一个空列表(
`empty.list`
)即可。
-
第二部分主要是选择学习算法,它定义了模型参数
如何改变。PaddlePaddle提供了很多优秀的学习算法,但这里使用一个简单的基于momentum的算法就足够了,它每次读取12个数据进行计算和模型
更新。
-
第二部分主要是选择学习算法,它定义了模型参数
改变的规则。PaddlePaddle提供了很多优秀的学习算法,这里使用一个基于momentum的随机梯度下降(SGD)算法,该算法每批量(batch)读取12个采样数据进行随机梯度计算来更新
更新。
-
最后一部分是神经网络的配置。由于PaddlePaddle已经实现了丰富的网络
单元(Layer),所以很多时候你需要做的只是声明正确的网络单元并把它们拼
接起来。这里使用了三种网络单元:
-
**数据层**
:数据层
`data_layer`
是神经网络的入口,它读入数据并将它们传输到
下游的其它单元
。这里数据层有两个,分别对应于变量
`X`
和
`Y`
。
-
**全连接层**
:全连接层
`fc_layer`
是基础的计算单元,这里利用它建模变量之间的线性关系。计算单元是神经网络的核心,PaddlePaddle支持大量的计算单元和任意深度的网络连接,从而可以
挖掘
复杂的数据关系。
-
**回归
损失层**
:回归损失层
`regression_cost`
是众多损失函数层的一种,它们在训练过程作为网络的出口,用来计算模型的表现,并指导模型参数的改变
。
-
最后一部分是神经网络的配置。由于PaddlePaddle已经实现了丰富的网络
层,所以很多时候你需要做的只是定义正确的网络层并把它们连
接起来。这里使用了三种网络单元:
-
**数据层**
:数据层
`data_layer`
是神经网络的入口,它读入数据并将它们传输到
接下来的网络层
。这里数据层有两个,分别对应于变量
`X`
和
`Y`
。
-
**全连接层**
:全连接层
`fc_layer`
是基础的计算单元,这里利用它建模变量之间的线性关系。计算单元是神经网络的核心,PaddlePaddle支持大量的计算单元和任意深度的网络连接,从而可以
拟合任意的函数来学习
复杂的数据关系。
-
**回归
误差代价层**
:回归误差代价层
`regression_cost`
是众多误差代价函数层的一种,它们在训练过程作为网络的出口,用来计算模型的误差,是模型参数优化的目标函数
。
这样定义了网络结构并保存为
`trainer_config.py`
之后,运行训练命令即可
:
定义了网络结构并保存为
`trainer_config.py`
之后,运行以下训练命令
:
```
paddle train --config=trainer_config.py --save_dir=./output --num_passes=30
```
PaddlePaddle将在观测数据集上迭代训练30轮,并将每轮的模型结果存放在
`./output`
路径下。从输出日志可以看到,随着轮数增加
损失函数的输出在不断的减小,这意味着模型在
不断的改进,直到逼近真实解:
` Y = 2X + 0.3 `
PaddlePaddle将在观测数据集上迭代训练30轮,并将每轮的模型结果存放在
`./output`
路径下。从输出日志可以看到,随着轮数增加
误差代价函数的输出在不断的减小,这意味着模型在训练数据上
不断的改进,直到逼近真实解:
` Y = 2X + 0.3 `
## 4. 模型检验
训练完成后,我们希望能够检验模型的好坏。一种常用的做法是用
模型对另外一组数据进行预测,然后评价预测的效果。但
在这个例子中,由于已经知道了真实答案,我们可以直接观察模型的参数是否符合预期来进行检验。
训练完成后,我们希望能够检验模型的好坏。一种常用的做法是用
学习的模型对另外一组测试数据进行预测,评价预测的效果。
在这个例子中,由于已经知道了真实答案,我们可以直接观察模型的参数是否符合预期来进行检验。
PaddlePaddle将每个模型参数作为一个numpy数组单独存为一个文件,所以可以利用如下方法读取模型的参数。
...
...
@@ -94,9 +94,9 @@ print 'w=%.6f, b=%.6f' % (load('output/pass-00029/w'), load('output/pass-00029/b
```
<center>
!
[](
./parameters.png
)
</center>
从图中可以看到,虽然
`w`
和
`b`
都使用随机值初始化,但在起初的几轮训练中它们都在快速逼近真实值,并且后续仍在不断改进,使得最终得到的模型几乎与真实模型
重合
。
从图中可以看到,虽然
`w`
和
`b`
都使用随机值初始化,但在起初的几轮训练中它们都在快速逼近真实值,并且后续仍在不断改进,使得最终得到的模型几乎与真实模型
一致
。
这样,我们
就完成了对单变量线性回归问题的解决:将数据输入PaddlePaddle,训练模型,最后验证结果
。
这样,我们
用PaddlePaddle解决了单变量线性回归问题, 包括数据输入,模型训练和最后的结果验证
。
## 5. 推荐后续阅读
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录