diff --git a/doc/fluid/advanced_usage/development/new_op/index_cn.rst b/doc/fluid/advanced_usage/development/new_op/index_cn.rst index 55f037585b4654ef6e88fea774ad6febfb9cf714..fc56472ce9186b24698c836e18de63c3dc0693f3 100644 --- a/doc/fluid/advanced_usage/development/new_op/index_cn.rst +++ b/doc/fluid/advanced_usage/development/new_op/index_cn.rst @@ -1,10 +1,16 @@ ############# -新增operator +新增Operator ############# -- `op相关的一些注意事项 <../../../advanced_usage/development/new_op/op_notes.html>`_ :介绍op相关的一些注意事项 +本部分将指导您如何新增Operator,也包括一些必要的注意事项 + +- `如何写新的op <./new_op.html>`_ + +- `op相关注意事项 <./op_notes.html>`_ .. toctree:: :hidden: + new_op.md op_notes.md + diff --git a/doc/fluid/advanced_usage/development/new_op/new_op.md b/doc/fluid/advanced_usage/development/new_op/new_op.md new file mode 100644 index 0000000000000000000000000000000000000000..ae42ee5162ac8052f2c28843725ccdd79bd46b58 --- /dev/null +++ b/doc/fluid/advanced_usage/development/new_op/new_op.md @@ -0,0 +1,452 @@ +# 如何写新的op + + - [概念简介](#概念简介) + - [实现C++类](#实现c类) + - [定义ProtoMaker类](#定义protomaker类) + - [定义Operator类](#定义operator类) + - [定义OpKernel类](#定义opkernel类) + - [注册Operator](#注册operator) + - [编译](#编译) + - [绑定Python](#绑定python) + - [实现单元测试](#实现单元测试) + - [前向Operator单测](#前向operator单测) + - [反向Operator单测](#反向operator单测) + - [编译和执行](#编译和执行) + - [注意事项](#注意事项) + + +## 概念简介 + +简单介绍需要用到基类,详细介绍请参考设计文档。 + +- `framework::OperatorBase`: Operator(简写,Op)基类。 +- `framework::OpKernel`: Op计算函数的基类,称作Kernel。 +- `framework::OperatorWithKernel`:继承自OperatorBase,Op有计算函数,称作有Kernel。 +- `class OpProtoAndCheckerMaker`:描述该Op的输入、输出、属性、注释,主要用于Python API接口生成 + +依据是否包含kernel,可以将Op分为两种:包含Kernel的Op和不包含kernel的Op,前者Op的定义继承自`OperatorWithKernel`,后者继承自`OperatorBase`。本教程主要介绍带Kernel的Op如何写,简单总结Op需要包含的内容如下: + + + + + + + + + + + + + + + + + + + + + + + + + + +
内容定义位置
OpProtoMake定义 .cc 文件,Backward Op不需要定义OpProtoMake
Op定义 .cc 文件
Kernel实现 CPU、CUDA共享Kernel实现在.h 文件中,否则,CPU 实现在.cc 文件中,CUDA 实现在.cu 文件中。
注册Op Op注册实现在.cc 文件;Kernel注册CPU实现在.cc 文件中,CUDA实现在.cu 文件中
+ + +实现新的op都添加至目录[paddle/fluid/operators](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/operators)下,文件命名以`*_op.h`(如有) 、 `*_op.cc` 、`*_op.cu`(如有)结尾。**系统会根据文件名自动构建op和其对应的Python扩展。** + + +下面以矩阵乘操作,即[MulOp](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/mul_op.cc)为例来介绍如何写带Kernel的Operator。 + + +## 实现C++类 + + +### 定义ProtoMaker类 + +矩阵乘法的公式:$Out = X * Y$, 可见该计算由两个输入,一个输出组成。 + +首先定义`ProtoMaker`来描述该Op的输入、输出,并添加注释: + +```cpp +class MulOpMaker : public framework::OpProtoAndCheckerMaker { + public: + MulOpMaker(OpProto *proto, OpAttrChecker *op_checker) + : OpProtoAndCheckerMaker(proto, op_checker) { + AddInput("X", "(Tensor), 2D tensor of size (M x K)"); + AddInput("Y", "(Tensor), 2D tensor of size (K x N)"); + AddOutput("Out", "(Tensor), 2D tensor of size (M x N)"); + AddComment(R"DOC( +Two Element Mul Operator. +The equation is: Out = X * Y +)DOC"); + } +}; +``` + +[`MulOpMaker`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/mul_op.cc#L76-L127)继承自`framework::OpProtoAndCheckerMaker`,构造函数含有2个参数: + + - `framework::OpProto` : 前者存储Op的输入输出和参数属性,将用于Python API接口的生成。 + - `framework::OpAttrChecker` :后者用于检查参数属性的合法性。 + +构造函数里通过`AddInput`添加输入参数,通过`AddOutput`添加输出参数,通过`AddComment`添加Op的注释。这些函数会将对应内容添加到`OpProto`中。 + +上面的代码在`MulOp`中添加两个输入`X`和`Y`,添加了一个输出`Out`,并解释了各自含义,命名请遵守[命名规范](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/dev/name_convention.md)。 + + +再以[`ScaleOp`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/scale_op.cc#L38-L55)为例: + +```cpp +template +class ScaleOpMaker : public framework::OpProtoAndCheckerMaker { + public: + ScaleOpMaker(OpProto *proto, OpAttrChecker *op_checker) + : OpProtoAndCheckerMaker(proto, op_checker) { + AddInput("X", "(Tensor) Input tensor of scale operator."); + AddOutput("Out", "(Tensor) Output tensor of scale operator."); + AddComment(R"DOC( +Scale operator +$$Out = scale*X$$ +)DOC"); + AddAttr("scale", + "(float, default 1.0)" + "The scaling factor of the scale operator.") + .SetDefault(1.0); + } +}; +``` + +这个例子有`AddAttr("scale", "...").SetDefault(1.0);` : 增加`scale`系数,作为参数属性,并且设置默认值为1.0。 + +### 定义GradProtoMaker类 +每个Op的必须有一个对应的GraProtoMaker,若未定制对应前向Op的GradProtoMaker,fluid提供了DefaultGradProtoMaker,默认注册会使用全部输入输出,包括Input, Output, Output@Grad等,使用不需要的变量的会造成显存浪费。 +下面示例定义了ScaleOp的GradProtoMaker。 + +```cpp +class ScaleGradMaker : public framework::SingleGradOpDescMaker { + public: + using framework::SingleGradOpDescMaker::SingleGradOpDescMaker; + + std::unique_ptr Apply() const override { + auto *grad_op = new framework::OpDesc(); + grad_op->SetType("scale"); + grad_op->SetInput("X", OutputGrad("Out")); + grad_op->SetOutput("Out", InputGrad("X")); + grad_op->SetAttr("scale", GetAttr("scale")); + return std::unique_ptr(grad_op); + } +}; +``` + +### 定义Operator类 + +下面实现了MulOp的定义: + +```cpp +class MulOp : public framework::OperatorWithKernel { + public: + using framework::OperatorWithKernel::OperatorWithKernel; + + protected: + void InferShape(const framework::InferShapeContext &ctx) const override { + //never use Input or Output if you want a to get a LoDTensor. + auto dim0 = ctx.Input("X")->dims(); + auto dim1 = ctx.Input("Y")->dims(); + PADDLE_ENFORCE_EQ(dim0.size(), 2, + "input X(%s) should be a tensor with 2 dims, a matrix", + ctx.op_.Input("X")); + PADDLE_ENFORCE_EQ(dim1.size(), 2, + "input Y(%s) should be a tensor with 2 dims, a matrix", + ctx.op_.Input("Y")); + PADDLE_ENFORCE_EQ( + dim0[1], dim1[0], + "First matrix's width must be equal with second matrix's height."); + ctx.Output("Out")->Resize({dim0[0], dim1[1]}); + } +}; +``` + +[`MulOp`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/mul_op.cc#L22)继承自`OperatorWithKernel`。`public`成员: + +```cpp +using framework::OperatorWithKernel::OperatorWithKernel; +``` + +这句表示使用基类`OperatorWithKernel`的构造函数,也可写成: + +```cpp +MulOp(const std::string &type, const framework::VariableNameMap &inputs, + const framework::VariableNameMap &outputs, + const framework::AttributeMap &attrs) + : OperatorWithKernel(type, inputs, outputs, attrs) {} +``` + +还需要重写`InferShape`接口。`InferShape`为const函数,不能修改Op的成员变量,参数为`const framework::InferShapeContext &ctx`,通过该参数可获取到输入输出以及属性。它的功能是: + + - 做检查, 尽早报错:检查输入数据维度、类型等是否合法。 + - 设置输出Tensor的形状。 + +通常`OpProtoMaker`和`Op`类的定义写在`.cc`文件中,和下面将要介绍的注册函数一起放在`.cc`中 + +### 定义OpKernel类 + +`MulKernel`继承自`framework::OpKernel`,带有下面两个模板参数: + +- `typename DeviceContext`: 表示设备类型,不同设备(CPU、CUDA)共享同一个Kernel时,需加该模板参数,不共享则不加,一个不共享的例子是[`OnehotCrossEntropyOpKernel`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/cross_entropy_op.h#L43)。 + +- `typename T` : 表示数据类型,如`float`, `double`等。 + +需要为`MulKernel`类重写`Compute`接口。 + +- `Compute`接受一个输入参数:`const framework::ExecutionContext& context`。 + +- 与`InferShapeContext`相比,`ExecutionContext`增加了设备类型,同样可获取到输入输出和属性参数。 + +- `Compute`函数里实现`OpKernel`的具体计算逻辑。 + +Op的输入和输出可分别通过`ExecutionContext::Input()`和`ExecutionContext::Output()`获得。 + +**注意:** 若op的输入/输出的变量类型是`LoDTensor`(fluid默认所有的Tensor默认都是LoDTensor类型),请写成`ExecutionContext::Input()`和`ExecutionContext::Output()`,不要写`ExecutionContext::Input()`和`ExecutionContext::Output()`。因为若实际的变量类型为`SelectedRows`,`Input()`和`Output()`方法会将`SelectedRows`类型特化为`Tensor`,导致潜在的错误。 + +下面是 `MulKernel` `Compute`的实现: + + ```cpp + template + class MulKernel : public framework::OpKernel { + public: + void Compute(const framework::ExecutionContext& context) const override { + auto* X = context.Input("X"); + auto* Y = context.Input("Y"); + auto* Z = context.Output("Out"); + Z->mutable_data(context.GetPlace()); + auto& device_context = context.template device_context(); + math::matmul(*X, false, *Y, false, 1, Z, 0, device_context); + } + }; + ``` + +需要注意:**不同设备(CPU、CUDA)共享一个Op定义,是否则共享同一个`OpKernel`,取决于`Compute`调用的函数是否支持不同设备。** + +`MulOp`的CPU、CUDA实现共享同一个`Kernel`。`OpKernel`不共享的例子可以参考:[`OnehotCrossEntropyOpKernel`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/cross_entropy_op.h#L43)。 + +为了使`OpKernel`的计算过程书写更加简单,并且CPU、CUDA的代码可以复用,我们通常借助 Eigen unsupported Tensor模块来实现`Compute`接口。关于在PaddlePaddle中如何使用Eigen库,请参考[使用文档](https://github.com/PaddlePaddle/FluidDoc/blob/develop/doc/fluid/dev/use_eigen_cn.md)。 + +到此,前向Op实现完成。接下来,需要在`.cc`文件中注册该op和kernel。 +反向Op类的定义,反向OpKernel的定义与前向Op类似,这里不再赘述。**但需注意反向Op没有`ProtoMaker`**。 + +### 注册Operator + +- 在`.cc`文件中注册前向、反向Op类,注册CPU Kernel。 + + ```cpp + namespace ops = paddle::operators; + REGISTER_OPERATOR(mul, ops::MulOp, ops::MulOpMaker, + paddle::framework::DefaultGradOpDescMaker) + REGISTER_OPERATOR(mul_grad, ops::MulGradOp) + REGISTER_OP_CPU_KERNEL(mul, ops::MulKernel); + REGISTER_OP_CPU_KERNEL(mul_grad, + ops::MulGradKernel); + ``` + + 在上面的代码中: + + - `REGISTER_OPERATOR` : 注册`ops::MulOp`类,类型名为`mul`,该类的`ProtoMaker`为`ops::MulOpMaker`,注册`ops::MulOpGrad`,类型名为`mul_grad`。 + + - `REGISTER_OP_CPU_KERNEL` :注册`ops::MulKernel`类,并特化模板参数为`paddle::platform::CPUPlace`和`float`类型,同理,注册`ops::MulGradKernel`类。 + + +- 在 `.cu`文件中注册CUDA Kernel。 + - 请注意,如果CUDA Kernel的实现基于Eigen unsupported模块,那么在 `.cu`的开始请加上宏定义 `#define EIGEN_USE_GPU`,代码示例如下: + + + ```cpp + // if use Eigen unsupported module before include head files + #define EIGEN_USE_GPU + + namespace ops = paddle::operators; + REGISTER_OP_CUDA_KERNEL(mul, ops::MulKernel); + REGISTER_OP_CUDA_KERNEL(mul_grad, + ops::MulGradKernel); + ``` + +### 编译 + +运行下面命令可以进行编译: + +``` +make mul_op +``` + +## 绑定Python + +系统会对新增的op自动绑定Python,并链接到生成的lib库中。 + +## 实现单元测试 + +单测包括对比前向Op不同设备(CPU、CUDA)的实现、对比反向OP不同设备(CPU、CUDA)的实现、反向Op的梯度测试。下面介绍介绍[`MulOp`的单元测试](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/unittests/test_mul_op.py)。 + +### 前向Operator单测 + +Op单元测试继承自`OpTest`。各项更加具体的单元测试在`TestMulOp`里完成。测试Operator,需要: + +1. 在`setUp`函数定义输入、输出,以及相关的属性参数。 +2. 生成随机的输入数据。 +3. 在Python脚本中实现与前向operator相同的计算逻辑,得到输出值,与operator前向计算的输出进行对比。 +4. 反向计算已经自动集成进测试框架,直接调用相应接口即可。 + + + ```python + import unittest + import numpy as np + from op_test import OpTest + + + class TestMulOp(OpTest): + def setUp(self): + self.op_type = "mul" + self.inputs = { + 'X': np.random.random((32, 84)).astype("float32"), + 'Y': np.random.random((84, 100)).astype("float32") + } + self.outputs = {'Out': np.dot(self.inputs['X'], self.inputs['Y'])} + + def test_check_output(self): + self.check_output() + + def test_check_grad_normal(self): + self.check_grad(['X', 'Y'], 'Out', max_relative_error=0.5) + + def test_check_grad_ingore_x(self): + self.check_grad( + ['Y'], 'Out', max_relative_error=0.5, no_grad_set=set("X")) + + def test_check_grad_ingore_y(self): + self.check_grad( + ['X'], 'Out', max_relative_error=0.5, no_grad_set=set('Y')) + ``` + + 上面的代码首先导入依赖的包,下面是对`setUp`函数中操作的重要变量的详细解释: + + - `self.op_type = "mul" ` : 定义类型,与operator注册时注册的类型一致。 + - `self.inputs` : 定义输入,类型为`numpy.array`,并初始化。 + - `self.outputs` : 定义输出,并在Python脚本中完成与operator同样的计算逻辑,返回Python端的计算结果。 + +### 反向operator单测 + +而反向测试中: + +- `test_check_grad_normal`中调用`check_grad`使用数值法检测梯度正确性和稳定性。 + - 第一个参数`["X", "Y"]` : 指定对输入变量`X`、`Y`做梯度检测。 + - 第二个参数`"Out"` : 指定前向网络最终的输出目标变量`Out`。 + - 第三个参数`max_relative_error`:指定检测梯度时能容忍的最大错误值。 + +- `test_check_grad_ingore_x`和`test_check_grad_ingore_y`分支用来测试只需要计算一个输入梯度的情况。 + + +### 编译和执行 + +`python/paddle/fluid/tests/unittests/` 目录下新增的 `test_*.py` 单元测试会被自动加入工程进行编译。 + +请注意,**不同于Op的编译测试,运行单元测试测时需要编译整个工程**,并且编译时需要打开`WITH_TESTING`, 即`cmake paddle_dir -DWITH_TESTING=ON`。编译成功后,执行下面的命令来运行单元测试: + +```bash +make test ARGS="-R test_mul_op -V" +``` + +或者: + +```bash +ctest -R test_mul_op +``` + +## 注意事项 + +- 注册Op时的类型名,需要和该Op的名字一样。即不允许在`A_op.cc`里面,注册`REGISTER_OPERATOR(B, ...)`等,这将会导致单元测试出错。 +- 如果Op没有实现CUDA Kernel,请不要创建空的`*_op.cu`,这将会导致单元测试出错。 +- 如果多个Op依赖一些共用的函数,可以创建非`*_op.*`格式的文件来存放,如`gather.h`文件。 + +### PADDLE_ENFORCE使用注意 + +实现Op时检查数据的合法性需要使用PADDLE_ENFORCE以及PADDLE_ENFORCE_EQ等宏定义,基本格式如下: + +``` +PADDLE_ENFORCE(表达式, 错误提示信息) +PADDLE_ENFORCE_EQ(比较对象A, 比较对象B, 错误提示信息) +``` + +如果表达式为真,或者比较对象A=B,则检查通过,否则会终止程序运行,向用户反馈相应的错误提示信息。 +为了确保提示友好易懂,开发者需要注意其使用方法。 + +#### 总体原则 + +任何使用了PADDLE_ENFORCE与PADDLE_ENFORCE_**检查的地方,必须有详略得当的备注解释!**错误提示信息**不能为空! + +#### 提示信息书写标准 + +1. [required] 哪里错了?为什么错了? + + - 例如:`ValueError: Mismatched label shape` + +2. [optional] 期望的输入是什么样的?实际的输入是怎样的? + + - 例如:`Expected labels dimension=1. Received 4.` + +3. [optional] 能否给出修改意见? + + - 例如:`Suggested Fix:If your classifier expects one-hot encoding label,check your n_classes argument to the estimatorand/or the shape of your label.Otherwise, check the shape of your label.` + +如果并非必要或者简洁的描述即可表达清楚以上要点,根据情况书写亦可。 + +#### FAQ 典型问题 + +1. 无报错信息或报错信息过于简单,不能给用户提供有效的提示! + + 问题示例1 :未写提示信息 + ``` + PADDLE_ENFORCE(ctx->HasInput("X"), ""); + ``` + 问题示例2 :提示信息过于简单 + ``` + PADDLE_ENFORCE(i != nullptr, "i must be set"); // i是什么? + ``` + +2. 在报错信息中使用开发人员定义的变量缩写,不易理解! + + 问题示例: + ``` + PADDLE_ENFORCE(forward_pd != nullptr, + "Fail to find eltwise_fwd_pd in device context"); //eltwise_fwd_pd用户可能看不懂 + ``` + +3. OP内部调用非法接口:Op内部如果出现Output = ShareDataWith(Input) + 问题示例: + ```cpp + auto *out = ctx.Output("Out"); + auto *in = ctx.Input("X"); + out->ShareDataWith(*in); + ``` + Op内部如果出现Output = ShareDataWith(Input),相当于operator图的中有一条隐藏边,连接了Input和Output,这条边无法在图分析中表达,引发基于图优化的错误。 + +4. OP实现的性能实践 + 调用了eigen的broadcast, chop等操作,性能会比手写cuda kernel差几倍以上。此时cpu的实现可以复用eigen,gpu实现可以实现cuda kernel. + + +#### OP InferShape检查提示信息特别说明 + +- 检查输入输出变量,请统一遵循以下格式 +`Input(变量名) of OP名 operator should not be null.` + + 正确示例: + ``` + PADDLE_ENFORCE(ctx->HasInput("Input"), + "Input(Input) of LSTMP operator should not be null."); + ``` + +- 反向Op的输入输出检查,要写明反向Op的名字 + + 正确示例: + ``` + PADDLE_ENFORCE(ctx->HasInput("X"), + "Input(X) of LoDResetGrad opreator should not be null."); + ``` diff --git a/doc/fluid/advanced_usage/development/new_op/new_op_cn.md b/doc/fluid/advanced_usage/development/new_op/new_op_cn.md deleted file mode 120000 index dce0348585b8c484c1418a03a5fde5d78b0afcc9..0000000000000000000000000000000000000000 --- a/doc/fluid/advanced_usage/development/new_op/new_op_cn.md +++ /dev/null @@ -1 +0,0 @@ -../../../dev/new_op_cn.md \ No newline at end of file diff --git a/doc/fluid/advanced_usage/development/new_op/op_notes.md b/doc/fluid/advanced_usage/development/new_op/op_notes.md index e48f804d0d015218904c14c49c29bb68a852ece6..501b81c6ad0fb0592d1bf9accc925d0bce9fa2c8 100644 --- a/doc/fluid/advanced_usage/development/new_op/op_notes.md +++ b/doc/fluid/advanced_usage/development/new_op/op_notes.md @@ -1,4 +1,4 @@ -# op相关的一些注意事项 +# op相关注意事项 ## Fluid中Op的构建逻辑 ### 1.Fluid中Op的构建逻辑 diff --git a/doc/fluid/api_cn/clip_cn.rst b/doc/fluid/api_cn/clip_cn.rst index 70b4e6e99e17bfe15b80e6d9970e151b4716aea5..9a764120680d6feb5e52573cb03c61a36c39b7dd 100644 --- a/doc/fluid/api_cn/clip_cn.rst +++ b/doc/fluid/api_cn/clip_cn.rst @@ -16,13 +16,13 @@ ErrorClipByValue 给定一个张量 ``t`` ,该操作将它的值压缩到 ``min`` 和 ``max`` 之间 -- 任何小于最小值的值都被设置为最小值 +- 任何小于min(最小值)的值都被设置为min -- 任何大于max的值都被设置为max +- 任何大于max(最大值)的值都被设置为max 参数: - **max** (foat) - 要修剪的最大值。 - - **min** (float) - 要修剪的最小值。如果用户没有设置,将被 ``framework`` 设置为 ``-max`` + - **min** (float) - 要修剪的最小值。如果用户没有设置,将被框架默认设置为 ``-max`` **代码示例** diff --git a/doc/fluid/api_cn/executor_cn.rst b/doc/fluid/api_cn/executor_cn.rst index 8354f203b131ed01dadb71830666d29d377a1306..d7225d62f30e12422056b49c5f3ec66123678d2a 100644 --- a/doc/fluid/api_cn/executor_cn.rst +++ b/doc/fluid/api_cn/executor_cn.rst @@ -15,6 +15,8 @@ Executor + + 执行引擎(Executor)使用python脚本驱动,仅支持在单GPU环境下运行。多卡环境下请参考 ``ParallelExecutor`` 。 Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表) 向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。 @@ -28,12 +30,38 @@ Executor将全局变量存储到全局作用域中,并为临时变量创建局 program中所有的算子会按顺序执行。 +**示例代码** + +.. code-block:: python + + # 新建一个执行引擎Executor名为exe。 + place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() + exe = fluid.Executor(place) + + # 仅运行一次startup program. + # 不需要优化/编译这个startup program. + exe.run(fluid.default_startup_program()) + + # 无需编译,直接运行main program + loss, = exe.run(fluid.default_main_program(), + feed=feed_dict, + fetch_list=[loss.name]) + + # 另一种方法是,编译这个main program然后运行. 参考CompiledProgram + compiled_prog = compiler.CompiledProgram( + fluid.default_main_program()).with_data_parallel( + loss_name=loss.name) + loss, = exe.run(compiled_prog, + feed=feed_dict, + fetch_list=[loss.name]) + + 参数: - **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所 -提示:你可以用Executor来调试基于并行GPU实现的复杂网络,他们有完全一样的参数也会产生相同的结果。 +提示:你可以用 ``Executor`` 来调试基于并行GPU实现的复杂网络,他们有完全一样的参数也会产生相同的结果。 .. py:method:: close() @@ -62,8 +90,8 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。 参数: - - **program** (Program) – 需要执行的program,如果没有给定那么默认使用default_main_program - - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LableData} + - **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的) + - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData} - **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果 - **feed_var_name** (str) – 前向算子(feed operator)变量的名称 - **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称 @@ -80,23 +108,21 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 .. code-block:: python - data = fluid.layers.data(name='X', shape=[1], dtype='float32') out = fluid.layers.create_tensor(dtype='float32') hidden = fluid.layers.fc(input=data, size=10) - fluid.layers.assign(hidden, out) + fluid.layers.assign(hidden,out) loss = fluid.layers.mean(out) adam = fluid.optimizer.Adam() - adam.minimize(loss) + # adam.minimize(loss) .. code-block:: python - - + cpu = core.CPUPlace() exe = fluid.Executor(cpu) exe.run(fluid.default_startup_program()) - + .. code-block:: python x = numpy.random.random(size=(10, 1)).astype('float32') @@ -118,7 +144,7 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 global_scope ------------------------------- -.. py:function:: paddle.fluid.global_scope() +.. py:function:: paddle.fluid.global_scope () 获取全局/默认作用域实例。很多api使用默认 ``global_scope`` ,例如 ``Executor.run`` 。 @@ -137,7 +163,7 @@ global_scope scope_guard ------------------------------- -.. py:function:: paddle.fluid.scope_guard(*args, **kwds) +.. py:function:: paddle.fluid.scope_guard (scope) 修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。 diff --git a/doc/fluid/api_cn/fluid_cn.rst b/doc/fluid/api_cn/fluid_cn.rst index 29bb278e00aaa0625be3c51830d074a8df4fd250..57789869c6c94ebcdff3de80269f9647852fa679 100644 --- a/doc/fluid/api_cn/fluid_cn.rst +++ b/doc/fluid/api_cn/fluid_cn.rst @@ -9,13 +9,14 @@ AsyncExecutor ------------------------------- -.. py:class:: paddle.fluid.AsyncExecutor(place=None) +.. py:class:: paddle.fluid.AsyncExecutor(place=None, run_mode='') + +**AsyncExecutor正在积极开发,API可能在短期内进行调整。** Python中的异步执行器。AsyncExecutor利用多核处理器和数据排队的强大功能,使数据读取和融合解耦,每个线程并行运行。 AsyncExecutor不是在python端读取数据,而是接受一个训练文件列表,该列表将在c++中检索,然后训练输入将被读取、解析并在c++代码中提供给训练网络。 -AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。 参数: - **place** (fluid.CPUPlace|None) - 指示 executor 将在哪个设备上运行。目前仅支持CPU @@ -47,7 +48,7 @@ AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。 目前仅支持CPU -.. py:method:: run(program, data_feed, filelist, thread_num, fetch, debug=False) +.. py:method:: run(program, data_feed, filelist, thread_num, fetch, mode='', debug=False) 使用此 ``AsyncExecutor`` 来运行 ``program`` 。 @@ -59,21 +60,78 @@ AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。 所有运算同时更新参数值。 参数: - - program (Program) – 需要执行的program。如果没有提供该参数,默认使用 ``default_main_program`` - - data_feed (DataFeedDesc) – ``DataFeedDesc`` 对象 - - filelist (str) – 一个包含训练数据集文件的文件列表 - - thread_num (int) – 并发训练线程数。参照 *注解* 部分获取合适的设置方法 - - fetch (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名 - - debug (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来 + - **program** (Program) – 需要执行的program。如果没有提供该参数,默认使用 ``default_main_program`` + - **data_feed** (DataFeedDesc) – ``DataFeedDesc`` 对象 + - **filelist** (str) – 一个包含训练数据集文件的文件列表 + - **thread_num** (int) – 并发训练线程数。参照 *注解* 部分获取合适的设置方法 + - **fetch** (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名 + - **mode** (str) – 该接口的运行模式 + - **debug** (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来 .. note:: 1.该执行器会运行program中的所有运算,不只是那些依赖于fetchlist的运算 2.该类执行器在多线程上运行,每个线程占用一个CPU核。为了实现效率最大化,建议将 ``thread_num`` 等于或稍微小于CPU核心数 +.. py:method:: download_data(afs_path, local_path, fs_default_name, ugi, file_cnt, hadoop_home='$HADOOP_HOME', process_num=12) + +download_data是用于分布式训练的默认下载方法,用户可不使用该方法下载数据。 + +**示例** + +.. code-block:: python + + exe = fluid.AsyncExecutor() + exe.download_data("/xxx/xxx/xx/", + "./data", "afs:// + xxx.xxx.xxx.xxx:9901", "xxx,yyy") + +参数: + - **afs_path** (str) - 用户定义的afs_path + - **local_path** (str) - 下载数据路径 + - **fs_default_name** (str) - 文件系统服务器地址 + - **ugi** (str) - hadoop ugi + - **file_cn** (int) - 用户可以指定用于调试的文件号 + - **hadoop_home** (str) - hadoop home path + - **process_num** (int) - 下载进程号 + +.. py:method:: get_instance() + +获取当前节点的实例,以便用户可以在分布式背景下中执行操作。 + +.. py:method:: config_distributed_nodes() + +如果用户需要运行分布式AsyncExecutor,则需要进行全局配置,以便获取当前进程的信息。 + +.. py:method:: stop() + +在流程结束时,用户应该停止服务器并阻止所有workers。 + +.. py:method:: init_server(dist_desc) +如果当前进程是server,则初始化当前节点的服务器。 +参数: + - **dist_desc** (str)- 描述如何初始化worker和server的protobuf字符串 + +.. py:method:: init_worker(dist_desc, startup_program) + +如果当前进程是worker,则初始化当前节点的worker + +参数: + - **dist_desc** (str)- 描述如何初始化worker和server的protobuf字符串 + - **startup_program** (fluid.Program)- 当前进程的startup program + +.. py:method:: init_model() +可以从其中一个worker中调用的init_model命令。随之,在server中初始化模型参数。 + +.. py:method:: save_model(save_path) + +可以从其中一个worker调用的save_model命令。随之,模型参数会保存在server中并上传到文件系统的save_path指定的位置。 + +参数: + - **save_path** (str)- 文件系统的保存路径 .. _cn_api_fluid_BuildStrategy: @@ -106,10 +164,14 @@ str类型。它表明了以graphviz格式向文件中写入SSA图的路径,有 + .. py:attribute:: fuse_elewise_add_act_ops bool类型。它表明了是否融合(fuse)elementwise_add_op和activation_op。这会使整体执行过程更快一些。默认为False。 +.. py:attribute:: fuse_relu_depthwise_conv + +BOOL类型,fuse_relu_depthwise_conv指示是否融合relu和depthwise_conv2d,它会节省GPU内存并可能加速执行过程。 此选项仅适用于GPU设备。 默认为False。 .. py:attribute:: gradient_scale_strategy @@ -558,7 +620,7 @@ reader通常返回一个minibatch条目列表。在列表中每一条目都是 返回类型: dict -抛出异常: ``ValueError`` – 如果 ``drop_last`` 值为False并且reader返回的minibatch数目与设备数目不相等时,产生此异常 +抛出异常: ``ValueError`` – 如果 ``drop_last`` 值为False并且data batch与设备不匹配时,产生此异常 @@ -784,7 +846,7 @@ DistributeTranspilerConfig .. py:attribute:: min_block_size (int) -最小数据块的大小 +block中分割(split)出的元素个数的最小值。 注意: 根据:`issuecomment-369912156 `_ , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看 ``slice_variable`` 函数。 @@ -874,6 +936,32 @@ Executor将全局变量存储到全局作用域中,并为临时变量创建局 program中所有的算子会按顺序执行。 +**示例代码** + +.. code-block:: python + + # 新建一个执行引擎Executor名为exe。 + place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace() + exe = fluid.Executor(place) + + # 仅运行一次startup program. + # 不需要优化/编译这个startup program. + exe.run(fluid.default_startup_program()) + + # 无需编译,直接运行main program + loss, = exe.run(fluid.default_main_program(), + feed=feed_dict, + fetch_list=[loss.name]) + + # 另一种方法是,编译这个main program然后运行. 参考CompiledProgram + compiled_prog = compiler.CompiledProgram( + fluid.default_main_program()).with_data_parallel( + loss_name=loss.name) + loss, = exe.run(compiled_prog, + feed=feed_dict, + fetch_list=[loss.name]) + + 参数: - **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所 @@ -908,8 +996,8 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。 参数: - - **program** (Program) – 需要执行的program,如果没有给定那么默认使用default_main_program - - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LableData} + - **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的) + - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData} - **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果 - **feed_var_name** (str) – 前向算子(feed operator)变量的名称 - **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称 @@ -1032,13 +1120,49 @@ LoD可以有多个level(例如,一个段落可以有多个句子,一个句 .. py:method:: has_valid_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → bool +检查LoDTensor的lod值的正确性。 + +返回: 是否带有正确的lod值 + +返回类型: out (bool) + .. py:method:: lod(self: paddle.fluid.core.LoDTensor) → List[List[int]] +得到LoD Tensor的LoD。 + +返回:LoD Tensor的LoD。 + +返回类型:out(List [List [int]]) + + .. py:method:: recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → List[List[int]] -.. py:method:: set_lod(self: paddle.fluid.core.LoDTensor, arg0: List[List[int]]) → None +得到与LoD对应的LoDTensor的序列长度。 + +返回:LoD对应的一至多个序列长度。 -.. py:method:: set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, arg0: List[List[int]]) → None +返回类型:out(List [List [int]) + + + +.. py:method:: set_lod(self: paddle.fluid.core.LoDTensor, lod: List[List[int]]) → None + +设置LoDTensor的LoD。 + +参数: +- **lod** (List [List [int]]) - 要设置的lod。 + +.. py:method:: set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, recursive_sequence_lengths: List[List[int]]) → None + +根据递归序列长度recursive_sequence_lengths设置LoDTensor的LoD。 + +:: + + 例如,如果recursive_sequence_lengths = [[2,3]], + 意味着有两个长度分别为2和3的序列,相应的lod将是[[0,2,2 + 3]],即[[0, 2,5]]。 + +参数: +- **recursive_sequence_lengths** (List [List [int]]) - 序列长度。 @@ -1057,7 +1181,9 @@ LoDTensorArray .. py:class:: paddle.fluid.LoDTensorArray -.. py:method:: append(self: paddle.fluid.core.LoDTensorArray, arg0: paddle.fluid.core.LoDTensor) → None +.. py:method:: append(self: paddle.fluid.core.LoDTensorArray, tensor: paddle.fluid.core.LoDTensor) → None + +将LoDensor追加到LoDTensorArray后。 @@ -1100,7 +1226,7 @@ memory_optimize name_scope ------------------------------- -.. py:function:: paddle.fluid.name_scope(*args, **kwds) +.. py:function:: paddle.fluid.name_scope(prefix=None) 为operators生成层次名称前缀 @@ -1357,7 +1483,10 @@ operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 返回:(str): debug 字符串 -抛出异常: ``ValueError`` - 当 ``throw_on_error == true`` ,但没有设置任何必需的字段时,抛出 ``ValueError`` 。 +返回类型: str + +抛出异常: + - ``ValueError`` - 当 ``throw_on_error == true`` ,但没有设置任何必需的字段时,抛出 ``ValueError`` 。 @@ -1499,7 +1628,7 @@ operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 program_guard ------------------------------- -.. py:function:: paddle.fluid.program_guard(*args, **kwds) +.. py:function:: paddle.fluid.program_guard(main_program, startup_program=None) @@ -1570,7 +1699,7 @@ release_memory scope_guard ------------------------------- -.. py:function:: paddle.fluid.scope_guard(*args, **kwds) +.. py:function:: paddle.fluid.scope_guard(scope) 修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。 diff --git a/doc/fluid/api_cn/layers_cn.rst b/doc/fluid/api_cn/layers_cn.rst index 34b342bb027bd670e02811e3a6f17aad7743c72f..e383514eaa41825122d3b7391b02990a2bb7f945 100644 --- a/doc/fluid/api_cn/layers_cn.rst +++ b/doc/fluid/api_cn/layers_cn.rst @@ -206,7 +206,7 @@ memory用于缓存分段数据。memory的初始值可以是零,也可以是 目前不支持在DynamicRNN中任何层上配置 is_sparse = True .. py:method:: step_input(x) - + 将序列标记为动态RNN输入。 参数: @@ -279,7 +279,7 @@ memory用于缓存分段数据。memory的初始值可以是零,也可以是 参数: - **init** (Variable|None) – 初始化的Variable - - **shape** (list|tuple) – memory shape. 注意形状不包含batch的大小 + - **shape** (list|tuple) – memory shape. 注意形状不包含batch_size - **value** (float) – 初始化的值 - **need_reorder** (bool) – memory初始化依赖于输入样本时设置为True - **dtype** (str|numpy.dtype) – 初始化memory的数据类型 @@ -849,7 +849,7 @@ data 参数: - **name** (str)-函数名或函数别名 - - **shape** (list)-声明维度的元组 + - **shape** (list)-声明维度信息的list。如果 ``append_batch_size`` 为True且内部没有维度值为-1,则应将其视为每个样本的形状。 否则,应将其视为batch数据的形状。 - **append_batch_size** (bool)- 1.如果为真,则在维度shape的开头插入-1 @@ -1260,10 +1260,10 @@ shuffle 会对其进行重洗运算。shuffle缓存区的大小由参数 ``buffer_size`` 决定。 参数: - - **reader** (Variable) – 用shuffle装饰的reader - - **buffer_size** (int) – reader中buffer的大小 + - **reader** (callable) – 输出会被shuffle的原始reader + - **buffer_size** (int) – 进行shuffle的buffer的大小 -返回:其输出会被重洗的一个reader(读取器) +返回:其输出会被shuffle的一个reader(读取器) 返回类型:Variable @@ -1328,7 +1328,7 @@ pooling2d操作根据输入 ``input`` , ``pool_size`` , ``pool_type`` 参数 .. code-block:: python # 假设输入形为[N, C, H, W], `pool_size` 为 [m, n], - # 输出形为 [N, C, m, n], adaptive pool 将输入的 H 和 W 纬度 + # 输出形为 [N, C, m, n], adaptive pool 将输入的 H 和 W 维度 # 平均分割为 m * n 个栅格(grid) ,然后为每个栅格进行池化得到输出 # adaptive average pool 进行如下操作 # @@ -1402,7 +1402,7 @@ pooling3d操作根据输入 ``input`` ,``pool_size`` , ``pool_type`` 参数 .. code-block:: python # 假设输入形为[N, C, D, H, W], `pool_size` 为 [l, m, n], - # 输出形为 [N, C, l, m, n], adaptive pool 将输入的D, H 和 W 纬度 + # 输出形为 [N, C, l, m, n], adaptive pool 将输入的D, H 和 W 维度 # 平均分割为 l * m * n 个栅格(grid) ,然后为每个栅格进行池化得到输出 # adaptive average pool 进行如下操作 # @@ -1451,7 +1451,16 @@ add_position_encoding - PE(pos, 2i): 偶数位置上数字的增量 - PE(pos, 2i + 1): 奇数位置上数字的增量 -返回: Variable: 具有位置编码的三维形状张量[N×M×P] +参数: + - **input** (Variable) – 形状为[N x M x P]的三维输入张量 + - **alpha** (float) – 输入张量的倍数 + - **beta** (float) – 位置编码张量Positional Encoding Tensor的倍数 + - **name** (string) – 位置编码层的名称 + + +返回: 具有位置编码的三维形状张量[N×M×P] + +返回类型: Variable **代码示例:** @@ -1641,7 +1650,7 @@ autoincreased_step_counter batch_norm ------------------------------- -.. py:function:: paddle.fluid.layers.batch_norm(input, act=None, is_test=False, momentum=0.9, epsilon=1e-05, param_attr=None, bias_attr=None, data_layout='NCHW', in_place=False, name=None, moving_mean_name=None, moving_variance_name=None, do_model_average_for_mean_and_var=False, fuse_with_relu=False) +.. py:function:: paddle.fluid.layers.batch_norm(input, act=None, is_test=False, momentum=0.9, epsilon=1e-05, param_attr=None, bias_attr=None, data_layout='NCHW', in_place=False, name=None, moving_mean_name=None, moving_variance_name=None, do_model_average_for_mean_and_var=False, fuse_with_relu=False, use_global_stats=False) 批正则化层(Batch Normalization Layer) @@ -1660,6 +1669,16 @@ batch_norm \hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\sigma_{\beta}^{2} + \epsilon}} \quad &// normalize \\ y_i &\gets \gamma \hat{x_i} + \beta \quad &// scale-and-shift +当use_global_stats = True时, :math:`\mu_{\beta}` 和 :math:`\sigma_{\beta}^{2}` 不是一个minibatch的统计数据。 它们是全局(或运行)统计数据。 (它通常来自预先训练好的模型。)训练和测试(或预测)具有相同的行为: + +.. math:: + + \hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\ + \sigma_{\beta}^{2} + \epsilon}} \\ + y_i &\gets \gamma \hat{x_i} + \beta + + + 参数: - **input** (Variable) - 输入变量,为LoDTensor - **act** (string,默认None)- 激活函数类型,linear|relu|prelu|... @@ -1675,6 +1694,7 @@ batch_norm - **moving_variance_name** (string,默认None)- moving_variance的名称,存储全局变量 - **do_model_average_for_mean_and_var** (bool,默认False)- 是否为mean和variance做模型均值 - **fuse_with_relu** (bool)- 如果为True,batch norm后该操作符执行relu + - **use_global_stats** (bool, Default False) – 是否使用全局均值和方差。 在预测或测试模式下,将use_global_stats设置为true或将is_test设置为true,并且行为是等效的。 在训练模式中,当设置use_global_stats为True时,在训练期间也使用全局均值和方差。 返回: 张量,在输入中运用批正则后的结果 @@ -1702,17 +1722,17 @@ batch_norm beam_search ------------------------------- -.. py:function:: paddle.fluid.layers.beam_search(pre_ids, pre_scores, ids, scores, beam_size, end_id, level=0, name=None) +.. py:function:: paddle.fluid.layers.beam_search(pre_ids, pre_scores, ids, scores, beam_size, end_id, level=0, is_accumulated=True, name=None, return_parent_idx=False) 在机器翻译任务中,束搜索(Beam search)是选择候选词的一种经典算法 更多细节参考 `Beam Search `_ -该层对束在一时间步中进行搜索。根据候选词使用于源句子所得的 ``scores`` , 从候选词 ``ids`` 中选择当前步骤的 top-K (最佳K)候选词的id,其中 ``K`` 是 ``beam_size`` , ``ids`` , ``scores`` 是计算单元的预测结果。 另外, ``pre_id`` 和 ``pre_scores`` 是上一步中 ``beam_search`` 的输出,用于特殊处理结束边界。 +该层在一时间步中按束进行搜索。具体而言,根据候选词使用于源句子所得的 ``scores`` , 从候选词 ``ids`` 中选择当前步骤的 top-K (最佳K)候选词的id,其中 ``K`` 是 ``beam_size`` , ``ids`` , ``scores`` 是计算单元的预测结果。如果没有提供 ``ids`` ,则将会根据 ``scores`` 计算得出。 另外, ``pre_id`` 和 ``pre_scores`` 是上一步中 ``beam_search`` 的输出,用于特殊处理翻译的结束边界。 -注意,传入的 ``scores`` 应该是累积分数,并且,在计算累积分数之前应该使用额外的 operators 进行长度惩罚,也建议在计算前查找top-K,然后使用top-K候选项。 +注意,如果 ``is_accumulated`` 为 True,传入的 ``scores`` 应该是累积分数。反之,``scores`` 会被认为为直接得分(straightforward scores), 并且会被转化为log值并且在此运算中会被累积到 ``pre_scores`` 中。在计算累积分数之前应该使用额外的 operators 进行长度惩罚。 -有关完全波束搜索用法演示,请参阅以下示例: +有关束搜索用法演示,请参阅以下示例: fluid/tests/book/test_machine_translation.py @@ -1726,9 +1746,12 @@ beam_search - **beam_size** (int) - 束搜索中的束宽度。 - **end_id** (int) - 结束标记的id。 - **level** (int,default 0) - **可忽略,当前不能更改** 。它表示lod的源级别,解释如下。 ``ids`` 的 lod 级别应为2.第一级是源级别, 描述每个源句子(beam)的前缀(分支)的数量,第二级是描述这些候选者属于前缀的句子级别的方式。链接前缀和所选候选者的路径信息保存在lod中。 + - **is_accumulated** (bool,默认为True) - 输入分数是否为累计分数。 - **name** (str | None) - 该层的名称(可选)。如果设置为None,则自动命名该层。 + - **return_parent_idx** (bool) - 是否返回一个额外的Tensor变量,在输出的pre_ids中保留selected_ids的双亲indice,可用于在下一个时间步收集单元状态。 + -返回:LodTensor pair , 包含所选的ID和相应的分数 +返回:LodTensor元组。包含所选的id和与其相应的分数。 如果return_parent_idx为True,则包含一个保留selected_ids的双亲indice的额外Tensor变量。 返回类型:Variable @@ -2638,7 +2661,7 @@ cross_entropy - **input** (Variable|list) – 一个形为[N x D]的二维tensor,其中N是batch大小,D是类别(class)数目。 这是由之前的operator计算出的概率,绝大多数情况下是由softmax operator得出的结果 - **label** (Variable|list) – 一个二维tensor组成的正确标记的数据集(ground truth)。 当 ``soft_label`` 为False时,label为形为[N x 1]的tensor。 ``soft_label`` 为True时, label是形为 [N x D]的 tensor - **soft_label** (bool) – 标志位,指明是否需要把给定的标签列表认定为软标签。默认为False。 - - **ignore_index** (int) – 指定一个被无视的目标值,并且这个值不影响输入梯度变化。仅在 ``soft_label`` 为False时生效。 默认值: -100 + - **ignore_index** (int) – 指定一个被无视的目标值,并且这个值不影响输入梯度。仅在 ``soft_label`` 为False时生效。 默认值: kIgnoreIndex 返回: 一个形为[N x 1]的二维tensor,承载了交叉熵损失 @@ -2847,29 +2870,33 @@ dropout操作 丢弃或者保持x的每个元素独立。Dropout是一种正则化技术,通过在训练过程中阻止神经元节点间的联合适应性来减少过拟合。根据给定的丢弃概率dropout操作符随机将一些神经元输出设置为0,其他的仍保持不变。 +dropout op可以从Program中删除,提高执行效率。 + 参数: - **x** (Variable)-输入张量 - **dropout_prob** (float)-设置为0的单元的概率 - **is_test** (bool)-显示是否进行测试用语的标记 - **seed** (int)-Python整型,用于创建随机种子。如果该参数设为None,则使用随机种子。注:如果给定一个整型种子,始终丢弃相同的输出单元。训练过程中勿用固定不变的种子。 - **name** (str|None)-该层名称(可选)。如果设置为None,则自动为该层命名 - - **dropout_implementation** (string) - [‘downgrade_in_infer’(defauld)|’upscale_in_train’] - 其中: - 1.downgrade_in_infer(default), 在预测时减小输出结果 + - **dropout_implementation** (string) - - train: out = input * mask + [‘downgrade_in_infer’(default)|’upscale_in_train’] 其中: - inference: out = input * dropout_prob + 1. downgrade_in_infer(default), 在预测时减小输出结果 - (mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``dropout_prob`` ) + - train: out = input * mask + + - inference: out = input * dropout_prob + + (mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``dropout_prob`` ) - 2.upscale_in_train, 增加训练时的结果 + 2. upscale_in_train, 增加训练时的结果 - train: out = input * mask / ( 1.0 - dropout_prob ) + - train: out = input * mask / ( 1.0 - dropout_prob ) - inference: out = input + - inference: out = input - (make是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``dropout_prob`` ) + (mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``dropout_prob`` ) dropout操作符可以从程序中移除,程序变得高效。 @@ -2897,15 +2924,13 @@ dropout操作符可以从程序中移除,程序变得高效。 dynamic_gru ------------------------------- -.. py:function:: paddle.fluid.layers.dynamic_gru(input, size, param_attr=None, bias_attr=None, is_reverse=False, gate_activation='sigmoid', candidate_activation='tanh', h_0=None) +.. py:function:: paddle.fluid.layers.dynamic_gru(input, size, param_attr=None, bias_attr=None, is_reverse=False, gate_activation='sigmoid', candidate_activation='tanh', h_0=None, origin_mode=False) **实现了Gated Recurrent Unit层。** -详细理论介绍,请参照 `Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling`_。 - -.. _Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling: https://arxiv.org/abs/1412.3555 +如果origin_mode为False,那么gru运算公式来自论文 `Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling `_ 。 公式如下: @@ -2919,6 +2944,24 @@ dynamic_gru .. math:: h_t=(1-u_t)\odot h_{t-1}+u_t\odot \widetilde{h_t} + + + +如果origin_mode为True,那么运算公式来自于 `Learning Phrase Representations using RNN Encoder Decoder for Statistical Machine Translation `_ + + + +公式如下: + +.. math:: + u_t & = act_g(W_{ux}x_{t} + W_{uh}h_{t-1} + b_u)\\ + r_t & = act_g(W_{rx}x_{t} + W_{rh}h_{t-1} + b_r)\\ + \tilde{h_t} & = act_c(W_{cx}x_{t} + W_{ch}(r_t \odot h_{t-1}) + b_c)\\ + h_t & = u_t \odot h_{t-1} + (1-u_t) \odot \tilde{h_t} + + + + 其中, :math:`\odot` 为按元素将向量相乘。 :math:`act_g` 是更新门(update gate)和重置门(reset gate)的激励函数(activation), 常为 :math:`sigmoid` 函数。 :math:`act_c` 是candidate hidden state(候选隐藏状态)的激励函数,常为 :math:`tanh` 。 注意 :math:`W_{ux}x_{t},W_{rx}x_{t},W_{cx}x_{t}` 这些在 input :math:`x_t` 上的操作不包括在该运算中。用户可以选择性地在GRU层之前使用FC层来进行这一操作。 @@ -3262,7 +3305,6 @@ elementwise_add - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由 ``MKLDNN`` 使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -3319,7 +3361,6 @@ elementwise_div - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -3376,7 +3417,6 @@ elementwise_max - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -3434,7 +3474,6 @@ elementwise_min - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -3492,7 +3531,6 @@ elementwise_mul - **x** - (Tensor),元素op的第一个输入张量(Tensor)。 - **y** - (Tensor),元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -3549,7 +3587,6 @@ elementwise_pow - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -3607,7 +3644,6 @@ elementwise_sub - **x** - (Tensor),元素op的第一个输入张量(Tensor)。 - **y** - (Tensor),元素op的第二个输入张量(Tensor)。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - - **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。 - **act** (basestring | None)- 激活应用于输出。 - **name** (basestring | None)- 输出的名称。 @@ -4141,10 +4177,16 @@ group_norm gru_unit ------------------------------- -.. py:function:: paddle.fluid.layers.gru_unit(input, hidden, size, param_attr=None, bias_attr=None, activation='tanh', gate_activation='sigmoid') +.. py:function:: paddle.fluid.layers.gru_unit(input, hidden, size, param_attr=None, bias_attr=None, activation='tanh', gate_activation='sigmoid', origin_mode=False) GRU单元层。GRU执行步骤基于如下等式: + +如果origin_mode为True,则该运算公式来自论文 +`Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling `_ 。 + +公式如下: + .. math:: u_t=actGate(xu_t+W_{u}h_{t-1}+b_u) .. math:: @@ -4153,7 +4195,18 @@ GRU单元层。GRU执行步骤基于如下等式: m_t=actNode(xm_t+W_{c}dot(r_t,h_{t-1})+b_m) .. math:: h_t=dot((1-u_t),m_t)+dot(u_t,h_{t-1}) - + + +如果origin_mode为False,则该运算公式来自论文 +`Learning Phrase Representations using RNN Encoder Decoder for Statistical Machine Translation `_ 。 + +.. math:: + u_t & = act_g(W_{ux}x_{t} + W_{uh}h_{t-1} + b_u)\\ + r_t & = act_g(W_{rx}x_{t} + W_{rh}h_{t-1} + b_r)\\ + \tilde{h_t} & = act_c(W_{cx}x_{t} + W_{ch}(r_t \odot h_{t-1}) + b_c)\\ + h_t & = u_t \odot h_{t-1} + (1-u_t) \odot \tilde{h_t} + + GRU单元的输入包括 :math:`z_t` , :math:`h_{t-1}` 。在上述等式中, :math:`z_t` 会被分割成三部分: :math:`xu_t` 、 :math:`xr_t` 和 :math:`xm_t` 。 这意味着要为一批输入实现一个全GRU层,我们需要采用一个全连接层,才能得到 :math:`z_t=W_{fc}x_t` 。 :math:`u_t` 和 :math:`r_t` 分别代表了GRU神经元的update gates(更新门)和reset gates(重置门)。 @@ -4330,13 +4383,13 @@ hsigmoid可以把时间复杂度 :math:`O(N)` 优化到 :math:`O(logN)` ,其中 使用默认树结构,请参考 `Hierarchical Probabilistic Neural Network Language Model `_ 。 -若要使用自定义树结构,请设置 ``is_custom`` 值为True。但在此之前,请完成以下几步部署: +若要使用自定义树结构,请设置 ``is_custom`` 值为True。但在此之前,请完成以下几步: 1.使用自定义词典来建立二叉树,每个叶结点都应该是词典中的单词 -2.建立一个dict类型数据结构,来存储 **单词id -> 该单词叶结点至根节点路径** 的映射,称之为路径表 ``path_table`` 参数 +2.建立一个dict类型数据结构,来存储 **单词id -> 该单词叶结点至根结点路径** 的映射,称之为路径表 ``path_table`` 参数 -3.建立一个dict类型数据结构,来存储 **单词id -> 该单词叶结点至根节点路径的编码(code)** 的映射。 编码code是指每次二分类的标签,1为真,0为假 +3.建立一个dict类型数据结构,来存储 **单词id -> 该单词叶结点至根结点路径的编码(code)** 的映射。 编码code是指每次二分类的标签,1为真,0为假 4.现在我们的每个单词都已经有自己的路径和路径编码,当对于同一批输入进行操作时,你可以同时传入一批路径和路径编码进行运算。 @@ -4503,9 +4556,9 @@ im2sequence image_resize ------------------------------- -.. py:function:: paddle.fluid.layers.image_resize(input, out_shape=None, scale=None, name=None, resample='BILINEAR', actual_shape=None) +.. py:function:: paddle.fluid.layers.image_resize(input, out_shape=None, scale=None, name=None, resample='BILINEAR', actual_shape=None, align_corners=True, align_mode=1) -调整一批图片的大小 +调整一个batch中图片的大小。 输入张量的shape为(num_batch, channels, in_h, in_w),并且调整大小只适用于最后两个维度(高度和宽度)。 @@ -4515,6 +4568,75 @@ image_resize NEAREST:最近邻插值 + +最近邻插值是在输入张量的第3维(高度)和第4维(宽度)上进行最近邻插值。 + +双线性插值是线性插值的扩展,用于在直线2D网格上插值两个变量(例如,该操作中的H方向和W方向)的函数。 关键思想是首先在一个方向上执行线性插值,然后在另一个方向上再次执行线性插值。 + +Align_corners和align_mode是可选参数,插值的计算方法可以由它们选择。 + +示例: + +:: + + For scale: + + if align_corners = True && out_size > 1 : + + scale_factor = (in_size-1.0)/(out_size-1.0) + + else: + + scale_factor = float(in_size/out_size) + + + Nearest neighbor interpolation: + + if: + align_corners = False + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = \left \lfloor {H_{in} * scale_{}factor}} \right \rfloor + W_out = \left \lfloor {W_{in} * scale_{}factor}} \right \rfloor + + else: + align_corners = True + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = round(H_{in} * scale_{factor}) + W_out = round(W_{in} * scale_{factor}) + + Bilinear interpolation: + + if: + align_corners = False , align_mode = 0 + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = (H_{in}+0.5) * scale_{factor} - 0.5 + W_out = (W_{in}+0.5) * scale_{factor} - 0.5 + + + else: + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = H_{in} * scale_{factor} + W_out = W_{in} * scale_{factor} + + +有关最近邻插值的详细信息,请参阅维基百科: +https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation。 + +有关双线性插值的详细信息,请参阅维基百科: +https://en.wikipedia.org/wiki/Bilinear_interpolation。 + 参数: - **input** (Variable) - 图片调整层的输入张量,这是一个shape=4的张量(num_batch, channels, in_h, in_w) - **out_shape** (list|tuple|Variable|None) - 图片调整层的输出,shape为(out_h, out_w)。默认值:None @@ -4522,18 +4644,22 @@ image_resize - **name** (str|None) - 该层的名称(可选)。如果设置为None,该层将被自动命名 - **resample** (str) - 重采样方法。目前只支持“双线性”。默认值:双线性插值 - **actual_shape** (Variable) - 可选输入,用于动态指定输出形状。如果指定actual_shape,图像将根据给定的形状调整大小,而不是根据指定形状的 :code:`out_shape` 和 :code:`scale` 进行调整。也就是说, :code:`actual_shape` 具有最高的优先级。如果希望动态指定输出形状,建议使用 :code:`actual_shape` 而不是 :code:`out_shape` 。在使用actual_shape指定输出形状时,还需要设置out_shape和scale之一,否则在图形构建阶段会出现错误。默认值:None - + - **align_corners** (bool)- 一个可选的bool型参数,如果为True,则将输入和输出张量的4个角落像素的中心对齐,并保留角点像素的值。 默认值:True + - **align_mode** (int)- 双线性插值的可选项。 可以是 '0' 代表src_idx = scale *(dst_indx + 0.5)-0.5;可以为'1' ,代表src_idx = scale * dst_index。 返回: 4维tensor,shape为 (num_batches, channls, out_h, out_w). 返回类型: 变量(variable) 抛出异常: - - :code:`TypeError` - out_shape应该是一个列表、元组或变量。 - - :code:`TypeError` - actual_shape应该是变量或None - - :code:`ValueError` - image_resize的"resample"只能是"BILINEAR"或"NEAREST"。 - - :code:`ValueError` - out_shape 和 scale 不能为 None - - :code:`ValueError` - out_shape 的长度必须为 2 + - :code:`TypeError` - out_shape应该是一个列表、元组或变量。 + - :code:`TypeError` - actual_shape应该是变量或None + - :code:`ValueError` - image_resize的"resample"只能是"BILINEAR"或"NEAREST"。 + - :code:`ValueError` - out_shape 和 scale 不可同时为 None + - :code:`ValueError` - out_shape 的长度必须为 2 + - :code:`TypeError` - align_corners 应为bool型 + - :code:`ValueError` - align_mode 只能取 ‘0’ 或 ‘1’ + **代码示例** @@ -5235,12 +5361,12 @@ lstm .. math:: - i_t = \sigma(W_{ix}x_{t} + W_{ih}h_{t-1} + bx_i + bh_i)\\ - f_t = \sigma(W_{fx}x_{t} + W_{fh}h_{t-1} + bx_f + bh_f)\\ - o_t = \sigma(W_{ox}x_{t} + W_{oh}h_{t-1} + bx_o + bh_o)\\ - \tilde{c_t} = tanh(W_{cx}x_t + W_{ch}h_{t-1} + bx_c + bh_c)\\ - c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c_t}\\ - h_t = o_t \odot tanh(c_t) + i_t &= \sigma(W_{ix}x_{t} + W_{ih}h_{t-1} + bx_i + bh_i)\\ + f_t &= \sigma(W_{fx}x_{t} + W_{fh}h_{t-1} + bx_f + bh_f)\\ + o_t &= \sigma(W_{ox}x_{t} + W_{oh}h_{t-1} + bx_o + bh_o)\\ + \tilde{c_t} &= tanh(W_{cx}x_t + W_{ch}h_{t-1} + bx_c + bh_c)\\ + c_t &= f_t \odot c_{t-1} + i_t \odot \tilde{c_t}\\ + h_t &= o_t \odot tanh(c_t) 公式中: - W 项表示权重矩阵(e.g. :math:`W_{ix}` 是从输入门到输入的权重矩阵) @@ -5250,8 +5376,9 @@ lstm - :math:`\odot` 是向量的元素乘积 - tanh是激活函数 - :math:`\tilde{c_t}` 也称为候选隐藏状态,它是根据当前输入和之前的隐藏状态来计算的 - - sigmoid的计算公式为:sigmoid(x) = 1 / (1 + e^-x) - - \*表示点乘,X表示矩阵乘 + +sigmoid的计算公式为: :math:`sigmoid(x) = 1 / (1 + e^{-x})` 。 + 参数: - **input** (Variable) - LSTM 输入张量,形状必须为(seq_len x,batch_size,x,input_size) @@ -5267,10 +5394,13 @@ lstm - **default_initializer** (Initialize|None) – 在哪里使用初始化器初始化权重,如果没有设置,将进行默认初始化。 - **seed** (int) – LSTM中dropout的Seed,如果是-1,dropout将使用随机Seed -返回: - - LSTM hidden的结果:形状(seq_len x batch_size x hidden_size)如果is_bidirec设置为True,形状为(seq_len x batch_sze hidden_size * 2) - - last_h(Tensor): LSTM最后一步的隐藏状态,形状为(num_layers x batch_size x hidden_size);如果is_bidirec设置为True,形状为(num_layers*2 x batch_size x hidden_size) - - last_c(Tensor): LSTM最后一步的cell状态,形状为(num_layers x batch_size x hidden_size);如果is_bidirec设置为True,形状为(num_layers*2 x batch_size x hidden_size) +返回: 三个张量, rnn_out, last_h, last_c: + +- rnn_out为LSTM hidden的输出结果。形为(seq_len x batch_size x hidden_size)如果is_bidirec设置为True,则形为(seq_len x batch_sze hidden_size * 2) +- last_h(Tensor): LSTM最后一步的隐藏状态,形状为(num_layers x batch_size x hidden_size);如果is_bidirec设置为True,形状为(num_layers*2 x batch_size x hidden_size) +- last_c(Tensor): LSTM最后一步的cell状态,形状为(num_layers x batch_size x hidden_size);如果is_bidirec设置为True,形状为(num_layers*2 x batch_size x hidden_size) + +返回类型: rnn_out(Tensor),last_h(Tensor),last_c(Tensor) **代码示例:** @@ -5562,20 +5692,26 @@ mean_iou 均值IOU(Mean Intersection-Over-Union)是语义图像分割中的常用的评价指标之一,它首先计算每个语义类的IOU,然后计算类之间的平均值。定义如下: - .. math:: IOU = \frac{true_{positive}}{true_{positive}+false_{positive}+false_{negative}} +.. math:: + + IOU = \frac{true\_positive}{true\_positive+false\_positive+false\_negative} -在一个混淆矩阵中累积得到预测值,然后从中计算均值-IOU。 +在一个confusion矩阵中累积得到预测值,然后从中计算均值-IOU。 参数: - **input** (Variable) - 类型为int32或int64的语义标签的预测结果张量。 - **label** (Variable) - int32或int64类型的真实label张量。它的shape应该与输入相同。 - **num_classes** (int) - 标签可能的类别数目。 -返回: 张量,shape为[1], 代表均值IOU。out_wrong(变量):张量,shape为[num_classes]。每个类别中错误的个数。out_correct(变量):张量,shape为[num_classes]。每个类别中的正确个数。 +返回: 返回三个变量: -返回类型: mean_iou(Variable) +- mean_iou: 张量,形为[1], 代表均值IOU。 +- out_wrong: 张量,形为[num_classes]。每个类别中错误的个数。 +- out_correct:张量,形为[num_classes]。每个类别中的正确的个数。 -**代码示例**: +返回类型: mean_iou (Variable),out_wrong(Variable),out_correct(Variable) + +**代码示例** .. code-block:: python @@ -5933,8 +6069,8 @@ pad2d 参数: - **input** (Variable) - 具有[N, C, H, W]格式或[N, H, W, C]格式的输入图像。 - - **paddings** (tuple|list) - 填充区域的大小。如果填充是一个元组,它必须包含四个整数, - (padding_top、padding_bottom、padding_left、padding_right)。默认:padding =[0,0,0,0]。 + - **paddings** (tuple|list|Variable) - 填充区域的大小。如果填充是一个元组,它必须包含四个整数, + (padding_top, padding_bottom, padding_left, padding_right)。默认:padding =[0,0,0,0]。 - **mode** (str) - 三种模式:constant(默认)、reflect、edge。默认值:常数 - **pad_value** (float32) - 以常量模式填充填充区域的值。默认值:0 - **data_format** (str) - 可选字符串,选项有: ``NHWC`` , ``NCHW``。指定输入数据的数据格式。默认值:``NCHW`` @@ -6060,7 +6196,7 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核 .. math:: W_{out} = \frac{(W_{in} - ksize[1] + 2 * paddings[1] + strides[1] - 1)}{strides[1]} + 1 -如果 ``exclusive`` = true: +如果 ``exclusive`` = false: .. math:: hstart &= i * strides[0] - paddings[0] \\ @@ -6069,7 +6205,7 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核 wend &= wstart + ksize[1] \\ Output(i ,j) &= \frac{sum(Input[hstart:hend, wstart:wend])}{ksize[0] * ksize[1]} -如果 ``exclusive`` = false: +如果 ``exclusive`` = true: .. math:: hstart &= max(0, i * strides[0] - paddings[0])\\ @@ -6101,13 +6237,13 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核 - ``ValueError`` - 如果 ``global_pooling`` 为False并且‘pool_size’为-1 - ``ValueError`` - 如果 ``use_cudnn`` 不是bool值 -**代码示例**: +**代码示例** .. code-block:: python data = fluid.layers.data( name='data', shape=[3, 32, 32], dtype='float32') - conv2d = fluid.layers.pool2d( + pool2d = fluid.layers.pool2d( input=data, pool_size=2, pool_type='max', @@ -6131,6 +6267,56 @@ pool3d 函数使用上述输入参数的池化配置,为三维空间添加池化操作 +pooling3d操作根据input,pool_type,pool_size,strides和paddings参数计算输出。 输入(X)和输出(输出)采用NCDHW格式,其中N是批量大小,C是通道数,D,H和W分别是特征的深度,高度和宽度。 参数(ksize,strides,paddings)是三个元素。 这三个元素分别代表深度,高度和宽度。 输入(X)大小和输出(Out)大小可能不同。 + + +例如, + +输入X形为 :math:`(N, C, D_{in}, H_{in}, W_{in})` ,输出形为 :math:`(N, C, D_{out}, H_{out}, W_{out})` + +当ceil_mode = false时, + +.. math:: + + D_{out} &= \frac{(D_{in} - ksize[0] + 2 * paddings[0])}{strides[0]} + 1\\ + H_{out} &= \frac{(H_{in} - ksize[1] + 2 * paddings[1])}{strides[2]} + 1\\ + W_{out} &= \frac{(W_{in} - ksize[2] + 2 * paddings[2])}{strides[2]} + 1 + +当ceil_mode = true时, + +.. math:: + + D_{out} &= \frac{(D_{in} - ksize[0] + 2 * paddings[0] + strides[0] -1)}{strides[0]} + 1\\ + H_{out} &= \frac{(H_{in} - ksize[1] + 2 * paddings[1] + strides[1] -1)}{strides[1]} + 1\\ + W_{out} &= \frac{(W_{in} - ksize[2] + 2 * paddings[2] + strides[2] -1)}{strides[2]} + 1 + +当exclusive = false时, + +.. math:: + + dstart &= i * strides[0] - paddings[0]\\ + dend &= dstart + ksize[0]\\ + hstart &= j * strides[1] - paddings[1]\\ + hend &= hstart + ksize[1]\\ + wstart &= k * strides[2] - paddings[2]\\ + wend &= wstart + ksize[2]\\ + Output(i ,j, k) &= \frac{sum(Input[dstart:dend, hstart:hend, wstart:wend])}{ksize[0] * ksize[1] * ksize[2]} + + + +当exclusive = true时, + +.. math:: + + dstart &= max(0, i * strides[0] - paddings[0])\\ + dend &= min(D, dstart + ksize[0])\\ + hstart &= max(0, j * strides[1] - paddings[1])\\ + hend &= min(H, hstart + ksize[1])\\ + wstart &= max(0, k * strides[2] - paddings[2])\\ + wend &= min(W, wstart + ksize[2])\\ + Output(i ,j, k) &= \frac{sum(Input[dstart:dend, hstart:hend, wstart:wend])}{(dend - dstart) * (hend - hstart) * (wend - wstart)} + + 参数: - **input** (Vairable) - 池化运算的输入张量。输入张量的格式为NCDHW, N是批尺寸,C是通道数,D是特征深度,H是特征高度,W是特征宽度。 - **pool_size** (int|list|tuple) - 池化窗口的大小。如果为元组类型,那么它应该是由三个整数组成:深度,高度,宽度。如果是int类型,它应该是一个整数的立方。 @@ -6147,7 +6333,18 @@ pool3d 返回类型:变量(Variable) +**代码示例** +.. code-block:: python + + data = fluid.layers.data( + name='data', shape=[3, 32, 32, 32], dtype='float32') + pool3d = fluid.layers.pool3d( + input=data, + pool_size=2, + pool_type='max', + pool_stride=1, + global_pooling=False) @@ -6389,7 +6586,7 @@ P 的取值可为: {0, 1} 或 {0, 0.5, 1}, 其中,0.5表示输入的两文 o_{i,j} &= o_i - o_j \\ \tilde{P_{i,j}} &= \left \{0, 0.5, 1 \right \} \ or \ \left \{0, 1 \right \} -排序损失层的输入为batch_size (batch_size >= 1) +排序损失层的输入带有batch_size (batch_size >= 1) 参数: - **label** (Variable):A的排名是否高于B @@ -6397,21 +6594,21 @@ P 的取值可为: {0, 1} 或 {0, 0.5, 1}, 其中,0.5表示输入的两文 - **right** (Variable): RankNet对doc B的输出分数 - **name** (str|None):此层的名称(可选)。如果没有设置,层将自动命名。 -返回:variable:形为[N, H, W, 2]的输出 +返回:rank loss的值 -抛出异常:ValueError: 如果参数为不支持的类型 +返回类型: list +抛出异常: ``ValueError`` - label, left, 和right至少有一者不是variable变量类型。 **代码示例** .. code-block:: python - theta = fluid.layers.data(name="x", shape=[2, 3], dtype="float32") - out_shape = fluid.layers.data(name="y", shape=[-1], dtype="float32") - data = fluid.layers.affine_grid(theta, out_shape) - - # or - data = fluid.layers.affine_grid(theta, [5, 3, 28, 28]) + label = fluid.layers.data(name="label", shape=[4, 1], dtype="float32") + left = fluid.layers.data(name="left", shape=[4, 1], dtype="float32") + right = fluid.layers.data(name="right", shape=[4, 1], dtype="float32") + out = fluid.layers.rank_loss(label, left, right) + @@ -6800,23 +6997,64 @@ reshape resize_bilinear ------------------------------- -.. py:function:: paddle.fluid.layers.resize_bilinear(input, out_shape=None, scale=None, name=None, actual_shape=None) +.. py:function:: paddle.fluid.layers.resize_bilinear(input, out_shape=None, scale=None, name=None, actual_shape=None, align_corners=True, align_mode=1) 根据指定的out_shape执行双线性插值调整输入大小,输出形状按优先级由actual_shape、out_shape和scale指定。 双线性插值是对线性插值的扩展,即二维变量方向上(如h方向和w方向)插值。关键思想是先在一个方向上执行线性插值,然后再在另一个方向上执行线性插值。 - `详情请参阅维基百科 https://en.wikipedia.org/wiki/Bilinear_interpolation `_ +详情请参阅 `维基百科 `_ 。 + +align_corners和align_mode是可选参数,插值的计算方法可以由它们选择。 + + +:: + + Example: + + For scale: + + if align_corners = True && out_size > 1 : + + scale_factor = (in_size-1.0)/(out_size-1.0) + + else: + + scale_factor = float(in_size/out_size) + + Bilinear interpolation: + + if align_corners = False , align_mode = 0 + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = (H_{in}+0.5) * scale_{factor} - 0.5 + W_out = (W_{in}+0.5) * scale_{factor} - 0.5 + + + else: + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = H_{in} * scale_{factor} + W_out = W_{in} * scale_{factor} + + 参数: - - **input** (Variable) - 双线性插值的输入张量,是一个shpae为(N x C x h x w)的4d张量。 - - **out_shape** (Variable) - 一维张量,包含两个数。第一个数是高度,第二个数是宽度。 - - **scale** (float|None) - 用于输入高度或宽度的乘数因子。out_shape和scale至少要设置一个。out_shape的优先级高于scale。默认值:None。 - - **name** (str|None) - 输出变量名。 - - **actual_shape** (Variable) - 可选输入,用于动态指定输出形状。如果指定actual_shape,图像将根据给定的形状调整大小,而不是根据指定形状的 :code:`out_shape` 和 :code:`scale` 进行调整。也就是说, :code:`actual_shape` 具有最高的优先级。如果希望动态指定输出形状,建议使用 :code:`actual_shape` 而不是 :code:`out_shape` 。在使用actual_shape指定输出形状时,还需要设置out_shape和scale之一,否则在图形构建阶段会出现错误。默认值:None + - **input** (Variable) - 双线性插值的输入张量,是一个shpae为(N x C x h x w)的4d张量。 + - **out_shape** (Variable) - 一维张量,包含两个数。第一个数是高度,第二个数是宽度。 + - **scale** (float|None) - 用于输入高度或宽度的乘数因子。out_shape和scale至少要设置一个。out_shape的优先级高于scale。默认值:None。 + - **name** (str|None) - 输出变量名。 + - **actual_shape** (Variable) - 可选输入,用于动态指定输出形状。如果指定actual_shape,图像将根据给定的形状调整大小,而不是根据指定形状的 :code:`out_shape` 和 :code:`scale` 进行调整。也就是说, :code:`actual_shape` 具有最高的优先级。如果希望动态指定输出形状,建议使用 :code:`actual_shape` 而不是 :code:`out_shape` 。在使用actual_shape指定输出形状时,还需要设置out_shape和scale之一,否则在图形构建阶段会出现错误。默认值:None + - **align_corners** (bool)- 一个可选的bool型参数,如果为True,则将输入和输出张量的4个角落像素的中心对齐,并保留角点像素的值。 默认值:True + - **align_mode** (int)- 双线性插值的可选项。 可以是'0'代表src_idx = scale *(dst_indx + 0.5)-0.5;可以为'1' ,代表src_idx = scale * dst_index。 -返回: 输出的维度是(N x C x out_h x out_w) + +返回: 插值运算的输出张量,其各维度是(N x C x out_h x out_w) **代码示例:** @@ -6837,11 +7075,45 @@ resize_bilinear resize_nearest ------------------------------- -.. py:function:: paddle.fluid.layers.resize_nearest(input, out_shape=None, scale=None, name=None, actual_shape=None) +.. py:function:: paddle.fluid.layers.resize_nearest(input, out_shape=None, scale=None, name=None, actual_shape=None, align_corners=True) 该层对输入进行放缩,在第三维(高度方向)和第四维(宽度方向)进行最邻近插值(nearest neighbor interpolation)操作。 输出形状按优先级顺序依据 ``actual_shape`` , ``out_shape`` 和 ``scale`` 而定。 +:: + + Example: + + For scale: + + if align_corners = True && out_size > 1 : + + scale_factor = (in_size-1.0)/(out_size-1.0) + + else: + + scale_factor = float(in_size/out_size) + + + Nearest neighbor interpolation: + + if align_corners = False + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = \left \lfloor {H_{in} * scale_{}factor}} \right \rfloor + W_out = \left \lfloor {W_{in} * scale_{}factor}} \right \rfloor + + else: + align_corners = True + + input : (N,C,H_in,W_in) + output: (N,C,H_out,W_out) where: + + H_out = round(H_{in} * scale_{factor}) + W_out = round(W_{in} * scale_{factor}) + 最邻近插值的详细介绍请参照: `Wiki Nearest-neighbor interpolation `_ @@ -6852,6 +7124,7 @@ resize_nearest - **scale** (float|None) – 输入高、宽的乘法器。 ``out_shape`` 和 ``scale`` 二者至少设置其一。 ``out_shape`` 具有比 ``scale`` 更高的优先级。 默认: None - **name** (str|None) – 输出变量的命名 - **actual_shape** (Variable) – 可选输入, 动态设置输出张量的形状。 如果提供该值, 图片放缩会依据此形状进行, 而非依据 ``out_shape`` 和 ``scale`` 。 即为, ``actual_shape`` 具有最高的优先级。 如果想动态指明输出形状,推荐使用 ``actual_shape`` 取代 ``out_shape`` 。 当使用 ``actual_shape`` 来指明输出形状, ``out_shape`` 和 ``scale`` 也应该进行设置, 否则在图形生成阶段将会报错。默认: None + - **align_corners** (bool)- 一个可选的bool型参数,如果为True,则将输入和输出张量的4个角落像素的中心对齐,并保留角点像素的值。 默认值:True 返回:插值运算的输出张量,是一个形为 (N,C,H,W) 的四维张量 @@ -6977,22 +7250,22 @@ row_conv 双向的RNN在深度语音模型中很有用,它通过对整个序列执行正向和反向传递来学习序列的表示。然而,与单向RNNs不同的是,在线部署和低延迟设置中,双向RNNs具有难度。超前卷积将来自未来子序列的信息以一种高效的方式进行计算,以改进单向递归神经网络。 row convolution operator 与一维序列卷积不同,计算方法如下: -给定输入序列长度为 :math:`t` 的输入序列 :math:`in` 和输入维度 :math:`d` ,以及一个大小为 :math:`context x d` 的滤波器 :math:`W` ,输出序列卷积为: +给定输入序列长度为 :math:`t` 的输入序列 :math:`X` 和输入维度 :math:`D` ,以及一个大小为 :math:`context * D` 的滤波器 :math:`W` ,输出序列卷积为: .. math:: - out_i = \sum_{j=i}^{i+context} in_{j} · W_{i-j} + out_i = \sum_{j=i}^{i+context-1} X_{j} · W_{j-i} 公式中: - - :math:`out_i` : 第i行输出变量 shaoe为[1, D]. - - :math:`context` : 未来上下文(feature context)大小 - - :math:`in_j` : 第j行输出变量,形为[1,D] - - :math:`W_{i-j}` : 第(i-j)行参数,其形状为[1,D]。 + - :math:`out_i` : 第i行输出变量形为[1, D]. + - :math:`context` : 下文(future context)大小 + - :math:`X_j` : 第j行输出变量,形为[1,D] + - :math:`W_{j-i}` : 第(j-i)行参数,其形状为[1,D]。 -`详细请参考设计文档 https://github.com/PaddlePaddle/Paddle/issues/2228#issuecomment-303903645 `_ . +详细请参考 `设计文档 `_ 。 参数: - **input** (Variable) -- 输入是一个LodTensor,它支持可变时间长度的输入序列。这个LodTensor的内部张量是一个具有形状(T x N)的矩阵,其中T是这个mini batch中的总的timestep,N是输入数据维数。 - - **future_context_size** (int) -- 未来上下文大小。请注意,卷积核的shape是[future_context_size + 1, D]。 + - **future_context_size** (int) -- 下文大小。请注意,卷积核的shape是[future_context_size + 1, D]。 - **param_attr** (ParamAttr) -- 参数的属性,包括名称、初始化器等。 - **act** (str) -- 非线性激活函数。 @@ -7845,21 +8118,27 @@ sequence_scatter :: 输入: + input.data = [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0], - [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]] + [1.0, 1.0, 1.0, 1.0, 1.0, 1.0], + [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]] input.dims = [3, 6] - index.data = [[0], [1], [2], [5], [4], [3], [2], [1], [3], [2], [5], [4]] index.lod = [[0, 3, 8, 12]] - - updates.data = [[0.3], [0.3], [0.4], [0.1], [0.2], [0.3], [0.4], [0.0], [0.2], [0.3], [0.1], [0.4]] updates.lod = [[ 0, 3, 8, 12]] + index.data = [[0], [1], [2], [5], [4], [3], [2], [1], [3], [2], [5], [4]] + index.lod = [[0, 3, 8, 12]] + updates.data = [[0.3], [0.3], [0.4], [0.1], [0.2], [0.3], [0.4], [0.0], [0.2], [0.3], [0.1], [0.4]] + updates.lod = [[ 0, 3, 8, 12]] 输出: + out.data = [[1.3, 1.3, 1.4, 1.0, 1.0, 1.0], - [1.0, 1.0, 1.4, 1.3, 1.2, 1.1], [1.0, 1.0, 1.3, 1.2, 1.4, 1.1]] + [1.0, 1.0, 1.4, 1.3, 1.2, 1.1], + [1.0, 1.0, 1.3, 1.2, 1.4, 1.1]] out.dims = X.dims = [3, 6] + 参数: - **input** (Variable) - input 秩(rank) >= 1。 - **index** (Variable) - LoD Tensor, index 是 sequence scatter op 的输入索引,该函数的input将依据index进行更新。 秩(rank)=1。由于用于索引dtype应该是int32或int64。 @@ -7868,7 +8147,7 @@ sequence_scatter 返回: 输出张量维度应该和输入张量相同 -返回类型:output (Variable) +返回类型:Variable **代码示例**: @@ -8158,7 +8437,7 @@ shuffle_channel sigmoid_cross_entropy_with_logits ------------------------------- -.. py:function:: paddle.fluid.layers.sigmoid_cross_entropy_with_logits(x, label, name=None) +.. py:function:: paddle.fluid.layers.sigmoid_cross_entropy_with_logits(x, label, ignore_index=-100, name=None, normalize=False) 在类别不相互独立的分类任务中,该函数可以衡量按元素的可能性误差。可以这么认为,为单一数据点预测标签,它们之间不是完全互斥的关系。例如,一篇新闻文章可以同时关于政治,科技,体育或者同时不包含这些内容。 @@ -8189,7 +8468,9 @@ sigmoid_cross_entropy_with_logits 参数: - **x** (Variable) - (Tensor, 默认 Tensor),形为 N x D 的二维张量,N为batch大小,D为类别数目。该输入是一个由先前运算得出的logit组成的张量。logit是未标准化(unscaled)的log概率, 公式为 :math:`log(\frac{p}{1-p})` - **label** (Variable) - (Tensor, 默认 Tensor) 具有和X相同类型,相同形状的二维张量。该输入张量代表了每个logit的可能标签 + - **ignore_index** (int) - (int,默认kIgnoreIndex)指定被忽略的目标值,它不会影响输入梯度 - **name** (basestring|None) - 输出的名称 + - **normalize** (bool) - 如果为true,则将输出除以除去ignore_index对应目标外的目标数 返回: (Tensor, 默认Tensor), 形为 N x D 的二维张量,其值代表了按元素的逻辑loss @@ -8197,7 +8478,20 @@ sigmoid_cross_entropy_with_logits +**代码示例** + +.. code-block:: python + input = fluid.layers.data( + name='data', shape=[10], dtype='float32') + label = fluid.layers.data( + name='data', shape=[10], dtype='float32') + loss = fluid.layers.sigmoid_cross_entropy_with_logits( + x=input, + label=label, + ignore_index=-1, + normalize=True) # or False + # loss = fluid.layers.reduce_sum(loss) # loss之和 @@ -8226,7 +8520,7 @@ similarity_focus 请参照 `Similarity Focus Layer `_ 。 :: - + 例如 : 给定四维张量 x 形为 (BatchSize, C, A, B), 其中C 为通道Channel数目, @@ -8514,13 +8808,13 @@ softmax_with_cross_entropy - **logits** (Variable) - 未标准化(unscaled)的log概率,一个形为 N X K 的二维张量。 N是batch大小,K是类别总数 - **label** (Variable) - 2-D 张量,代表了正确标注(ground truth), 如果 ``soft_label`` 为 False,则该参数是一个形为 N X 1 的Tensor 。如果 ``soft_label`` 为 True,它是 Tensor ,形为 N X K - **soft_label** (bool) - 是否将输入标签当作软标签。默认为False - - **ignore_index** (int) - 指明要无视的目标值,使之不对输入梯度有贡献。仅在 ``soft_label`` 为False时有效,默认为-100 + - **ignore_index** (int) - 指明要无视的目标值,使之不对输入梯度有贡献。仅在 ``soft_label`` 为False时有效,默认为kIgnoreIndex - **numeric_stable_mode** (bool) – 标志位,指明是否使用一个具有更佳数学稳定性的算法。仅在 ``soft_label`` 为 False的GPU模式下生效. 若 ``soft_label`` 为 True 或者执行场所为CPU, 算法一直具有数学稳定性。 注意使用稳定算法时速度可能会变慢。默认为 False - **return_softmax** (bool) – 标志位,指明是否额外返回一个softmax值, 同时返回交叉熵计算结果。默认为False 返回: - - 如果 ``return_softmax`` 为 False, 则返回交叉熵,一个形为[N x 1]的二维张量 - - 如果 ``return_softmax`` 为 True,则返回元组 (loss, softmax) ,其中交叉熵loss为形为[N x 1]的二维张量,softmax为[N x K]的二维张量 + - 如果 ``return_softmax`` 为 False, 则返回交叉熵损失 + - 如果 ``return_softmax`` 为 True,则返回元组 (loss, softmax) ,其中交叉熵损失为形为[N x 1]的二维张量,softmax为[N x K]的二维张量 返回类型:变量或者两个变量组成的元组 @@ -8935,7 +9229,7 @@ topk 参数: - **input** (Variable)-输入变量可以是一个向量或者更高阶的张量 - - **k** (int)-在输入最后一纬中寻找的前项数目 + - **k** (int|Variable)-在输入最后一维中寻找的前项数目 - **name** (str|None)-该层名称(可选)。如果设为空,则自动为该层命名。默认为空 返回:含有两个元素的元组。元素都是变量。第一个元素是最后维切片的前k项。第二个元素是输入最后维里值索引 @@ -9096,10 +9390,10 @@ unsqueeze .. py:function:: paddle.fluid.layers.unsqueeze(input, axes, name=None) -向张量shape中插入单维函数。获取一个必需axes值,用来插入维度列表。输出张量显示轴的维度索引值。 +向张量shape中插入一个维度。该接口接受axes列表,来指定要插入的维度位置。相应维度变化可以在输出变量中axes指定的索引位置上体现。 比如: - 给定一个张量,例如维度为[3,4,5]的张量,轴为[0,4]的未压缩张量,维度为[1,3,4,5,1] + 给定一个张量,例如维度为[3,4,5]的张量,使用 axes列表为[0,4]来unsqueeze它,则输出维度为[1,3,4,5,1] 参数: - **input** (Variable)- 未压缩的输入变量 @@ -10789,7 +11083,7 @@ anchor_generator 参数: - **input** (Variable) - 输入特征图,格式为NCHW - - **anchor_sizes** (list|tuple|float) - 生成anchor的anchor大小,以绝对像素的形式表示,例如:[64.,128.,256.,512.]若anchor的大小为64,则意味着这个anchor的面积等于64**2。 + - **anchor_sizes** (list|tuple|float) - 生成anchor的anchor大小,以绝对像素的形式表示,例如:[64.,128.,256.,512.]。若anchor的大小为64,则意味着这个anchor的面积等于64**2。 - **aspect_ratios** (list|tuple|float) - 生成anchor的高宽比,例如[0.5,1.0,2.0] - **variance** (list|tuple) - 变量,在框回归delta中使用。默认:[0.1,0.1,0.2,0.2] - **stride** (list|tuple) - anchor在宽度和高度方向上的步长,比如[16.0,16.0] @@ -10801,7 +11095,7 @@ anchor_generator - Variances(Variable): anchor的扩展变量布局为 [H,W,num_priors,4]。 ``H`` 是输入的高度, ``W`` 是输入的宽度, ``num_priors`` 是输入每个位置的框数,每个变量的格式为(xcenter,ycenter,w,h)。 -返回类型:anchor(Variable) +返回类型:Anchors(Variable),Variances(Variable) **代码示例**: @@ -10955,14 +11249,21 @@ Bounding Box Coder 其中tx,ty,tw,th分别表示目标框的中心坐标、宽度和高度。同样地,px,py,pw,ph表示先验框地中心坐标、宽度和高度。pxv,pyv,pwv,phv表示先验框变量,ox,oy,ow,oh表示编码/解码坐标、宽度和高度。 + +在Box Decoding期间,支持两种broadcast模式。 假设目标框具有形状[N,M,4],并且prior框的形状可以是[N,4]或[M,4]。 然后,prior框将沿指定的轴broadcast到目标框。 + + 参数: - **prior_box** (Variable) - 张量,默认float类型的张量。先验框是二维张量,维度为[M,4],存储M个框,每个框代表[xmin,ymin,xmax,ymax],[xmin,ymin]是先验框的左顶点坐标,如果输入数图像特征图,则接近坐标原点。[xmax,ymax]是先验框的右底点坐标 - - **prior_box_var** (Variable) - 张量,默认float类型的张量。先验框是二维张量,维度为[M,4],存储M组变量。PriorBoxVar默认将每个元素置为1 + - **prior_box_var** (Variable|list) - 支持两种输入类型,一是二维张量,维度为[M,4],存储M个prior box。另外是一个含有4个元素的list,所有prior box共用这个list。 - **target_box** (Variable) - LoDTensor或者Tensor,当code_type为‘encode_center_size’,输入可以是二维LoDTensor,维度为[N,4]。当code_type为‘decode_center_size’输入可以为三维张量,维度为[N,M,4]。每个框代表[xmin,ymin,xmax,ymax],[xmin,ymin]是先验框的左顶点坐标,如果输入数图像特征图,则接近坐标原点。[xmax,ymax]是先验框的右底点坐标。该张量包含LoD信息,代表一批输入。批的一个实例可以包含不同的实体数。 - - **code_type** (string,默认encode_center_size) - 编码类型用目标框 + - **code_type** (string,默认encode_center_size) - 编码类型用目标框,可以是encode_center_size或decode_center_size - **box_normalized** (boolean,默认true) - 是否将先验框作为正则框 + - **name** (string) – box编码器的名称 + - **axis** (int) – 在PriorBox中为axis指定的轴broadcast以进行框解码,例如,如果axis为0且TargetBox具有形状[N,M,4]且PriorBox具有形状[M,4],则PriorBox将broadcast到[N,M,4]用于解码。 它仅在code_type为decode_center_size时有效。 默认设置为0。 + -返回:(LoDTensor 或者 Tensor) +返回: - ``code_type`` 为 ``‘encode_center_size’`` 时,形为[N,M,4]的输出张量代表N目标框的结果,目标框用M先验框和变量编码。 - ``code_type`` 为 ``‘decode_center_size’`` 时,N代表batch大小,M代表解码框数 @@ -10971,8 +11272,24 @@ Bounding Box Coder +**代码示例** +.. code-block:: python + prior_box = fluid.layers.data(name='prior_box', + shape=[512, 4], + dtype='float32', + append_batch_size=False) + target_box = fluid.layers.data(name='target_box', + shape=[512,81,4], + dtype='float32', + append_batch_size=False) + output = fluid.layers.box_coder(prior_box=prior_box, + prior_box_var=[0.1,0.1,0.2,0.2], + target_box=target_box, + code_type="decode_center_size", + box_normalized=False, + axis=1) @@ -11036,7 +11353,7 @@ density prior box的量由fixed_sizes and fixed_ratios决定。显然地,fixed num_priors是输入中每个位置的总box count -**代码示例**: +**代码示例** .. code-block:: python @@ -11114,6 +11431,7 @@ detection_map shape=[10, 6], append_batch_size=False, dtype='float32') + map_out = fluid.layers.detection_map(detect_res, label, 21) @@ -11137,9 +11455,9 @@ Detection Output Layer for Single Shot Multibox Detector(SSD) 该操作符用于获得检测结果,执行步骤如下: - 1.根据先验框解码输入边界框(bounding box)预测 + 1.根据prior box框解码输入边界框(bounding box)预测 - 2.通过运用多类非最大压缩(NMS)获得最终检测结果 + 2.通过运用多类非极大值抑制(NMS)获得最终检测结果 请注意,该操作符不将最终输出边界框剪切至图像窗口。 @@ -11156,7 +11474,7 @@ Detection Output Layer for Single Shot Multibox Detector(SSD) - **nms_eta** (float) - 适应NMS的参数 返回: - 检测输出一个LoDTensor,维度为[No,6]。每行有6个值:[label,confidence,xmin,ymin,xmax,ymax]。No是该mini-batch的总检测数。对每个实例,第一维偏移称为LoD,偏移数为N+1,N是批尺寸。第i个图像有LoD[i+1]-LoD[i]检测结果。如果为0,第i个图像无检测结果。如果所有图像都没有检测结果,LoD所有元素都为0,并且输出张量只包含一个值-1。 + 输出一个LoDTensor,形为[No,6]。每行有6个值:[label,confidence,xmin,ymin,xmax,ymax]。No是该mini-batch的总检测数。对每个实例,第一维偏移称为LoD,偏移数为N+1,N是batch size。第i个图像有LoD[i+1]-LoD[i]检测结果。如果为0,第i个图像无检测结果。如果所有图像都没有检测结果,LoD会被设置为{1},并且输出张量只包含一个值-1。(1.3版本后对于没有检测结果的boxes, LoD的值由之前的{0}调整为{1}) 返回类型:变量(Variable) @@ -11459,7 +11777,7 @@ multiclass_nms **多分类NMS** -该运算用于对边界框(bounding box)和评分进行多类非最大抑制(NMS)。 +该运算用于对边界框(bounding box)和评分进行多类非极大值抑制(NMS)。 在NMS中,如果提供 ``score_threshold`` 阈值,则此运算符贪婪地选择具有高于 ``score_threshold`` 的高分数的检测边界框(bounding box)的子集,然后如果nms_top_k大于-1,则选择最大的nms_top_k置信度分数。 接着,该运算符基于 ``nms_threshold`` 和 ``nms_eta`` 参数,通过自适应阈值NMS移去与已经选择的框具有高IOU(intersection over union)重叠的框。 diff --git a/doc/fluid/api_cn/optimizer_cn.rst b/doc/fluid/api_cn/optimizer_cn.rst index a67e42d1268e3ebd53d3b6361d2b2d70326a8f5a..4d8ea463e41bb77f9a6efdf8eb302bf62ad61f89 100644 --- a/doc/fluid/api_cn/optimizer_cn.rst +++ b/doc/fluid/api_cn/optimizer_cn.rst @@ -152,7 +152,7 @@ Adamax 更新规则: AdamOptimizer ------------------------------- -.. py:class:: paddle.fluid.optimizer. AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, regularization=None, name=None) +.. py:class:: paddle.fluid.optimizer.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, regularization=None, name=None, lazy_mode=False) 该函数实现了自适应矩估计优化器,介绍自 `Adam论文 `_ 的第二节。Adam是一阶基于梯度下降的算法,基于自适应低阶矩估计。 Adam更新如下: @@ -168,6 +168,8 @@ Adam更新如下: - **epsilon** (float)-保持数值稳定性的短浮点类型值 - **regularization** - 规则化函数,例如''fluid.regularizer.L2DecayRegularizer - **name** - 可选名称前缀 + - **lazy_mode** (bool: false) - 官方Adam算法有两个移动平均累加器(moving-average accumulators)。累加器在每一步都会更新。在密集模式和稀疏模式下,两条移动平均线的每个元素都会更新。如果参数非常大,那么更新可能很慢。 lazy mode仅更新当前具有梯度的元素,所以它会更快。但是这种模式与原始的算法有不同的描述,可能会导致不同的结果。 + **代码示例**: @@ -285,9 +287,9 @@ FTRL 原始论文: ( `https://www.eecs.tufts.edu/~dsculley/papers/ad-click-predi 参数: - **learning_rate** (float|Variable)-全局学习率。 - - **l1** (float) - 暂无,请等待后期更新 - - **l2** (float) - 暂无,请等待后期更新 - - **lr_power** (float) - 暂无,请等待后期更新 + - **l1** (float) - L1 regularization strength. + - **l2** (float) - L2 regularization strength. + - **lr_power** (float) - 学习率降低指数 - **regularization** - 正则化器,例如 ``fluid.regularizer.L2DecayRegularizer`` - **name** — 可选的名称前缀 @@ -400,7 +402,7 @@ ModelAverage exe.run(inference_program...) -.. py:method:: apply(*args, **kwds) +.. py:method:: apply(executor, need_restore=True) 将平均值应用于当前模型的参数。 diff --git a/doc/fluid/api_cn/profiler_cn.rst b/doc/fluid/api_cn/profiler_cn.rst index bc617ba59a7b9379c8fb2ea69a59c8b0c6b76782..2647650b7b25fb1e5e05c10d3f8f462d637f2192 100644 --- a/doc/fluid/api_cn/profiler_cn.rst +++ b/doc/fluid/api_cn/profiler_cn.rst @@ -9,7 +9,7 @@ cuda_profiler ------------------------------- -.. py:function:: paddle.fluid.profiler.cuda_profiler(*args, **kwds) +.. py:function:: paddle.fluid.profiler.cuda_profiler(output_file, output_mode=None, config=None) CUDA分析器。通过CUDA运行时应用程序编程接口对CUDA程序进行性能分析。分析结果将以键-值对格式或逗号分隔的格式写入output_file。用户可以通过output_mode参数设置输出模式,并通过配置参数设置计数器/选项。默认配置是[' gpustarttimestamp ', ' gpustarttimestamp ', ' gridsize3d ', ' threadblocksize ', ' streamid ', ' enableonstart 0 ', ' conckerneltrace ']。然后,用户可使用 `NVIDIA Visual Profiler `_ 工具来加载这个输出文件以可视化结果。 @@ -62,7 +62,7 @@ CUDA分析器。通过CUDA运行时应用程序编程接口对CUDA程序进行 profiler ------------------------------- -.. py:function:: paddle.fluid.profiler.profiler(*args, **kwds) +.. py:function:: paddle.fluid.profiler.profiler(state, sorted_key=None, profile_path='/tmp/profile') profile interface 。与cuda_profiler不同,此profiler可用于分析CPU和GPU程序。默认情况下,它记录CPU和GPU kernel,如果想分析其他程序,可以参考教程来在c++代码中添加更多代码。 diff --git a/doc/fluid/beginners_guide/install/Tables.md b/doc/fluid/beginners_guide/install/Tables.md index 755305cf09b37b98b5bbbeb08514a20152ed03d8..1644f5bed5e488c2bccb459648cd19f91cddc35d 100644 --- a/doc/fluid/beginners_guide/install/Tables.md +++ b/doc/fluid/beginners_guide/install/Tables.md @@ -1,4 +1,3 @@ -*** # 附录 @@ -36,7 +35,7 @@ SWIG 最低 2.0 - https://github.com/PaddlePaddle/Paddle/tree/develop/doc/design/mkldnn + apt install swig yum install swig @@ -176,11 +175,6 @@ 是否编译带有分布式的版本 OFF - - WITH_MKL - 是否使用MKL数学库,如果为否则是用OpenBLAS - ON - WITH_RDMA 是否编译支持RDMA的相关部分 @@ -245,86 +239,27 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。 - paddlepaddle==[版本号] 如 paddlepaddle==1.0.1(下载1.0.1版本只支持CPU的PaddlePaddle) + paddlepaddle==[版本号] 例如 paddlepaddle==1.2.0 只支持CPU对应版本的PaddlePaddle,具体版本请参见Pypi - paddlepaddle-gpu==1.0.1 - 使用CUDA 9.0和cuDNN 7编译的1.0.1版本 - - - paddlepaddle-gpu==1.0.1.post87 - 使用CUDA 8.0和cuDNN 7编译的1.0.1版本 - - - paddlepaddle-gpu==1.0.1.post85 - 使用CUDA 8.0和cuDNN 5编译的1.0.1版本 - - - paddlepaddle-gpu==1.0.0 - 使用CUDA 9.0和cuDNN 7编译的1.0.0版本 - - - paddlepaddle-gpu==1.0.0.post87 - 使用CUDA 8.0和cuDNN 7编译的1.0.0版本 - - - paddlepaddle-gpu==1.0.0.post85 - 使用CUDA 8.0和cuDNN 5编译的1.0.0版本 - - - paddlepaddle-gpu==0.15.0 - 使用CUDA 9.0和cuDNN 7编译的0.15.0版本 - - - paddlepaddle-gpu==0.15.0.post87 - 使用CUDA 8.0和cuDNN 7编译的0.15.0版本 - - - paddlepaddle-gpu==0.15.0.post85 - 使用CUDA 8.0和cuDNN 5编译的0.15.0版本 - - - paddlepaddle-gpu==0.14.0 - 使用CUDA 9.0和cuDNN 7编译的0.15.0版本 - - - paddlepaddle-gpu==0.14.0.post87 - 使用CUDA 8.0和cuDNN 7编译的0.15.0版本 - - - paddlepaddle-gpu==0.14.0.post85 - 使用CUDA 8.0和cuDNN 5编译的0.15.0版本 - - - paddlepaddle-gpu==0.13.0 - 使用CUDA 9.0和cuDNN 7编译的0.13.0版本 - - - paddlepaddle-gpu==0.12.0 - 使用CUDA 8.0和cuDNN 5编译的0.12.0版本 - - - paddlepaddle-gpu==0.11.0.post87 - 使用CUDA 8.0和cuDNN 7编译的0.11.0版本 + paddlepaddle-gpu==1.2.0 + 使用CUDA 9.0和cuDNN 7编译的1.2.0版本 - paddlepaddle-gpu==0.11.0.post85 - 使用CUDA 8.0和cuDNN 5编译的0.11.0版本 + paddlepaddle-gpu==1.2.0.post87 + 使用CUDA 8.0和cuDNN 7编译的1.2.0版本 - paddlepaddle-gpu==0.11.0 - 使用CUDA 7.5和cuDNN 5编译的0.11.0版本 + paddlepaddle-gpu==1.2.0.post85 + 使用CUDA 8.0和cuDNN 5编译的1.2.0版本

