Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
FluidDoc
提交
58e5553e
F
FluidDoc
项目概览
PaddlePaddle
/
FluidDoc
通知
5
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
23
列表
看板
标记
里程碑
合并请求
111
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FluidDoc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
23
Issue
23
列表
看板
标记
里程碑
合并请求
111
合并请求
111
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
58e5553e
编写于
10月 26, 2018
作者:
J
JiabinYang
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' of
https://github.com/PaddlePaddle/FluidDoc
into add_api_guide_pool
上级
9fc8f764
40fe09fc
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
442 addition
and
30 deletion
+442
-30
doc/fluid/api/api_guides/high_low_level_api.md
doc/fluid/api/api_guides/high_low_level_api.md
+0
-0
doc/fluid/api/api_guides/index.rst
doc/fluid/api/api_guides/index.rst
+1
-0
doc/fluid/api/api_guides/low_level/executor.rst
doc/fluid/api/api_guides/low_level/executor.rst
+20
-0
doc/fluid/api/api_guides/low_level/inference.rst
doc/fluid/api/api_guides/low_level/inference.rst
+55
-0
doc/fluid/api/api_guides/low_level/layers/conv.rst
doc/fluid/api/api_guides/low_level/layers/conv.rst
+64
-0
doc/fluid/api/api_guides/low_level/layers/index.rst
doc/fluid/api/api_guides/low_level/layers/index.rst
+7
-0
doc/fluid/api/api_guides/low_level/optimizer.rst
doc/fluid/api/api_guides/low_level/optimizer.rst
+12
-26
doc/fluid/api/index_en.rst
doc/fluid/api/index_en.rst
+1
-0
doc/fluid/api_guides/low_level/layers/io.rst
doc/fluid/api_guides/low_level/layers/io.rst
+28
-0
doc/fluid/beginners_guide/install/Tables.md
doc/fluid/beginners_guide/install/Tables.md
+1
-1
doc/fluid/beginners_guide/install/install_MacOS.md
doc/fluid/beginners_guide/install/install_MacOS.md
+3
-3
doc/fluid/user_guides/howto/prepare_data/index.rst
doc/fluid/user_guides/howto/prepare_data/index.rst
+11
-0
doc/fluid/user_guides/howto/prepare_data/lod_tensor.md
doc/fluid/user_guides/howto/prepare_data/lod_tensor.md
+239
-0
未找到文件。
doc/fluid/api_guides/high_low_level_api.md
→
doc/fluid/api
/api
_guides/high_low_level_api.md
浏览文件 @
58e5553e
文件已移动
doc/fluid/api
_guides/index_cn
.rst
→
doc/fluid/api
/api_guides/index
.rst
浏览文件 @
58e5553e
...
...
@@ -7,3 +7,4 @@ API Guide
:maxdepth: 1
high_low_level_api.md
low_level/inference.rst
doc/fluid/api/api_guides/low_level/executor.rst
0 → 100644
浏览文件 @
58e5553e
.. _api_guide_executor:
########
Executor
########
:code:`Executor` 即 :code:`执行器` 。PaddlePaddle Fluid中有两种执行器可以选择。
:code:`Executor` 实现了一个简易的执行器,所有Operator会被顺序执行。用户可以使用
Python脚本驱动 :code:`Executor` 执行。默认情况下 :code:`Executor` 是单线程的,如果
想使用数据并行,请参考另一个执行器, :ref:`api_guide_parallel_executor` 。
:code:`Executor` 的代码逻辑非常简单。建议用户在调试过程中,先使用
:code:`Executor` 跑通模型,再切换到多设备计算,甚至多机计算。
:code:`Executor` 在构造的时候接受一个 :code:`Place`, 它们可以是 :ref:`api_fluid_CPUPlace`
或 :ref:`api_fluid_CUDAPlace` 。 :code:`Executor` 在执行的时候可以选择执行的
:ref:`api_guide_low_level_program` 。
简单的使用方法,请参考 `quick_start_fit_a_line <../../beginners_guide/quick_start/fit_a_line/README.cn.html>`_ , API Reference 请参考
:ref:`api_fluid_Executor` 。
doc/fluid/api/api_guides/low_level/inference.rst
0 → 100644
浏览文件 @
58e5553e
.. _api_guide_inference:
#########
预测引擎
#########
预测引擎提供了存储预测模型 :code:`fluid.io.save_inference_model` 和加载预测模型 :code:`fluid.io.load_inference_model` 两个接口。
预测模型的存储格式
=================
预测模型的存储格式有两种,由上述两个接口中的 :code:`model_filename` 和 :code:`params_filename` 变量控制:
- 参数保存到各个独立的文件,如设置 :code:`model_filename` 为 :code:`None` 、:code:`params_filename` 为 :code:`None`
.. code-block:: bash
ls recognize_digits_conv.inference.model/*
__model__ conv2d_1.w_0 conv2d_2.w_0 fc_1.w_0 conv2d_1.b_0 conv2d_2.b_0 fc_1.b_0
- 参数保存到同一个文件,如设置 :code:`model_filename` 为 :code:`None` 、:code:`params_filename` 为 :code:`__params__`
.. code-block:: bash
ls recognize_digits_conv.inference.model/*
__model__ __params__
存储预测模型
===========
.. code-block:: python
exe = fluid.Executor(fluid.CPUPlace())
path = "./infer_model"
fluid.io.save_inference_model(dirname=path, feeded_var_names=['img'],
target_vars=[predict_var], executor=exe)
在这个示例中,:code:`fluid.io.save_inference_model` 接口对默认的 :code:`fluid.Program` 进行裁剪,只保留预测 :code:`predict_var` 所需部分。
裁剪后的 :code:`program` 会保存在 :code:`./infer_model/__model__` 下,参数会保存到 :code:`./infer_model` 下的各个独立文件。
加载预测模型
===========
.. code-block:: python
exe = fluid.Executor(fluid.CPUPlace())
path = "./infer_model"
[inference_program, feed_target_names, fetch_targets] =
fluid.io.load_inference_model(dirname=path, executor=exe)
results = exe.run(inference_program,
feed={feed_target_names[0]: tensor_img},
fetch_list=fetch_targets)
在这个示例中,首先调用 :code:`fluid.io.load_inference_model` 接口,获得预测的 :code:`program` 、输入数据的 :code:`variable` 名称和输出结果的 :code:`variable` ;
然后调用 :code:`executor` 执行预测的 :code:`program` 获得预测结果。
doc/fluid/api/api_guides/low_level/layers/conv.rst
0 → 100644
浏览文件 @
58e5553e
.. _api_guide_conv:
#####
卷积
#####
卷积有两组输入:特征图和卷积核,依据输入特征和卷积核的形状、Layout不同、计算方式的不同,在Fluid里,有针对变长序列特征的一维卷积,有针对定长图像特征的二维(2D Conv)、三维卷积(3D Conv),同时也有卷积计算的逆向过程,下面先介绍Fluid里的2D/3D卷积,再来介绍序列卷积。
2D/3D卷积
==============
1. 卷积输入参数:
---------------------
卷积需要依据滑动步长(stride)、填充长度(padding)、卷积核窗口大小(filter size)、分组数(groups)、扩张系数(dilation rate)来决定如何计算。groups最早在 `AlexNet <https://www.nvidia.cn/content/tesla/pdf/machine-learning/imagenet-classification-with-deep-convolutional-nn.pdf>`_ 中引入, 可以理解为将原始的卷积分为独立若干组卷积计算。
**注意**: 同cuDNN的方式,Fluid目前只支持在特征图上下填充相同的长度,左右也是。
- 输入输出Layout:
2D卷积输入特征的Layout为[N, C, H, W]或[N, H, W, C], N即batch size,C是通道数,H、W是特征的高度和宽度,输出特征和输入特征的Layout一致。(相应的3D卷积输入特征的Layout为[N, C, D, H, W]或[N, D, H, W, C],但**注意**,Fluid的卷积当前只支持[N, C, H, W],[N, C, D, H, W]。)
- 卷积核的Layout:
Fluid中2D卷积的卷积核(也称权重)的Layout为[C_o, C_in / groups, f_h, f_w],C_o、C_in表示输出、输入通道数,f_h、f_w表示卷积核窗口的高度和宽度,按行序存储。(相应的2D卷积的卷积核Layout为[C_o, C_in / groups, f_d, f_h, d_w],同样按行序存储。)
- 深度可分离卷积(depthwise separable convolution):
在深度可分离卷积中包括depthwise convolution和pointwise convolution两组,这两个卷积的接口和上述普通卷积接口相同。前者可以通过给普通卷积设置groups来做,后者通过设置卷积核filters的大小为1x1,深度可分离卷积减少参数的同时减少了计算量。
对于depthwise convolution,可以设置groups等于输入通道数,此时,2D卷积的卷积核形状为[C_o, 1, f_h, f_w]。
对于pointwise convolution,卷积核的形状为[C_o, C_in, 1, 1]。
**注意**:Fluid针对depthwise convolution的GPU计算做了高度优化,您可以通过在:code:`fluid.layers.conv2d`接口设置:code:`use_cudnn=False`来使用Fluid自身优化的CUDA程序。
- 空洞卷积(dilated convolution):
空洞卷积相比普通卷积而言,卷积核在特征图上取值时不在连续,而是间隔的,这个间隔数称作dilation,等于1时,即为普通卷积,空洞卷积相比普通卷积的感受野更大。
- API汇总:
- :ref:`api_fluid_layers_conv2d`
- :ref:`api_fluid_layers_conv3d`
- :ref:`api_fluid_layers_conv2d_transpose`
- :ref:`api_fluid_layers_conv3d_transpose`
1D序列卷积
==============
Fluid可以表示变长的序列结构,这里的变长是指不同样本的时间步(step)数不一样,通常是一个2D的Tensor和一个能够区分的样本长度的辅助结构来表示。假定,2D的Tensor的形状是shape,shape[0]是所有样本的总时间步数,shape[1]是序列特征的大小。
基于此数据结构的卷积在Fluid里称作序列卷积,也表示一维卷积。同图像卷积,序列卷积的输入参数有卷积核大小、填充大小、滑动步长,但与2D卷积不同的是,这些参数个数都为1。**注意**,目前仅支持stride为1的情况,输出序列的时间步数和输入序列相同。
假如:输入序列形状为(T, N), T即该序列的时间步数,N是序列特征大小;卷积核的上下文步长为K,输出序列长度为M,则卷积核权重形状为(K * N, M),输出序列形状为(T, M)。
另外,参考DeepSpeech,Fluid实现了行卷积row convolution, 或称
`look ahead convolution <http://www.cs.cmu.edu/~dyogatam/papers/wang+etal.iclrworkshop2016.pdf>`_ ,
该卷积相比上述普通序列卷积可以减少参数。
- API汇总:
- :ref:`api_fluid_layers_sequence_conv`
- :ref:`api_fluid_layers_row_conv`
doc/fluid/api/api_guides/low_level/layers/index.rst
0 → 100644
浏览文件 @
58e5553e
=============
fluid.layers
=============
.. toctree::
:maxdepth: 1
\ No newline at end of file
doc/fluid/api
_guides/low_level/optimizer/optimizer_all
.rst
→
doc/fluid/api
/api_guides/low_level/optimizer
.rst
浏览文件 @
58e5553e
...
...
@@ -14,9 +14,8 @@ Optimizer
:code:`SGD` 是实现 `随机梯度下降 <https://arxiv.org/pdf/1609.04747.pdf>`_ 的一个 :code:`Optimizer` 子类,是 `梯度下降 <https://zh.wikipedia.org/zh-hans/梯度下降法>`_ 大类中的一种方法。
当需要训练大量样本的时候,往往选择 :code:`SGD` 来使损失函数更快的收敛。
API Reference 请参考
api_fluid_optimizer_SGDOptimizer_
API Reference 请参考
:ref:`api_fluid_optimizer_SGDOptimizer`
.. _api_fluid_optimizer_SGDOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-8-sgdoptimizer
2.Momentum/MomentumOptimizer
----------------------------
...
...
@@ -26,35 +25,32 @@ API Reference 请参考 api_fluid_optimizer_SGDOptimizer_
<https://arxiv.org/pdf/1609.04747.pdf>`_ 算法和 `Nesterov accelerated gradient(论文4.2节)
<https://arxiv.org/pdf/1609.04747.pdf>`_ 算法。
API Reference 请参考
api_fluid_optimizer_MomentumOptimizer_
API Reference 请参考
:ref:`api_fluid_optimizer_MomentumOptimizer`
.. _api_fluid_optimizer_MomentumOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-9-momentumoptimizer
3. Adagrad/AdagradOptimizer
---------------------------
`Adagrad <http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf>`_ 优化器可以针对不同参数样本数不平均的问题,自适应地为各个参数分配不同的学习率。
API Reference 请参考
api_fluid_optimizer_AdagradOptimizer_
API Reference 请参考
:ref:`api_fluid_optimizer_AdagradOptimizer`
.. _api_fluid_optimizer_AdagradOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-10-adagradoptimizer
4.RMSPropOptimizer
------------------
`RMSProp优化器 <http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf>`_ ,是一种自适应调整学习率的方法,
主要解决使用Adagrad后,模型训练中后期学习率急剧下降的问题。
API Reference 请参考 api_fluid_optimizer_RMSPropOptimizer_
API Reference 请参考 :ref:`api_fluid_optimizer_RMSPropOptimizer`
.. _api_fluid_optimizer_RMSPropOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-14-rmspropoptimizer
5.Adam/AdamOptimizer
--------------------
`Adam <https://arxiv.org/abs/1412.6980>`_ 的优化器是一种自适应调整学习率的方法,
适用于大多非 `凸优化 <https://zh.wikipedia.org/zh/凸優化>`_ 、大数据集和高维空间的场景。在实际应用中,:code:`Adam` 是最为常用的一种优化方法。
API Reference 请参考
api_fluid_optimizer_AdamOptimizer_
API Reference 请参考
:ref:`api_fluid_optimizer_AdamOptimizer`
.. _api_fluid_optimizer_AdamOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-11-adamoptimizer
6.Adamax/AdamaxOptimizer
...
...
@@ -62,9 +58,8 @@ API Reference 请参考 api_fluid_optimizer_AdamOptimizer_
`Adamax <https://arxiv.org/abs/1412.6980>`_ 是 :code:`Adam` 算法的一个变体,对学习率的上限提供了一个更简单的范围,使学习率的边界范围更简单。
API Reference 请参考
api_fluid_optimizer_AdamxOptimizer_
API Reference 请参考
:ref:`api_fluid_optimizer_AdamaxOptimizer`
.. _api_fluid_optimizer_AdamxOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-12-adamaxoptimizer
7.DecayedAdagrad/ DecayedAdagradOptimizer
...
...
@@ -72,9 +67,9 @@ API Reference 请参考 api_fluid_optimizer_AdamxOptimizer_
`DecayedAdagrad <http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf>`_ 优化器,可以看做是引入了衰减速率的 :code:`Adagrad` 算法,解决使用Adagrad后,模型训练中后期学习率急剧下降的问题。
API Reference 请参考 api_fluid_optimizer_DecayedAdagrad_
API Reference 请参考 :ref:`api_fluid_optimizer_DecayedAdagrad`
.. _api_fluid_optimizer_DecayedAdagrad: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-13-decayedadagradoptimizer
8. Ftrl/FtrlOptimizer
...
...
@@ -83,24 +78,15 @@ API Reference 请参考 api_fluid_optimizer_DecayedAdagrad_
`FtrlOptimizer <https://www.eecs.tufts.edu/~dsculley/papers/ad-click-prediction.pdf>`_ 优化器结合了 `FOBOS算法 <https://stanford.edu/~jduchi/projects/DuchiSi09b.pdf>`_ 的高精度与 `RDA算法
<http://www1.se.cuhk.edu.hk/~sqma/SEEM5121_Spring2015/dual-averaging.pdf>`_ 的稀疏性,是目前效果非常好的一种 `Online Learning <https://en.wikipedia.org/wiki/Online_machine_learning>`_ 算法。
API Reference 请参考 api_fluid_optimizer_FtrlOptimizer_
API Reference 请参考 :ref:`api_fluid_optimizer_FtrlOptimizer`
.. _api_fluid_optimizer_FtrlOptimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-15-ftrloptimizer
9.ModelAverage
-----------------
:code:`ModelAverage` 优化器,在训练中通过窗口来累计历史 parameter,在预测时使用取平均值后的paramet,整体提高预测的精度。
API Reference 请参考 api_fluid_optimizer_ModelAverage_
.. _api_fluid_optimizer_ModelAverage: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-17-modelaverage
10.Optimizer
--------------
:code:`Optimizer` 这个类是 :code:`Fluid` 中优化器的基类。它的作用是定义优化器的公共接口,用户通过该类调用上述经典的优化算法。
API Reference 请参考 :ref:`api_fluid_optimizer_ModelAverage`
API Reference 请参考 api_fluid_optimizer_
.. _api_fluid_optimizer: http://www.paddlepaddle.org/docs/0.14.0/api/fluid/en/optimizer.html#permalink-18-optimizer
doc/fluid/api/index_en.rst
浏览文件 @
58e5553e
...
...
@@ -5,6 +5,7 @@ API Reference
.. toctree::
:maxdepth: 1
api_guides/index.rst
fluid.rst
layers.rst
data_feeder.rst
...
...
doc/fluid/api_guides/low_level/layers/io.rst
0 → 100644
浏览文件 @
58e5553e
.. _api_guide_data_in_out:
数据输入
##################
Fluid支持两种数据输入方式,包括:
1. Python Reader: 纯Python的Reader。用户在Python端定义 :code:`fluid.layers.data` 层构建网络,并通过
:code:`executor.run(feed=...)` 的方式读入数据。数据读取和模型训练/预测的过程是同步进行的。
2. PyReader: 高效灵活的C++ Reader接口。PyReader内部维护容量为 :code:`capacity` 的队列(队列容量由
:code:`fluid.layers.py_reader` 接口中的 :code:`capacity` 参数设置),Python端调用队列的 :code:`push`
方法送入训练/预测数据,C++端的训练/预测程序调用队列的 :code:`pop` 方法取出Python端送入的数据。PyReader可与
:code:`double_buffer` 配合使用,实现数据读取和训练/预测的异步执行。
具体使用方法请参考 :ref:`user_guide_use_py_reader`。
数据输出
##################
Fluid支持在训练/预测阶段获取当前batch的数据。
用户可通过 :code:`executor.run(fetch_list=[...], return_numpy=...)` 的方式
fetch期望的输出变量,通过设置 :code:`return_numpy` 参数设置是否将输出数据转为numpy array。
若 :code:`return_numpy` 为 :code:`False` ,则返回 :code:`LoDTensor` 类型数据。
具体使用方式请参考相关API文档 :ref:`api_fluid_executor_Executor` 和
:ref:`api_fluid_ParallelExecutor`。
\ No newline at end of file
doc/fluid/beginners_guide/install/Tables.md
浏览文件 @
58e5553e
...
...
@@ -342,7 +342,7 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。
<td> <a href="https://guest@paddleci.ngrok.io/repository/download/Manylinux1_CpuAvxCp27cp27mu/.lastSuccessful/paddlepaddle-latest-cp27-cp27m-linux_x86_64.whl"> paddlepaddle-latest-cp27-cp27mu-linux_x86_64.whl</a></td>
</tr>
<tr>
<td>
cpu_avx_
mkl
</td>
<td>
cpu_avx_
openblas
</td>
<td> <a href="https://guest@paddleci.ngrok.io/repository/download/Manylinux1_CpuAvxOpenblas/.lastSuccessful/paddlepaddle-latest-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle-latest-cp27-cp27mu-linux_x86_64.whl</a></td>
<td> <a href="https://guest@paddleci.ngrok.io/repository/download/Manylinux1_CpuAvxOpenblas/.lastSuccessful/paddlepaddle-latest-cp27-cp27m-linux_x86_64.whl"> paddlepaddle-latest-cp27-cp27m-linux_x86_64.whl</a></td>
</tr>
...
...
doc/fluid/beginners_guide/install/install_MacOS.md
浏览文件 @
58e5553e
...
...
@@ -38,10 +38,10 @@
其次,您的计算机需要满足以下要求:
> **请不要使用MacOS中自带python**,
我们强烈建议您使用[Homebrew](https://brew.sh)安装python(对于**Python3**请使用python[官方下载](https://www.python.org/downloads/mac-osx/)python3.5.x), pip)
> **请不要使用MacOS中自带python**,
对于**Python2**,建议您使用[Homebrew](https://brew.sh)或[Python.org](https://www.python.org/ftp/python/2.7.15/python-2.7.15-macosx10.9.pkg)提供的python2.7.15;对于**Python3**,请使用[Python.org](https://www.python.org/downloads/mac-osx/)提供的python3.5.x。
For python2: brew install python@2
For python3:
请
使用Python官方下载的python3.5.x
For python2: brew install python@2
或 使用Python官方下载的python2.7.15
For python3: 使用Python官方下载的python3.5.x
*
Python2.7.x,Pip >= 9.0.1
*
Python3.5.x,Pip3 >= 9.0.1
...
...
doc/fluid/user_guides/howto/prepare_data/index.rst
浏览文件 @
58e5553e
...
...
@@ -55,3 +55,14 @@ Fluid提供PyReader异步数据传入方式,数据传入与模型训练/预测
:maxdepth: 2
use_py_reader.rst
LoD-Tensor简介
#####################
LoD-Tensor是Fluid中特有的概念,它在Tensor基础上附加了序列信息,支持处理变长数据。具体请参考:
.. toctree::
:maxdepth:2
lod_tensor.md
\ No newline at end of file
doc/fluid/user_guides/howto/prepare_data/lod_tensor.md
0 → 100644
浏览文件 @
58e5553e
# LoD-Tensor
LoD(Level-of-Detail) Tensor是Fluid中特有的概念,它在Tensor基础上附加了序列信息。Fluid中可传输的数据包括:输入、输出、网络中的可学习参数,全部统一使用LoD-Tensor表示。
阅读本文档将帮助您了解 Fluid 中的 LoD-Tensor 设计思想,以便您更灵活的使用这一数据类型。
## 变长序列的挑战
大多数的深度学习框架使用Tensor表示一个mini-batch。
例如一个mini-batch中有10张图片,每幅图片大小为32x32,则这个mini-batch是一个10x32x32的 Tensor。
或者在处理NLP任务中,一个mini-batch包含N个句子,每个字都用一个D维的one-hot向量表示,假设所有句子都用相同的长度L,那这个mini-batch可以被表示为NxLxD的Tensor。
上述两个例子中序列元素都具有相同大小,但是在许多情况下,训练数据是变长序列。基于这一场景,大部分框架采取的方法是确定一个固定长度,对小于这一长度的序列数据以0填充。
在Fluid中,由于LoD-Tensor的存在,我们不要求每个mini-batch中的序列数据必须保持长度一致,因此您不需要执行填充操作,也可以满足处理NLP等具有序列要求的任务需求。
Fluid引入了一个索引数据结构(LoD)来将张量分割成序列。
## LoD 索引
为了更好的理解LoD的概念,本节提供了几个例子供您参考:
**句子组成的 mini-batch**
假设一个mini-batch中有3个句子,每个句子中分别包含3个、1个和2个单词。我们可以用(3+1+2)xD维Tensor 加上一些索引信息来表示这个mini-batch:
```
3 1 2
| | | | | |
```
上述表示中,每一个
`|`
代表一个D维的词向量,数字3,1,2构成了 1-level LoD。
**递归序列**
让我们来看另一个2-level LoD-Tensor的例子:假设存在一个mini-batch中包含3个句子、1个句子和2个句子的文章,每个句子都由不同数量的单词组成,则这个mini-batch的样式可以看作:
```
3 1 2
3 2 4 1 2 3
||| || |||| | || |||
```
表示的LoD信息为:
```
[[3,1,2]/*level=0*/,[3,2,4,1,2,3]/*level=1*/]
```
**视频的mini-batch**
在视觉任务中,时常需要处理视频和图像这些元素是高维的对象,假设现存的一个nimi-batch包含3个视频,分别有3个,1个和2个帧,每个帧都具有相同大小:640x480,则这个mini-batch可以被表示为:
```
3 1 2
口口口 口 口口
```
最底层tensor大小为(3+1+2)x640x480,每一个
`口`
表示一个640x480的图像
**图像的mini-batch**
在传统的情况下,比如有N个固定大小的图像的mini-batch,LoD-Tensor表示为:
```
1 1 1 1 1
口口口口 ... 口
```
在这种情况下,我们不会因为索引值都为1而忽略信息,仅仅把LoD-Tensor看作是一个普通的张量:
```
口口口口 ... 口
```
**模型参数**
模型参数只是一个普通的张量,在Fluid中它们被表示为一个0-level LoD-Tensor。
<a
name=
"#LoDTensor的偏移表示"
></a>
## LoDTensor的偏移表示
为了快速访问基本序列,Fluid提供了一种偏移表示的方法——保存序列的开始和结束元素,而不是保存长度。
在上述例子中,您可以计算基本元素的长度:
```
3 2 4 1 2 3
```
将其转换为偏移表示:
```
0 3 5 9 10 12 15
= = = = = =
3 2+3 4+5 1+9 2+10 3+12
```
所以我们知道第一个句子是从单词0到单词3,第二个句子是从单词3到单词5。
类似的,LoD的顶层长度
```
3 1 2
```
可以被转化成偏移形式:
```
0 3 4 6
= = =
3 3+1 4+2
```
因此该LoD-Tensor的偏移表示为:
```
0 3 4 6
3 5 9 10 12 15
```
## LoD-Tensor
一个LoD-Tensor可以被看作是一个树的结构,树叶是基本的序列元素,树枝作为基本元素的标识。
在 Fluid 中 LoD-Tensor 的序列信息有两种表述形式:原始长度和偏移量。在 Paddle 内部采用偏移量的形式表述 LoD-Tensor,以获得更快的序列访问速度;在 python API中采用原始长度的形式表述 LoD-Tensor 方便用户理解和计算,并将原始长度称为:
`recursive_sequence_lengths`
。
以上文提到的一个2-level LoD-Tensor为例:
```
3 1 2
3 2 4 1 2 3
||| || |||| | || |||
```
-
以偏移量表示此 LoD-Tensor:[ [0,3,4,6] , [0,3,5,9,10,12,15] ],
-
以原始长度表达此 Lod-Tensor:recursive_sequence_lengths=[ [3-0 , 4-3 , 6-4] , [3-0 , 5-3 , 9-5 , 10-9 , 12-10 , 15-12] ]。
以文字序列为例: [3,1,2] 可以表示这个mini-batch中有3篇文章,每篇文章分别有3、2、1个句子,[3,2,4,1,2,3] 表示每个句子中分别含有3、2、4、1、2、3个字。
recursive_seq_lens 是一个双层嵌套列表,也就是列表的列表,最外层列表的size表示嵌套的层数,也就是lod-level的大小;内部的每个列表,对应表示每个lod-level下,每个元素的大小。
```
python
#查看lod-tensor嵌套层数
print
len
(
recursive_seq_lengths
)
# output:2
#查看最基础元素个数
print
sum
(
recursive_seq_lengths
[
-
1
])
# output:15 (3+2+4+1+2+3=15)
```
## 代码示例
本节代码将根据指定的级别y-lod,扩充输入变量x。本例综合了LoD-Tensor的多个重要概念,跟随代码实现,您将:
-
直观理解Fluid中
`fluid.layers.sequence_expand`
的实现过程
-
掌握如何在Fluid中创建LoD-Tensor
-
学习如何打印LoDTensor内容
**创建LoD-Tensor**
Fluid中可以通过
`fluid.create_lod_tensor()`
创建一个LoD-Tensor,使用说明请参考
[
API reference
](
http://paddlepaddle.org/documentation/api/zh/develop/fluid.html#create-lod-tensor
)
。需要注意的是,这个API只能支持int64的数据,如果您希望处理float32的数据,推荐您使用下述方式创建lod_tensor:
使用fluid.LoDTensor()创建一个LoD-Tensor,并为其指定数据、运算场所和LoD值:
```
python
import
paddle.fluid
as
fluid
import
numpy
as
np
def
create_lod_tensor
(
data
,
lod
,
place
):
res
=
fluid
.
LoDTensor
()
res
.
set
(
data
,
place
)
res
.
set_lod
(
lod
)
return
res
```
**定义计算过程**
layers.sequence_expand通过获取 y 的 lod 值对 x 的数据进行扩充,关于
`fluid.layers.sequence_expand`
的功能说明,请先阅读
[
API reference
](
http://www.paddlepaddle.org/documentation/api/zh/0.15.0/layers.html#sequence-expand
)
。
序列扩充代码实现:
```
python
x
=
fluid
.
layers
.
data
(
name
=
'x'
,
shape
=
[
1
],
dtype
=
'float32'
,
lod_level
=
0
)
y
=
fluid
.
layers
.
data
(
name
=
'y'
,
shape
=
[
1
],
dtype
=
'float32'
,
lod_level
=
1
)
out
=
fluid
.
layers
.
sequence_expand
(
x
=
x
,
y
=
y
,
ref_level
=
0
)
```
*说明*
:输出LoD-Tensor的维度仅与传入的真实数据维度有关,在定义网络结构阶段为x、y设置的shape值,仅作为占位,并不影响结果。
**创建Executor**
```
python
place
=
fluid
.
CPUPlace
()
exe
=
fluid
.
Executor
(
place
)
exe
.
run
(
fluid
.
default_startup_program
())
```
<a
name=
"#准备数据"
></a>
**准备数据**
这里我们使用
[
偏移量
](
#LoDTensor的偏移表示
)
的方法表示Tensor的LoD索引:
假使x_d 为一个LoDTensor:
```
x.lod = [[0,1,4]]
x.data = [[1],[2],[3],[4]]
x.dims = [4,1]
```
y_d 也为一个LoDTensor:
```
y.lod = [[0, 1, 4],
[0, 2, 3, 5, 6]]
```
其中,输出值只与 y 的LoD值有关,y_d 的 data 值在这里并不参与计算,维度上与LoD[-1]一致即可。
预期输出结果为:
```
#预期输出lod的原始长度
out.lod = [ [1, 3, 3, 3]]
#预期输出结果
out.data = [ [1],[2],[3],[4],[2],[3],[4],[2],[3],[4]]
```
实现代码如下:
```
python
x_d
=
create_lod_tensor
(
np
.
array
([[
1
],
[
2
],[
3
],[
4
]]),
[[
0
,
1
,
4
]],
place
)
y_d
=
create_lod_tensor
(
np
.
array
([[
1
],[
1
],[
1
],[
1
],[
1
],[
1
]]),
[[
0
,
1
,
4
],
[
0
,
2
,
3
,
5
,
6
]],
place
)
```
**执行运算**
在Fluid中,LoD>1的Tensor与其他类型数据一样,使用feed定义数据传入顺序。此外,由于输出results是带有LoD信息的Tensor,需在exe.run( )中添加
`return_numpy=False`
参数,获得LoD-Tensor的输出结果。
```
python
feeder
=
fluid
.
DataFeeder
(
place
=
place
,
feed_list
=
[
x
,
y
])
results
=
exe
.
run
(
fluid
.
default_main_program
(),
feed
=
{
'x'
:
x_d
,
'y'
:
y_d
},
fetch_list
=
[
out
],
return_numpy
=
False
)
```
**查看LodTensor结果**
由于LoDTensor的特殊属性,无法直接print查看内容,常用操作时将LoD-Tensor作为网络的输出fetch出来,然后执行 numpy.array(lod_tensor), 就能转成numpy array:
```
python
np
.
array
(
results
[
0
])
```
输出结果为:
```
array([[1],[2],[3],[4],[2],[3],[4],[2],[3],[4]])
```
可以看到与
[
准备数据
](
#准备数据
)
一节中的预期结果一致。
## 总结
至此,相信您已经基本掌握了LoD-Tensor的概念,尝试修改上述代码中的 x_d 与 y_d,观察输出结果,有助于您更好的理解这一灵活的结构。
更多LoDTensor的模型应用,可以参考新手入门中的
[
词向量
](
../../../beginners_guide/basics/word2vec/index.html
)
、
[
个性化推荐
](
../../../beginners_guide/basics/recommender_system/index.html
)
、
[
情感分析
](
../../../beginners_guide/basics/understand_sentiment/index.html
)
等指导教程。
更高阶的应用案例,请参考
[
模型库
](
../../../user_guides/models/index.html
)
中的相关内容。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录