Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wzpei9
Paddle
提交
af335da0
P
Paddle
项目概览
wzpei9
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录