- 您可以在 [Release History](https://pypi.org/project/paddlepaddle-gpu/#history) 中找到PaddlePaddle-gpu的各个发行版本。 - -*** - +需要注意的是,在v1.3版本中, paddlepaddle-gpu 命令在windows环境下,会默认安装CUDA 8.0和cuDNN 5编译的PaddlePaddle *** @@ -425,10 +360,80 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。 paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl + + win_amd64 + - + + paddlepaddle-1.3.0-cp27-cp27m-win_amd64.whl + + paddlepaddle-1.3.0-cp35-cp35m-win_amd64.whl + + paddlepaddle-1.3.0-cp36-cp36m-win_amd64.whl + + paddlepaddle-1.3.0-cp37-cp37m-win_amd64.whl + + + cuda8.0_cudnn5_win_amd64 + - + + paddlepaddle_gpu-1.3.0-cp27-cp27m-win_amd64.whl + + paddlepaddle_gpu-1.3.0-cp35-cp35m-win_amd64.whl + + paddlepaddle_gpu-1.3.0-cp36-cp36m-win_amd64.whl + + paddlepaddle_gpu-1.3.0-cp37-cp37m-win_amd64.whl +

+### 表格说明 + +- 纵轴 + +cpu_noavx_mkl: 只支持CPU训练和预测,使用sse指令集和Intel mkl数学库 + +cpu_avx_mkl: 只支持CPU训练和预测,使用avx指令集和Intel mkl数学库 + +cpu_avx_openblas: 只支持CPU训练和预测,使用avx指令集和openblas数学库 + +cuda8.0_cudnn5_avx_mkl: 支持GPU训练和预测,使用avx指令集和Intel mkl数学库 + +cuda8.0_cudnn7_noavx_mkl: 支持GPU训练和预测,使用sse指令集和Intel mkl数学库 + +cuda8.0_cudnn7_avx_mkl: 支持GPU训练和预测,使用avx指令集和Intel mkl数学库 + +cuda9.0_cudnn7_avx_mkl: 支持GPU训练和预测,使用avx指令集和Intel mkl数学库 + +win_amd64:只支持CPU训练和预测,使用AMD64指令集 + +cuda8.0_cudnn5_win_amd64:支持支持GPU训练和预测,使用AMD64指令集 + +- 横轴 + +一般是类似于“cp27-cp27mu”的形式,其中: + +27:python tag,指python2.7,类似的还有“35”、“36”、“37”等 + +mu:指unicode版本python,若为m则指非unicode版本python + +- 安装包命名规则 + +每个安装包都有一个专属的名字,它们是按照Python的官方规则 来命名的,形式如下: + +{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl + +其中build tag可以缺少,其他部分不能缺少 + +distribution: wheel名称version: 版本,例如0.14.0 (要求必须是数字格式) + +python tag: 类似'py27', 'py2', 'py3',用于标明对应的python版本 + +abi tag: 类似'cp33m', 'abi3', 'none' + +platform tag: 类似 'linux_x86_64', 'any' +

## **多版本whl包列表-dev** diff --git a/doc/fluid/beginners_guide/install/Tables_en.md b/doc/fluid/beginners_guide/install/Tables_en.md index ed8c565242a7b9bccf855c2747b5312834af9050..f55fca8e9f6c1fcd926a2429658132d3d8b9e751 100644 --- a/doc/fluid/beginners_guide/install/Tables_en.md +++ b/doc/fluid/beginners_guide/install/Tables_en.md @@ -177,11 +177,6 @@ Whether to Compile with distributed version OFF - - WITH_MKL - Whether to uses the MKL math library, if not, using OpenBLAS - ON - WITH_RDMA Whether to compile the relevant parts that supports RDMA @@ -244,76 +239,20 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif - paddlepaddle==[version code] such as paddlepaddle==1.0.1 (download version 1.0.1 which only supports CPU PaddlePaddle) + paddlepaddle==[version code] such as paddlepaddle==1.2.0 Only support the corresponding version of the CPU PaddlePaddle, please refer to Pypi for the specific version. - paddlepaddle-gpu==1.0.1 - Using version 1.0.1 compiled with CUDA 9.0 and cuDNN 7 - - - paddlepaddle-gpu==1.0.1.post87 - Using version 1.0.1 compiled with CUDA 8.0 and cuDNN 7 - - - paddlepaddle-gpu==1.0.1.post85 - Using version 1.0.1 compiled with CUDA 8.0 and cuDNN 5 - - - paddlepaddle-gpu==1.0.0 - Using version 1.0.0 compiled with CUDA 9.0 and cuDNN 7 - - - paddlepaddle-gpu==1.0.0.post87 - Using version 1.0.0 compiled with CUDA 8.0 and cuDNN 7 - - - paddlepaddle-gpu==1.0.0.post85 - Using version 1.0.0 compiled with CUDA 8.0 and cuDNN 5 - - - paddlepaddle-gpu==0.15.0 - Using version 0.15.0 compiled with CUDA 9.0 and cuDNN 7 - - - paddlepaddle-gpu==0.15.0.post87 - Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 7 - - - paddlepaddle-gpu==0.15.0.post85 - Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 5 - - - paddlepaddle-gpu==0.14.0 - Using version 0.15.0 compiled with CUDA 9.0 and cuDNN 7 - - - paddlepaddle-gpu==0.14.0.post87 - Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 7 - - - paddlepaddle-gpu==0.14.0.post85 - Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 5 - - - paddlepaddle-gpu==0.13.0 - Using version 0.13.0 compiled with CUDA 9.0 and cuDNN 7 - - - paddlepaddle-gpu==0.12.0 - Using version 0.12.0 compiled with CUDA 8.0 and cuDNN 5 - - - paddlepaddle-gpu==0.11.0.post87 - Using version 0.11.0 compiled with CUDA 8.0 and cuDNN 7 + paddlepaddle-gpu==1.2.0 + Using version 1.2.0 compiled with CUDA 9.0 and cuDNN 7 - paddlepaddle-gpu==0.11.0.post85 - Using version 0.11.0 compiled with CUDA 8.0 and cuDNN 5 + paddlepaddle-gpu==1.2.0.post87 + Using version 1.2.0 compiled with CUDA 8.0 and cuDNN 7 - paddlepaddle-gpu==0.11.0 - Using version 0.11.0 compiled with CUDA 7.5 and cuDNN 5 + paddlepaddle-gpu==1.2.0.post85 + Using version 1.2.0 compiled with CUDA 8.0 and cuDNN 5 @@ -322,6 +261,7 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif You can find various distributions of PaddlePaddle-gpu in [the Release History](https://pypi.org/project/paddlepaddle-gpu/#history). +Please note that: paddlepaddle-gpu==1.3.0 in windows, will download package compiled with CUDA 8.0 and cuDNN 5 *** @@ -382,81 +322,105 @@ You can find the docker image for each release of PaddlePaddle in the [DockerHub cpu-noavx-mkl - - paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl - - paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl + + paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl cpu_avx_mkl - - paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl - - paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl + + paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl cpu_avx_openblas - - paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl - paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl - - paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl + paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl + + paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl cuda8.0_cudnn5_avx_mkl - paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl - paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl - paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl cuda8.0_cudnn7_noavx_mkl - paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl - paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl - paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl cuda8.0_cudnn7_avx_mkl - paddlepaddle_gpu-1.2.1.post87-cp27-cp27mu-linux_x86_64.whl - paddlepaddle_gpu-1.2.1.post87-cp27-cp27m-linux_x86_64.whl - paddlepaddle_gpu-1.2.1.post87-cp35-cp35m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1.post87-cp36-cp36m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1.post87-cp37-cp37m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0.post87-cp27-cp27mu-linux_x86_64.whl + paddlepaddle_gpu-1.3.0.post87-cp27-cp27m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0.post87-cp35-cp35m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0.post87-cp36-cp36m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0.post87-cp37-cp37m-linux_x86_64.whl cuda9.0_cudnn7_avx_mkl - paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl - paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl - paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl - - paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl + paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl + + paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl + + + win_amd64 + - + + paddlepaddle-1.3.0-cp27-cp27m-win_amd64.whl + + paddlepaddle-1.3.0-cp35-cp35m-win_amd64.whl + + paddlepaddle-1.3.0-cp36-cp36m-win_amd64.whl + + paddlepaddle-1.3.0-cp37-cp37m-win_amd64.whl + + + cuda8.0_cudnn5_win_amd64 + - + + paddlepaddle_gpu-1.3.0-cp27-cp27m-win_amd64.whl + + paddlepaddle_gpu-1.3.0-cp35-cp35m-win_amd64.whl + + paddlepaddle_gpu-1.3.0-cp36-cp36m-win_amd64.whl + + paddlepaddle_gpu-1.3.0-cp37-cp37m-win_amd64.whl diff --git a/doc/fluid/beginners_guide/programming_guide/programming_guide.md b/doc/fluid/beginners_guide/programming_guide/programming_guide.md index b5493e7776d2a84ae3614fb015ac57384381f5eb..bb488b44699b16fffd13216a42152efb18662833 100644 --- a/doc/fluid/beginners_guide/programming_guide/programming_guide.md +++ b/doc/fluid/beginners_guide/programming_guide/programming_guide.md @@ -133,8 +133,8 @@ exe.run(fluid.default_startup_program()) #网络参数初始化 #准备数据 import numpy -data_1 = input("a=") -data_2 = input("b=") +data_1 = int(input("Please enter an integer: a=")) +data_2 = int(input("Please enter an integer: b=")) x = numpy.array([[data_1]]) y = numpy.array([[data_2]]) diff --git a/doc/fluid/beginners_guide/programming_guide/programming_guide_en.md b/doc/fluid/beginners_guide/programming_guide/programming_guide_en.md index 0919da1768f33a4a0a45923f6577be4f629c04d6..d6383d22bc7a06f934e17078f8fed517d823cf1a 100644 --- a/doc/fluid/beginners_guide/programming_guide/programming_guide_en.md +++ b/doc/fluid/beginners_guide/programming_guide/programming_guide_en.md @@ -137,8 +137,8 @@ exe.run(fluid.default_startup_program()) #initialize network parameters #Prepare data import numpy -data_1 = input("a=") -data_2 = input("b=") +data_1 = int(input("Please enter an integer: a=")) +data_2 = int(input("Please enter an integer: b=")) x = numpy.array([[data_1]]) y = numpy.array([[data_2]]) diff --git a/external/book b/external/book index 2e55fd4630de30ecf86e5c59f89285e5786762ba..2a1d135ccd10247954ba4cc5f870580a76b4530f 160000 --- a/external/book +++ b/external/book @@ -1 +1 @@ -Subproject commit 2e55fd4630de30ecf86e5c59f89285e5786762ba +Subproject commit 2a1d135ccd10247954ba4cc5f870580a76b4530f