未验证 提交 b2544dd4 编写于 作者: C Cheerego 提交者: GitHub

Weekly cherrypick0302 (#668)

* Update programming_guide.md (#664)

* Update programming_guide.md

* Update programming_guide_en.md

* Update cn api to 1.3 (#663)

* Update cn api to 1.3 fluid & layers

* Rest to 1.3

* Weeklyupdate 0301 (#666)

* Tables_rm_op

* update_op

* update_index

* update_book_0302 (#667)
上级 c6fa65e1
############# #############
新增operator 新增Operator
############# #############
- `op相关的一些注意事项 <../../../advanced_usage/development/new_op/op_notes.html>`_ :介绍op相关的一些注意事项 本部分将指导您如何新增Operator,也包括一些必要的注意事项
- `如何写新的op <./new_op.html>`_
- `op相关注意事项 <./op_notes.html>`_
.. toctree:: .. toctree::
:hidden: :hidden:
new_op.md
op_notes.md op_notes.md
# 如何写新的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需要包含的内容如下:
<table>
<thead>
<tr>
<th>内容</th>
<th>定义位置</th>
</tr>
</thead>
<tbody>
<tr>
<td>OpProtoMake定义 </td>
<td>.cc 文件,Backward Op不需要定义OpProtoMake </td>
</tr>
<tr>
<td>Op定义 </td>
<td> .cc 文件</td>
</tr>
<tr>
<td>Kernel实现 </td>
<td> CPU、CUDA共享Kernel实现在.h 文件中,否则,CPU 实现在.cc 文件中,CUDA 实现在.cu 文件中。</td>
</tr>
<tr>
<td>注册Op </td>
<td> Op注册实现在.cc 文件;Kernel注册CPU实现在.cc 文件中,CUDA实现在.cu 文件中</td>
</tr>
</tbody>
</table>
实现新的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 <typename AttrType>
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<AttrType>("scale",
"(float, default 1.0)"
"The scaling factor of the scale operator.")
.SetDefault(1.0);
}
};
```
这个例子有`AddAttr<AttrType>("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<framework::OpDesc> 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<framework::OpDesc>(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<Tensor> or Output<Tensor> if you want a to get a LoDTensor.
auto dim0 = ctx.Input<LoDTensor>("X")->dims();
auto dim1 = ctx.Input<LoDTensor>("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<LoDTensor>("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<T>()``ExecutionContext::Output<T>()`获得。
**注意:** 若op的输入/输出的变量类型是`LoDTensor`(fluid默认所有的Tensor默认都是LoDTensor类型),请写成`ExecutionContext::Input<LoDTensor>()``ExecutionContext::Output<LoDTensor>()`,不要写`ExecutionContext::Input<Tensor>()``ExecutionContext::Output<Tensor>()`。因为若实际的变量类型为`SelectedRows``Input<Tensor>()``Output<Tensor>()`方法会将`SelectedRows`类型特化为`Tensor`,导致潜在的错误。
下面是 `MulKernel` `Compute`的实现:
```cpp
template <typename DeviceContext, typename T>
class MulKernel : public framework::OpKernel {
public:
void Compute(const framework::ExecutionContext& context) const override {
auto* X = context.Input<LoDTensor>("X");
auto* Y = context.Input<LoDTensor>("Y");
auto* Z = context.Output<LoDTensor>("Out");
Z->mutable_data<T>(context.GetPlace());
auto& device_context = context.template device_context<DeviceContext>();
math::matmul<DeviceContext, T>(*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<true>)
REGISTER_OPERATOR(mul_grad, ops::MulGradOp)
REGISTER_OP_CPU_KERNEL(mul, ops::MulKernel<paddle::platform::CPUDeviceContext, float>);
REGISTER_OP_CPU_KERNEL(mul_grad,
ops::MulGradKernel<paddle::platform::CPUDeviceContext, float>);
```
在上面的代码中:
- `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<paddle::platform::CUDADeviceContext, float>);
REGISTER_OP_CUDA_KERNEL(mul_grad,
ops::MulGradKernel<paddle::platform::CUDADeviceContext, float>);
```
### 编译
运行下面命令可以进行编译:
```
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<framework::LoDTensor>("Out");
auto *in = ctx.Input<framework::LoDTensor>("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.");
```
../../../dev/new_op_cn.md
\ No newline at end of file
# op相关的一些注意事项 # op相关注意事项
## Fluid中Op的构建逻辑 ## Fluid中Op的构建逻辑
### 1.Fluid中Op的构建逻辑 ### 1.Fluid中Op的构建逻辑
......
...@@ -16,13 +16,13 @@ ErrorClipByValue ...@@ -16,13 +16,13 @@ ErrorClipByValue
给定一个张量 ``t`` ,该操作将它的值压缩到 ``min`` 和 ``max`` 之间 给定一个张量 ``t`` ,该操作将它的值压缩到 ``min`` 和 ``max`` 之间
- 任何小于最小值的值都被设置为最小值 - 任何小于min(最小值)的值都被设置为min
- 任何大于max的值都被设置为max - 任何大于max(最大值)的值都被设置为max
参数: 参数:
- **max** (foat) - 要修剪的最大值。 - **max** (foat) - 要修剪的最大值。
- **min** (float) - 要修剪的最小值。如果用户没有设置,将被 ``framework`` 设置为 ``-max`` - **min** (float) - 要修剪的最小值。如果用户没有设置,将被框架默认设置为 ``-max``
**代码示例** **代码示例**
......
...@@ -15,6 +15,8 @@ Executor ...@@ -15,6 +15,8 @@ Executor
执行引擎(Executor)使用python脚本驱动,仅支持在单GPU环境下运行。多卡环境下请参考 ``ParallelExecutor`` 。 执行引擎(Executor)使用python脚本驱动,仅支持在单GPU环境下运行。多卡环境下请参考 ``ParallelExecutor`` 。
Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表) Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表)
向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。 向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。
...@@ -28,12 +30,38 @@ Executor将全局变量存储到全局作用域中,并为临时变量创建局 ...@@ -28,12 +30,38 @@ Executor将全局变量存储到全局作用域中,并为临时变量创建局
program中所有的算子会按顺序执行。 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`` 的执行场所 - **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所
提示:你可以用Executor来调试基于并行GPU实现的复杂网络,他们有完全一样的参数也会产生相同的结果。 提示:你可以用 ``Executor`` 来调试基于并行GPU实现的复杂网络,他们有完全一样的参数也会产生相同的结果。
.. py:method:: close() .. py:method:: close()
...@@ -62,8 +90,8 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 ...@@ -62,8 +90,8 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后
应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。 应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。
参数: 参数:
- **program** (Program) – 需要执行的program,如果没有给定那么默认使用default_main_program - **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的)
- **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LableData} - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData}
- **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果 - **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果
- **feed_var_name** (str) – 前向算子(feed operator)变量的名称 - **feed_var_name** (str) – 前向算子(feed operator)变量的名称
- **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称 - **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称
...@@ -80,19 +108,17 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 ...@@ -80,19 +108,17 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后
.. code-block:: python .. code-block:: python
data = fluid.layers.data(name='X', shape=[1], dtype='float32') data = fluid.layers.data(name='X', shape=[1], dtype='float32')
out = fluid.layers.create_tensor(dtype='float32') out = fluid.layers.create_tensor(dtype='float32')
hidden = fluid.layers.fc(input=data, size=10) hidden = fluid.layers.fc(input=data, size=10)
fluid.layers.assign(hidden, out) fluid.layers.assign(hidden,out)
loss = fluid.layers.mean(out) loss = fluid.layers.mean(out)
adam = fluid.optimizer.Adam() adam = fluid.optimizer.Adam()
adam.minimize(loss) # adam.minimize(loss)
.. code-block:: python .. code-block:: python
cpu = core.CPUPlace() cpu = core.CPUPlace()
exe = fluid.Executor(cpu) exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program()) exe.run(fluid.default_startup_program())
...@@ -118,7 +144,7 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 ...@@ -118,7 +144,7 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后
global_scope global_scope
------------------------------- -------------------------------
.. py:function:: paddle.fluid.global_scope() .. py:function:: paddle.fluid.global_scope ()
获取全局/默认作用域实例。很多api使用默认 ``global_scope`` ,例如 ``Executor.run`` 。 获取全局/默认作用域实例。很多api使用默认 ``global_scope`` ,例如 ``Executor.run`` 。
...@@ -137,7 +163,7 @@ global_scope ...@@ -137,7 +163,7 @@ global_scope
scope_guard scope_guard
------------------------------- -------------------------------
.. py:function:: paddle.fluid.scope_guard(*args, **kwds) .. py:function:: paddle.fluid.scope_guard (scope)
修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。 修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。
......
...@@ -9,13 +9,14 @@ ...@@ -9,13 +9,14 @@
AsyncExecutor AsyncExecutor
------------------------------- -------------------------------
.. py:class:: paddle.fluid.AsyncExecutor(place=None) .. py:class:: paddle.fluid.AsyncExecutor(place=None, run_mode='')
**AsyncExecutor正在积极开发,API可能在短期内进行调整。**
Python中的异步执行器。AsyncExecutor利用多核处理器和数据排队的强大功能,使数据读取和融合解耦,每个线程并行运行。 Python中的异步执行器。AsyncExecutor利用多核处理器和数据排队的强大功能,使数据读取和融合解耦,每个线程并行运行。
AsyncExecutor不是在python端读取数据,而是接受一个训练文件列表,该列表将在c++中检索,然后训练输入将被读取、解析并在c++代码中提供给训练网络。 AsyncExecutor不是在python端读取数据,而是接受一个训练文件列表,该列表将在c++中检索,然后训练输入将被读取、解析并在c++代码中提供给训练网络。
AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。
参数: 参数:
- **place** (fluid.CPUPlace|None) - 指示 executor 将在哪个设备上运行。目前仅支持CPU - **place** (fluid.CPUPlace|None) - 指示 executor 将在哪个设备上运行。目前仅支持CPU
...@@ -47,7 +48,7 @@ AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。 ...@@ -47,7 +48,7 @@ AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。
目前仅支持CPU 目前仅支持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`` 。 使用此 ``AsyncExecutor`` 来运行 ``program`` 。
...@@ -59,21 +60,78 @@ AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。 ...@@ -59,21 +60,78 @@ AsyncExecutor正在积极开发,API可能在不久的将来会发生变化。
所有运算同时更新参数值。 所有运算同时更新参数值。
参数: 参数:
- program (Program) – 需要执行的program。如果没有提供该参数,默认使用 ``default_main_program`` - **program** (Program) – 需要执行的program。如果没有提供该参数,默认使用 ``default_main_program``
- data_feed (DataFeedDesc) – ``DataFeedDesc`` 对象 - **data_feed** (DataFeedDesc) – ``DataFeedDesc`` 对象
- filelist (str) – 一个包含训练数据集文件的文件列表 - **filelist** (str) – 一个包含训练数据集文件的文件列表
- thread_num (int) – 并发训练线程数。参照 *注解* 部分获取合适的设置方法 - **thread_num** (int) – 并发训练线程数。参照 *注解* 部分获取合适的设置方法
- fetch (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名 - **fetch** (str|list) – 变量名,或者变量名列表。指明最后要进行观察的变量命名
- debug (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来 - **mode** (str) – 该接口的运行模式
- **debug** (bool) – 如果为True, 在每一个minibatch处理后,fetch 中指明的变量将会通过标准输出打印出来
.. note:: .. note::
1.该执行器会运行program中的所有运算,不只是那些依赖于fetchlist的运算 1.该执行器会运行program中的所有运算,不只是那些依赖于fetchlist的运算
2.该类执行器在多线程上运行,每个线程占用一个CPU核。为了实现效率最大化,建议将 ``thread_num`` 等于或稍微小于CPU核心数 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: .. _cn_api_fluid_BuildStrategy:
...@@ -106,10 +164,14 @@ str类型。它表明了以graphviz格式向文件中写入SSA图的路径,有 ...@@ -106,10 +164,14 @@ str类型。它表明了以graphviz格式向文件中写入SSA图的路径,有
.. py:attribute:: fuse_elewise_add_act_ops .. py:attribute:: fuse_elewise_add_act_ops
bool类型。它表明了是否融合(fuse)elementwise_add_op和activation_op。这会使整体执行过程更快一些。默认为False。 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 .. py:attribute:: gradient_scale_strategy
...@@ -558,7 +620,7 @@ reader通常返回一个minibatch条目列表。在列表中每一条目都是 ...@@ -558,7 +620,7 @@ reader通常返回一个minibatch条目列表。在列表中每一条目都是
返回类型: dict 返回类型: dict
抛出异常: ``ValueError`` – 如果 ``drop_last`` 值为False并且reader返回的minibatch数目与设备数目不相等时,产生此异常 抛出异常: ``ValueError`` – 如果 ``drop_last`` 值为False并且data batch与设备不匹配时,产生此异常
...@@ -784,7 +846,7 @@ DistributeTranspilerConfig ...@@ -784,7 +846,7 @@ DistributeTranspilerConfig
.. py:attribute:: min_block_size (int) .. py:attribute:: min_block_size (int)
最小数据块的大小 block中分割(split)出的元素个数的最小值。
注意: 根据:`issuecomment-369912156 <https://github.com/PaddlePaddle/Paddle/issues/8638#issuecomment-369912156>`_ , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看 ``slice_variable`` 函数。 注意: 根据:`issuecomment-369912156 <https://github.com/PaddlePaddle/Paddle/issues/8638#issuecomment-369912156>`_ , 当数据块大小超过2MB时,我们可以有效地使用带宽。如果你想更改它,请详细查看 ``slice_variable`` 函数。
...@@ -874,6 +936,32 @@ Executor将全局变量存储到全局作用域中,并为临时变量创建局 ...@@ -874,6 +936,32 @@ Executor将全局变量存储到全局作用域中,并为临时变量创建局
program中所有的算子会按顺序执行。 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`` 的执行场所 - **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所
...@@ -908,8 +996,8 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后 ...@@ -908,8 +996,8 @@ feed map为该program提供输入数据。fetch_list提供program训练结束后
应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。 应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。
参数: 参数:
- **program** (Program) – 需要执行的program,如果没有给定那么默认使用default_main_program - **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的)
- **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LableData} - **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData}
- **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果 - **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果
- **feed_var_name** (str) – 前向算子(feed operator)变量的名称 - **feed_var_name** (str) – 前向算子(feed operator)变量的名称
- **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称 - **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称
...@@ -1032,13 +1120,49 @@ LoD可以有多个level(例如,一个段落可以有多个句子,一个句 ...@@ -1032,13 +1120,49 @@ LoD可以有多个level(例如,一个段落可以有多个句子,一个句
.. py:method:: has_valid_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor) → bool .. 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]] .. 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:: 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的序列长度。
.. py:method:: set_recursive_sequence_lengths(self: paddle.fluid.core.LoDTensor, arg0: List[List[int]]) → None 返回:LoD对应的一至多个序列长度。
返回类型: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 ...@@ -1057,7 +1181,9 @@ LoDTensorArray
.. py:class:: paddle.fluid.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 ...@@ -1100,7 +1226,7 @@ memory_optimize
name_scope name_scope
------------------------------- -------------------------------
.. py:function:: paddle.fluid.name_scope(*args, **kwds) .. py:function:: paddle.fluid.name_scope(prefix=None)
为operators生成层次名称前缀 为operators生成层次名称前缀
...@@ -1357,7 +1483,10 @@ operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 ...@@ -1357,7 +1483,10 @@ operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。
返回:(str): debug 字符串 返回:(str): debug 字符串
抛出异常: ``ValueError`` - 当 ``throw_on_error == true`` ,但没有设置任何必需的字段时,抛出 ``ValueError`` 。 返回类型: str
抛出异常:
- ``ValueError`` - 当 ``throw_on_error == true`` ,但没有设置任何必需的字段时,抛出 ``ValueError`` 。
...@@ -1499,7 +1628,7 @@ operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。 ...@@ -1499,7 +1628,7 @@ operator的角色,值只能是枚举变量{Forward, Backward, Optimize}。
program_guard 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 ...@@ -1570,7 +1699,7 @@ release_memory
scope_guard scope_guard
------------------------------- -------------------------------
.. py:function:: paddle.fluid.scope_guard(*args, **kwds) .. py:function:: paddle.fluid.scope_guard(scope)
修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。 修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。
......
...@@ -279,7 +279,7 @@ memory用于缓存分段数据。memory的初始值可以是零,也可以是 ...@@ -279,7 +279,7 @@ memory用于缓存分段数据。memory的初始值可以是零,也可以是
参数: 参数:
- **init** (Variable|None) – 初始化的Variable - **init** (Variable|None) – 初始化的Variable
- **shape** (list|tuple) – memory shape. 注意形状不包含batch的大小 - **shape** (list|tuple) – memory shape. 注意形状不包含batch_size
- **value** (float) – 初始化的值 - **value** (float) – 初始化的值
- **need_reorder** (bool) – memory初始化依赖于输入样本时设置为True - **need_reorder** (bool) – memory初始化依赖于输入样本时设置为True
- **dtype** (str|numpy.dtype) – 初始化memory的数据类型 - **dtype** (str|numpy.dtype) – 初始化memory的数据类型
...@@ -849,7 +849,7 @@ data ...@@ -849,7 +849,7 @@ data
参数: 参数:
- **name** (str)-函数名或函数别名 - **name** (str)-函数名或函数别名
- **shape** (list)-声明维度的元组 - **shape** (list)-声明维度信息的list。如果 ``append_batch_size`` 为True且内部没有维度值为-1,则应将其视为每个样本的形状。 否则,应将其视为batch数据的形状。
- **append_batch_size** (bool)- - **append_batch_size** (bool)-
1.如果为真,则在维度shape的开头插入-1 1.如果为真,则在维度shape的开头插入-1
...@@ -1260,10 +1260,10 @@ shuffle ...@@ -1260,10 +1260,10 @@ shuffle
会对其进行重洗运算。shuffle缓存区的大小由参数 ``buffer_size`` 决定。 会对其进行重洗运算。shuffle缓存区的大小由参数 ``buffer_size`` 决定。
参数: 参数:
- **reader** (Variable) – 用shuffle装饰的reader - **reader** (callable) – 输出会被shuffle的原始reader
- **buffer_size** (int) – reader中buffer的大小 - **buffer_size** (int) – 进行shuffle的buffer的大小
返回:其输出会被重洗的一个reader(读取器) 返回:其输出会被shuffle的一个reader(读取器)
返回类型:Variable 返回类型:Variable
...@@ -1328,7 +1328,7 @@ pooling2d操作根据输入 ``input`` , ``pool_size`` , ``pool_type`` 参数 ...@@ -1328,7 +1328,7 @@ pooling2d操作根据输入 ``input`` , ``pool_size`` , ``pool_type`` 参数
.. code-block:: python .. code-block:: python
# 假设输入形为[N, C, H, W], `pool_size` 为 [m, n], # 假设输入形为[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) ,然后为每个栅格进行池化得到输出 # 平均分割为 m * n 个栅格(grid) ,然后为每个栅格进行池化得到输出
# adaptive average pool 进行如下操作 # adaptive average pool 进行如下操作
# #
...@@ -1402,7 +1402,7 @@ pooling3d操作根据输入 ``input`` ,``pool_size`` , ``pool_type`` 参数 ...@@ -1402,7 +1402,7 @@ pooling3d操作根据输入 ``input`` ,``pool_size`` , ``pool_type`` 参数
.. code-block:: python .. code-block:: python
# 假设输入形为[N, C, D, H, W], `pool_size` 为 [l, m, n], # 假设输入形为[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) ,然后为每个栅格进行池化得到输出 # 平均分割为 l * m * n 个栅格(grid) ,然后为每个栅格进行池化得到输出
# adaptive average pool 进行如下操作 # adaptive average pool 进行如下操作
# #
...@@ -1451,7 +1451,16 @@ add_position_encoding ...@@ -1451,7 +1451,16 @@ add_position_encoding
- PE(pos, 2i): 偶数位置上数字的增量 - PE(pos, 2i): 偶数位置上数字的增量
- PE(pos, 2i + 1): 奇数位置上数字的增量 - 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 ...@@ -1641,7 +1650,7 @@ autoincreased_step_counter
batch_norm 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) 批正则化层(Batch Normalization Layer)
...@@ -1660,6 +1669,16 @@ batch_norm ...@@ -1660,6 +1669,16 @@ batch_norm
\hat{x_i} &\gets \frac{x_i - \mu_\beta} {\sqrt{\sigma_{\beta}^{2} + \epsilon}} \quad &// normalize \\ \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 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 - **input** (Variable) - 输入变量,为LoDTensor
- **act** (string,默认None)- 激活函数类型,linear|relu|prelu|... - **act** (string,默认None)- 激活函数类型,linear|relu|prelu|...
...@@ -1675,6 +1694,7 @@ batch_norm ...@@ -1675,6 +1694,7 @@ batch_norm
- **moving_variance_name** (string,默认None)- moving_variance的名称,存储全局变量 - **moving_variance_name** (string,默认None)- moving_variance的名称,存储全局变量
- **do_model_average_for_mean_and_var** (bool,默认False)- 是否为mean和variance做模型均值 - **do_model_average_for_mean_and_var** (bool,默认False)- 是否为mean和variance做模型均值
- **fuse_with_relu** (bool)- 如果为True,batch norm后该操作符执行relu - **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 ...@@ -1702,17 +1722,17 @@ batch_norm
beam_search 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)是选择候选词的一种经典算法
更多细节参考 `Beam Search <https://en.wikipedia.org/wiki/Beam_search>`_ 更多细节参考 `Beam Search <https://en.wikipedia.org/wiki/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 fluid/tests/book/test_machine_translation.py
...@@ -1726,9 +1746,12 @@ beam_search ...@@ -1726,9 +1746,12 @@ beam_search
- **beam_size** (int) - 束搜索中的束宽度。 - **beam_size** (int) - 束搜索中的束宽度。
- **end_id** (int) - 结束标记的id。 - **end_id** (int) - 结束标记的id。
- **level** (int,default 0) - **可忽略,当前不能更改** 。它表示lod的源级别,解释如下。 ``ids`` 的 lod 级别应为2.第一级是源级别, 描述每个源句子(beam)的前缀(分支)的数量,第二级是描述这些候选者属于前缀的句子级别的方式。链接前缀和所选候选者的路径信息保存在lod中。 - **level** (int,default 0) - **可忽略,当前不能更改** 。它表示lod的源级别,解释如下。 ``ids`` 的 lod 级别应为2.第一级是源级别, 描述每个源句子(beam)的前缀(分支)的数量,第二级是描述这些候选者属于前缀的句子级别的方式。链接前缀和所选候选者的路径信息保存在lod中。
- **is_accumulated** (bool,默认为True) - 输入分数是否为累计分数。
- **name** (str | None) - 该层的名称(可选)。如果设置为None,则自动命名该层。 - **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 返回类型:Variable
...@@ -2638,7 +2661,7 @@ cross_entropy ...@@ -2638,7 +2661,7 @@ cross_entropy
- **input** (Variable|list) – 一个形为[N x D]的二维tensor,其中N是batch大小,D是类别(class)数目。 这是由之前的operator计算出的概率,绝大多数情况下是由softmax operator得出的结果 - **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<int64>。 ``soft_label`` 为True时, label是形为 [N x D]的 tensor<float/double> - **label** (Variable|list) – 一个二维tensor组成的正确标记的数据集(ground truth)。 当 ``soft_label`` 为False时,label为形为[N x 1]的tensor<int64>。 ``soft_label`` 为True时, label是形为 [N x D]的 tensor<float/double>
- **soft_label** (bool) – 标志位,指明是否需要把给定的标签列表认定为软标签。默认为False。 - **soft_label** (bool) – 标志位,指明是否需要把给定的标签列表认定为软标签。默认为False。
- **ignore_index** (int) – 指定一个被无视的目标值,并且这个值不影响输入梯度变化。仅在 ``soft_label`` 为False时生效。 默认值: -100 - **ignore_index** (int) – 指定一个被无视的目标值,并且这个值不影响输入梯度。仅在 ``soft_label`` 为False时生效。 默认值: kIgnoreIndex
返回: 一个形为[N x 1]的二维tensor,承载了交叉熵损失 返回: 一个形为[N x 1]的二维tensor,承载了交叉熵损失
...@@ -2847,29 +2870,33 @@ dropout操作 ...@@ -2847,29 +2870,33 @@ dropout操作
丢弃或者保持x的每个元素独立。Dropout是一种正则化技术,通过在训练过程中阻止神经元节点间的联合适应性来减少过拟合。根据给定的丢弃概率dropout操作符随机将一些神经元输出设置为0,其他的仍保持不变。 丢弃或者保持x的每个元素独立。Dropout是一种正则化技术,通过在训练过程中阻止神经元节点间的联合适应性来减少过拟合。根据给定的丢弃概率dropout操作符随机将一些神经元输出设置为0,其他的仍保持不变。
dropout op可以从Program中删除,提高执行效率。
参数: 参数:
- **x** (Variable)-输入张量 - **x** (Variable)-输入张量
- **dropout_prob** (float)-设置为0的单元的概率 - **dropout_prob** (float)-设置为0的单元的概率
- **is_test** (bool)-显示是否进行测试用语的标记 - **is_test** (bool)-显示是否进行测试用语的标记
- **seed** (int)-Python整型,用于创建随机种子。如果该参数设为None,则使用随机种子。注:如果给定一个整型种子,始终丢弃相同的输出单元。训练过程中勿用固定不变的种子。 - **seed** (int)-Python整型,用于创建随机种子。如果该参数设为None,则使用随机种子。注:如果给定一个整型种子,始终丢弃相同的输出单元。训练过程中勿用固定不变的种子。
- **name** (str|None)-该层名称(可选)。如果设置为None,则自动为该层命名 - **name** (str|None)-该层名称(可选)。如果设置为None,则自动为该层命名
- **dropout_implementation** (string) - [‘downgrade_in_infer’(defauld)|’upscale_in_train’] - **dropout_implementation** (string) -
其中:
1.downgrade_in_infer(default), 在预测时减小输出结果 [‘downgrade_in_infer’(default)|’upscale_in_train’] 其中:
1. downgrade_in_infer(default), 在预测时减小输出结果
train: out = input * mask - train: out = input * mask
inference: out = input * dropout_prob - inference: out = input * dropout_prob
(mask是一个张量,维度和输入维度相同,值为0或1,值为0的比例即为 ``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操作符可以从程序中移除,程序变得高效。 dropout操作符可以从程序中移除,程序变得高效。
...@@ -2897,15 +2924,13 @@ dropout操作符可以从程序中移除,程序变得高效。 ...@@ -2897,15 +2924,13 @@ dropout操作符可以从程序中移除,程序变得高效。
dynamic_gru 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层。** **实现了Gated Recurrent Unit层。**
详细理论介绍,请参照 `Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling`_。 如果origin_mode为False,那么gru运算公式来自论文 `Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling <https://arxiv.org/abs/1412.3555>`_ 。
.. _Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling: https://arxiv.org/abs/1412.3555
公式如下: 公式如下:
...@@ -2919,6 +2944,24 @@ dynamic_gru ...@@ -2919,6 +2944,24 @@ dynamic_gru
.. math:: .. math::
h_t=(1-u_t)\odot h_{t-1}+u_t\odot \widetilde{h_t} 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 <https://arxiv.org/pdf/1406.1078.pdf>`_
公式如下:
.. 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:`\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层来进行这一操作。 注意 :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 ...@@ -3262,7 +3305,6 @@ elementwise_add
- **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。
- **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由 ``MKLDNN`` 使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -3319,7 +3361,6 @@ elementwise_div ...@@ -3319,7 +3361,6 @@ elementwise_div
- **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。
- **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -3376,7 +3417,6 @@ elementwise_max ...@@ -3376,7 +3417,6 @@ elementwise_max
- **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。
- **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -3434,7 +3474,6 @@ elementwise_min ...@@ -3434,7 +3474,6 @@ elementwise_min
- **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。
- **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -3492,7 +3531,6 @@ elementwise_mul ...@@ -3492,7 +3531,6 @@ elementwise_mul
- **x** - (Tensor),元素op的第一个输入张量(Tensor)。 - **x** - (Tensor),元素op的第一个输入张量(Tensor)。
- **y** - (Tensor),元素op的第二个输入张量(Tensor)。 - **y** - (Tensor),元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -3549,7 +3587,6 @@ elementwise_pow ...@@ -3549,7 +3587,6 @@ elementwise_pow
- **x** (Tensor)- 元素op的第一个输入张量(Tensor)。 - **x** (Tensor)- 元素op的第一个输入张量(Tensor)。
- **y** (Tensor)- 元素op的第二个输入张量(Tensor)。 - **y** (Tensor)- 元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -3607,7 +3644,6 @@ elementwise_sub ...@@ -3607,7 +3644,6 @@ elementwise_sub
- **x** - (Tensor),元素op的第一个输入张量(Tensor)。 - **x** - (Tensor),元素op的第一个输入张量(Tensor)。
- **y** - (Tensor),元素op的第二个输入张量(Tensor)。 - **y** - (Tensor),元素op的第二个输入张量(Tensor)。
- **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。 - **axis** (INT)- (int,默认-1)。将Y传到X上的起始维度索引。
- **use_mkldnn** (BOOLEAN)- (bool,默认为false)。由MKLDNN使用。
- **act** (basestring | None)- 激活应用于输出。 - **act** (basestring | None)- 激活应用于输出。
- **name** (basestring | None)- 输出的名称。 - **name** (basestring | None)- 输出的名称。
...@@ -4141,10 +4177,16 @@ group_norm ...@@ -4141,10 +4177,16 @@ group_norm
gru_unit 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执行步骤基于如下等式: GRU单元层。GRU执行步骤基于如下等式:
如果origin_mode为True,则该运算公式来自论文
`Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling <https://arxiv.org/pdf/1412.3555.pdf>`_ 。
公式如下:
.. math:: .. math::
u_t=actGate(xu_t+W_{u}h_{t-1}+b_u) u_t=actGate(xu_t+W_{u}h_{t-1}+b_u)
.. math:: .. math::
...@@ -4154,6 +4196,17 @@ GRU单元层。GRU执行步骤基于如下等式: ...@@ -4154,6 +4196,17 @@ GRU单元层。GRU执行步骤基于如下等式:
.. math:: .. math::
h_t=dot((1-u_t),m_t)+dot(u_t,h_{t-1}) 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 <https://arxiv.org/pdf/1406.1078.pdf>`_ 。
.. 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` , :math:`h_{t-1}` 。在上述等式中, :math:`z_t` 会被分割成三部分: :math:`xu_t` 、 :math:`xr_t` 和 :math:`xm_t` 。
这意味着要为一批输入实现一个全GRU层,我们需要采用一个全连接层,才能得到 :math:`z_t=W_{fc}x_t` 。 这意味着要为一批输入实现一个全GRU层,我们需要采用一个全连接层,才能得到 :math:`z_t=W_{fc}x_t` 。
:math:`u_t` 和 :math:`r_t` 分别代表了GRU神经元的update gates(更新门)和reset gates(重置门)。 :math:`u_t` 和 :math:`r_t` 分别代表了GRU神经元的update gates(更新门)和reset gates(重置门)。
...@@ -4330,13 +4383,13 @@ hsigmoid可以把时间复杂度 :math:`O(N)` 优化到 :math:`O(logN)` ,其中 ...@@ -4330,13 +4383,13 @@ hsigmoid可以把时间复杂度 :math:`O(N)` 优化到 :math:`O(logN)` ,其中
使用默认树结构,请参考 `Hierarchical Probabilistic Neural Network Language Model <http://www.iro.umontreal.ca/~lisa/pointeurs/hierarchical-nnlm-aistats05.pdf>`_ 。 使用默认树结构,请参考 `Hierarchical Probabilistic Neural Network Language Model <http://www.iro.umontreal.ca/~lisa/pointeurs/hierarchical-nnlm-aistats05.pdf>`_ 。
若要使用自定义树结构,请设置 ``is_custom`` 值为True。但在此之前,请完成以下几步部署 若要使用自定义树结构,请设置 ``is_custom`` 值为True。但在此之前,请完成以下几步:
1.使用自定义词典来建立二叉树,每个叶结点都应该是词典中的单词 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.现在我们的每个单词都已经有自己的路径和路径编码,当对于同一批输入进行操作时,你可以同时传入一批路径和路径编码进行运算。 4.现在我们的每个单词都已经有自己的路径和路径编码,当对于同一批输入进行操作时,你可以同时传入一批路径和路径编码进行运算。
...@@ -4503,9 +4556,9 @@ im2sequence ...@@ -4503,9 +4556,9 @@ im2sequence
image_resize 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),并且调整大小只适用于最后两个维度(高度和宽度)。 输入张量的shape为(num_batch, channels, in_h, in_w),并且调整大小只适用于最后两个维度(高度和宽度)。
...@@ -4515,6 +4568,75 @@ image_resize ...@@ -4515,6 +4568,75 @@ image_resize
NEAREST:最近邻插值 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) - **input** (Variable) - 图片调整层的输入张量,这是一个shape=4的张量(num_batch, channels, in_h, in_w)
- **out_shape** (list|tuple|Variable|None) - 图片调整层的输出,shape为(out_h, out_w)。默认值:None - **out_shape** (list|tuple|Variable|None) - 图片调整层的输出,shape为(out_h, out_w)。默认值:None
...@@ -4522,7 +4644,8 @@ image_resize ...@@ -4522,7 +4644,8 @@ image_resize
- **name** (str|None) - 该层的名称(可选)。如果设置为None,该层将被自动命名 - **name** (str|None) - 该层的名称(可选)。如果设置为None,该层将被自动命名
- **resample** (str) - 重采样方法。目前只支持“双线性”。默认值:双线性插值 - **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 - **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). 返回: 4维tensor,shape为 (num_batches, channls, out_h, out_w).
...@@ -4532,8 +4655,11 @@ image_resize ...@@ -4532,8 +4655,11 @@ image_resize
- :code:`TypeError` - out_shape应该是一个列表、元组或变量。 - :code:`TypeError` - out_shape应该是一个列表、元组或变量。
- :code:`TypeError` - actual_shape应该是变量或None - :code:`TypeError` - actual_shape应该是变量或None
- :code:`ValueError` - image_resize的"resample"只能是"BILINEAR"或"NEAREST"。 - :code:`ValueError` - image_resize的"resample"只能是"BILINEAR"或"NEAREST"。
- :code:`ValueError` - out_shape 和 scale 不能为 None - :code:`ValueError` - out_shape 和 scale 不可同时为 None
- :code:`ValueError` - out_shape 的长度必须为 2 - :code:`ValueError` - out_shape 的长度必须为 2
- :code:`TypeError` - align_corners 应为bool型
- :code:`ValueError` - align_mode 只能取 ‘0’ 或 ‘1’
**代码示例** **代码示例**
...@@ -5235,12 +5361,12 @@ lstm ...@@ -5235,12 +5361,12 @@ lstm
.. math:: .. math::
i_t = \sigma(W_{ix}x_{t} + W_{ih}h_{t-1} + bx_i + bh_i)\\ 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)\\ 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)\\ 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)\\ \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}\\ c_t &= f_t \odot c_{t-1} + i_t \odot \tilde{c_t}\\
h_t = o_t \odot tanh(c_t) h_t &= o_t \odot tanh(c_t)
公式中: 公式中:
- W 项表示权重矩阵(e.g. :math:`W_{ix}` 是从输入门到输入的权重矩阵) - W 项表示权重矩阵(e.g. :math:`W_{ix}` 是从输入门到输入的权重矩阵)
...@@ -5250,8 +5376,9 @@ lstm ...@@ -5250,8 +5376,9 @@ lstm
- :math:`\odot` 是向量的元素乘积 - :math:`\odot` 是向量的元素乘积
- tanh是激活函数 - tanh是激活函数
- :math:`\tilde{c_t}` 也称为候选隐藏状态,它是根据当前输入和之前的隐藏状态来计算的 - :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) - **input** (Variable) - LSTM 输入张量,形状必须为(seq_len x,batch_size,x,input_size)
...@@ -5267,10 +5394,13 @@ lstm ...@@ -5267,10 +5394,13 @@ lstm
- **default_initializer** (Initialize|None) – 在哪里使用初始化器初始化权重,如果没有设置,将进行默认初始化。 - **default_initializer** (Initialize|None) – 在哪里使用初始化器初始化权重,如果没有设置,将进行默认初始化。
- **seed** (int) – LSTM中dropout的Seed,如果是-1,dropout将使用随机Seed - **seed** (int) – LSTM中dropout的Seed,如果是-1,dropout将使用随机Seed
返回: 返回: 三个张量, rnn_out, last_h, last_c:
- 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) - rnn_out为LSTM hidden的输出结果。形为(seq_len x batch_size x hidden_size)如果is_bidirec设置为True,则形为(seq_len x batch_sze hidden_size * 2)
- 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) - 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 ...@@ -5562,20 +5692,26 @@ mean_iou
均值IOU(Mean Intersection-Over-Union)是语义图像分割中的常用的评价指标之一,它首先计算每个语义类的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的语义标签的预测结果张量。 - **input** (Variable) - 类型为int32或int64的语义标签的预测结果张量。
- **label** (Variable) - int32或int64类型的真实label张量。它的shape应该与输入相同。 - **label** (Variable) - int32或int64类型的真实label张量。它的shape应该与输入相同。
- **num_classes** (int) - 标签可能的类别数目。 - **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 .. code-block:: python
...@@ -5933,8 +6069,8 @@ pad2d ...@@ -5933,8 +6069,8 @@ pad2d
参数: 参数:
- **input** (Variable) - 具有[N, C, H, W]格式或[N, H, W, C]格式的输入图像。 - **input** (Variable) - 具有[N, C, H, W]格式或[N, H, W, C]格式的输入图像。
- **paddings** (tuple|list) - 填充区域的大小。如果填充是一个元组,它必须包含四个整数, - **paddings** (tuple|list|Variable) - 填充区域的大小。如果填充是一个元组,它必须包含四个整数,
(padding_top、padding_bottom、padding_left、padding_right)。默认:padding =[0,0,0,0]。 (padding_top, padding_bottom, padding_left, padding_right)。默认:padding =[0,0,0,0]。
- **mode** (str) - 三种模式:constant(默认)、reflect、edge。默认值:常数 - **mode** (str) - 三种模式:constant(默认)、reflect、edge。默认值:常数
- **pad_value** (float32) - 以常量模式填充填充区域的值。默认值:0 - **pad_value** (float32) - 以常量模式填充填充区域的值。默认值:0
- **data_format** (str) - 可选字符串,选项有: ``NHWC`` , ``NCHW``。指定输入数据的数据格式。默认值:``NCHW`` - **data_format** (str) - 可选字符串,选项有: ``NHWC`` , ``NCHW``。指定输入数据的数据格式。默认值:``NCHW``
...@@ -6060,7 +6196,7 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核 ...@@ -6060,7 +6196,7 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核
.. math:: .. math::
W_{out} = \frac{(W_{in} - ksize[1] + 2 * paddings[1] + strides[1] - 1)}{strides[1]} + 1 W_{out} = \frac{(W_{in} - ksize[1] + 2 * paddings[1] + strides[1] - 1)}{strides[1]} + 1
如果 ``exclusive`` = true: 如果 ``exclusive`` = false:
.. math:: .. math::
hstart &= i * strides[0] - paddings[0] \\ hstart &= i * strides[0] - paddings[0] \\
...@@ -6069,7 +6205,7 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核 ...@@ -6069,7 +6205,7 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核
wend &= wstart + ksize[1] \\ wend &= wstart + ksize[1] \\
Output(i ,j) &= \frac{sum(Input[hstart:hend, wstart:wend])}{ksize[0] * ksize[1]} Output(i ,j) &= \frac{sum(Input[hstart:hend, wstart:wend])}{ksize[0] * ksize[1]}
如果 ``exclusive`` = false: 如果 ``exclusive`` = true:
.. math:: .. math::
hstart &= max(0, i * strides[0] - paddings[0])\\ hstart &= max(0, i * strides[0] - paddings[0])\\
...@@ -6101,13 +6237,13 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核 ...@@ -6101,13 +6237,13 @@ pooling2d操作符根据 ``input`` , 池化类型 ``pool_type`` , 池化核
- ``ValueError`` - 如果 ``global_pooling`` 为False并且‘pool_size’为-1 - ``ValueError`` - 如果 ``global_pooling`` 为False并且‘pool_size’为-1
- ``ValueError`` - 如果 ``use_cudnn`` 不是bool值 - ``ValueError`` - 如果 ``use_cudnn`` 不是bool值
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
data = fluid.layers.data( data = fluid.layers.data(
name='data', shape=[3, 32, 32], dtype='float32') name='data', shape=[3, 32, 32], dtype='float32')
conv2d = fluid.layers.pool2d( pool2d = fluid.layers.pool2d(
input=data, input=data,
pool_size=2, pool_size=2,
pool_type='max', pool_type='max',
...@@ -6131,6 +6267,56 @@ pool3d ...@@ -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是特征宽度。 - **input** (Vairable) - 池化运算的输入张量。输入张量的格式为NCDHW, N是批尺寸,C是通道数,D是特征深度,H是特征高度,W是特征宽度。
- **pool_size** (int|list|tuple) - 池化窗口的大小。如果为元组类型,那么它应该是由三个整数组成:深度,高度,宽度。如果是int类型,它应该是一个整数的立方。 - **pool_size** (int|list|tuple) - 池化窗口的大小。如果为元组类型,那么它应该是由三个整数组成:深度,高度,宽度。如果是int类型,它应该是一个整数的立方。
...@@ -6147,7 +6333,18 @@ pool3d ...@@ -6147,7 +6333,18 @@ pool3d
返回类型:变量(Variable) 返回类型:变量(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表示输入的两文 ...@@ -6389,7 +6586,7 @@ P 的取值可为: {0, 1} 或 {0, 0.5, 1}, 其中,0.5表示输入的两文
o_{i,j} &= o_i - o_j \\ o_{i,j} &= o_i - o_j \\
\tilde{P_{i,j}} &= \left \{0, 0.5, 1 \right \} \ or \ \left \{0, 1 \right \} \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 - **label** (Variable):A的排名是否高于B
...@@ -6397,21 +6594,21 @@ P 的取值可为: {0, 1} 或 {0, 0.5, 1}, 其中,0.5表示输入的两文 ...@@ -6397,21 +6594,21 @@ P 的取值可为: {0, 1} 或 {0, 0.5, 1}, 其中,0.5表示输入的两文
- **right** (Variable): RankNet对doc B的输出分数 - **right** (Variable): RankNet对doc B的输出分数
- **name** (str|None):此层的名称(可选)。如果没有设置,层将自动命名。 - **name** (str|None):此层的名称(可选)。如果没有设置,层将自动命名。
返回:variable:形为[N, H, W, 2]的输出 返回:rank loss的值
抛出异常:ValueError: 如果参数为不支持的类型 返回类型: list
抛出异常: ``ValueError`` - label, left, 和right至少有一者不是variable变量类型。
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
theta = fluid.layers.data(name="x", shape=[2, 3], dtype="float32") label = fluid.layers.data(name="label", shape=[4, 1], dtype="float32")
out_shape = fluid.layers.data(name="y", shape=[-1], dtype="float32") left = fluid.layers.data(name="left", shape=[4, 1], dtype="float32")
data = fluid.layers.affine_grid(theta, out_shape) right = fluid.layers.data(name="right", shape=[4, 1], dtype="float32")
out = fluid.layers.rank_loss(label, left, right)
# or
data = fluid.layers.affine_grid(theta, [5, 3, 28, 28])
...@@ -6800,14 +6997,52 @@ reshape ...@@ -6800,14 +6997,52 @@ reshape
resize_bilinear 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指定。 根据指定的out_shape执行双线性插值调整输入大小,输出形状按优先级由actual_shape、out_shape和scale指定。
双线性插值是对线性插值的扩展,即二维变量方向上(如h方向和w方向)插值。关键思想是先在一个方向上执行线性插值,然后再在另一个方向上执行线性插值。 双线性插值是对线性插值的扩展,即二维变量方向上(如h方向和w方向)插值。关键思想是先在一个方向上执行线性插值,然后再在另一个方向上执行线性插值。
`详情请参阅维基百科 https://en.wikipedia.org/wiki/Bilinear_interpolation <https://en.wikipedia.org/wiki/Bilinear_interpolation>`_ 详情请参阅 `维基百科 <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张量。 - **input** (Variable) - 双线性插值的输入张量,是一个shpae为(N x C x h x w)的4d张量。
...@@ -6815,8 +7050,11 @@ resize_bilinear ...@@ -6815,8 +7050,11 @@ resize_bilinear
- **scale** (float|None) - 用于输入高度或宽度的乘数因子。out_shape和scale至少要设置一个。out_shape的优先级高于scale。默认值:None。 - **scale** (float|None) - 用于输入高度或宽度的乘数因子。out_shape和scale至少要设置一个。out_shape的优先级高于scale。默认值:None。
- **name** (str|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 - **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 ...@@ -6837,11 +7075,45 @@ resize_bilinear
resize_nearest 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)操作。 该层对输入进行放缩,在第三维(高度方向)和第四维(宽度方向)进行最邻近插值(nearest neighbor interpolation)操作。
输出形状按优先级顺序依据 ``actual_shape`` , ``out_shape`` 和 ``scale`` 而定。 输出形状按优先级顺序依据 ``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 <https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation>`_ 最邻近插值的详细介绍请参照: `Wiki Nearest-neighbor interpolation <https://en.wikipedia.org/wiki/Nearest-neighbor_interpolation>`_
...@@ -6852,6 +7124,7 @@ resize_nearest ...@@ -6852,6 +7124,7 @@ resize_nearest
- **scale** (float|None) – 输入高、宽的乘法器。 ``out_shape`` 和 ``scale`` 二者至少设置其一。 ``out_shape`` 具有比 ``scale`` 更高的优先级。 默认: None - **scale** (float|None) – 输入高、宽的乘法器。 ``out_shape`` 和 ``scale`` 二者至少设置其一。 ``out_shape`` 具有比 ``scale`` 更高的优先级。 默认: None
- **name** (str|None) – 输出变量的命名 - **name** (str|None) – 输出变量的命名
- **actual_shape** (Variable) – 可选输入, 动态设置输出张量的形状。 如果提供该值, 图片放缩会依据此形状进行, 而非依据 ``out_shape`` 和 ``scale`` 。 即为, ``actual_shape`` 具有最高的优先级。 如果想动态指明输出形状,推荐使用 ``actual_shape`` 取代 ``out_shape`` 。 当使用 ``actual_shape`` 来指明输出形状, ``out_shape`` 和 ``scale`` 也应该进行设置, 否则在图形生成阶段将会报错。默认: 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) 的四维张量 返回:插值运算的输出张量,是一个形为 (N,C,H,W) 的四维张量
...@@ -6977,22 +7250,22 @@ row_conv ...@@ -6977,22 +7250,22 @@ row_conv
双向的RNN在深度语音模型中很有用,它通过对整个序列执行正向和反向传递来学习序列的表示。然而,与单向RNNs不同的是,在线部署和低延迟设置中,双向RNNs具有难度。超前卷积将来自未来子序列的信息以一种高效的方式进行计算,以改进单向递归神经网络。 row convolution operator 与一维序列卷积不同,计算方法如下: 双向的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:: .. 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:`out_i` : 第i行输出变量为[1, D].
- :math:`context` : 未来上下文(feature context)大小 - :math:`context` : 下文(future context)大小
- :math:`in_j` : 第j行输出变量,形为[1,D] - :math:`X_j` : 第j行输出变量,形为[1,D]
- :math:`W_{i-j}` : 第(i-j)行参数,其形状为[1,D]。 - :math:`W_{j-i}` : 第(j-i)行参数,其形状为[1,D]。
`详细请参考设计文档 https://github.com/PaddlePaddle/Paddle/issues/2228#issuecomment-303903645 <https://github.com/PaddlePaddle/Paddle/issues/2228#issuecomment-303903645>`_ . 详细请参考 `设计文档 <https://github.com/PaddlePaddle/Paddle/issues/2228#issuecomment-303903645>`_ 。
参数: 参数:
- **input** (Variable) -- 输入是一个LodTensor,它支持可变时间长度的输入序列。这个LodTensor的内部张量是一个具有形状(T x N)的矩阵,其中T是这个mini batch中的总的timestep,N是输入数据维数。 - **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) -- 参数的属性,包括名称、初始化器等。 - **param_attr** (ParamAttr) -- 参数的属性,包括名称、初始化器等。
- **act** (str) -- 非线性激活函数。 - **act** (str) -- 非线性激活函数。
...@@ -7845,21 +8118,27 @@ sequence_scatter ...@@ -7845,21 +8118,27 @@ sequence_scatter
:: ::
输入: 输入:
input.data = [[1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 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] input.dims = [3, 6]
index.data = [[0], [1], [2], [5], [4], [3], [2], [1], [3], [2], [5], [4]] index.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]]
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], 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] out.dims = X.dims = [3, 6]
参数: 参数:
- **input** (Variable) - input 秩(rank) >= 1。 - **input** (Variable) - input 秩(rank) >= 1。
- **index** (Variable) - LoD Tensor, index 是 sequence scatter op 的输入索引,该函数的input将依据index进行更新。 秩(rank)=1。由于用于索引dtype应该是int32或int64。 - **index** (Variable) - LoD Tensor, index 是 sequence scatter op 的输入索引,该函数的input将依据index进行更新。 秩(rank)=1。由于用于索引dtype应该是int32或int64。
...@@ -7868,7 +8147,7 @@ sequence_scatter ...@@ -7868,7 +8147,7 @@ sequence_scatter
返回: 输出张量维度应该和输入张量相同 返回: 输出张量维度应该和输入张量相同
返回类型:output (Variable) 返回类型:Variable
**代码示例**: **代码示例**:
...@@ -8158,7 +8437,7 @@ shuffle_channel ...@@ -8158,7 +8437,7 @@ shuffle_channel
sigmoid_cross_entropy_with_logits 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 ...@@ -8189,7 +8468,9 @@ sigmoid_cross_entropy_with_logits
参数: 参数:
- **x** (Variable) - (Tensor, 默认 Tensor<float>),形为 N x D 的二维张量,N为batch大小,D为类别数目。该输入是一个由先前运算得出的logit组成的张量。logit是未标准化(unscaled)的log概率, 公式为 :math:`log(\frac{p}{1-p})` - **x** (Variable) - (Tensor, 默认 Tensor<float>),形为 N x D 的二维张量,N为batch大小,D为类别数目。该输入是一个由先前运算得出的logit组成的张量。logit是未标准化(unscaled)的log概率, 公式为 :math:`log(\frac{p}{1-p})`
- **label** (Variable) - (Tensor, 默认 Tensor<float>) 具有和X相同类型,相同形状的二维张量。该输入张量代表了每个logit的可能标签 - **label** (Variable) - (Tensor, 默认 Tensor<float>) 具有和X相同类型,相同形状的二维张量。该输入张量代表了每个logit的可能标签
- **ignore_index** (int) - (int,默认kIgnoreIndex)指定被忽略的目标值,它不会影响输入梯度
- **name** (basestring|None) - 输出的名称 - **name** (basestring|None) - 输出的名称
- **normalize** (bool) - 如果为true,则将输出除以除去ignore_index对应目标外的目标数
返回: (Tensor, 默认Tensor<float>), 形为 N x D 的二维张量,其值代表了按元素的逻辑loss 返回: (Tensor, 默认Tensor<float>), 形为 N x D 的二维张量,其值代表了按元素的逻辑loss
...@@ -8197,7 +8478,20 @@ sigmoid_cross_entropy_with_logits ...@@ -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之和
...@@ -8514,13 +8808,13 @@ softmax_with_cross_entropy ...@@ -8514,13 +8808,13 @@ softmax_with_cross_entropy
- **logits** (Variable) - 未标准化(unscaled)的log概率,一个形为 N X K 的二维张量。 N是batch大小,K是类别总数 - **logits** (Variable) - 未标准化(unscaled)的log概率,一个形为 N X K 的二维张量。 N是batch大小,K是类别总数
- **label** (Variable) - 2-D 张量,代表了正确标注(ground truth), 如果 ``soft_label`` 为 False,则该参数是一个形为 N X 1 的Tensor<int64> 。如果 ``soft_label`` 为 True,它是 Tensor<float/double> ,形为 N X K - **label** (Variable) - 2-D 张量,代表了正确标注(ground truth), 如果 ``soft_label`` 为 False,则该参数是一个形为 N X 1 的Tensor<int64> 。如果 ``soft_label`` 为 True,它是 Tensor<float/double> ,形为 N X K
- **soft_label** (bool) - 是否将输入标签当作软标签。默认为False - **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 - **numeric_stable_mode** (bool) – 标志位,指明是否使用一个具有更佳数学稳定性的算法。仅在 ``soft_label`` 为 False的GPU模式下生效. 若 ``soft_label`` 为 True 或者执行场所为CPU, 算法一直具有数学稳定性。 注意使用稳定算法时速度可能会变慢。默认为 False
- **return_softmax** (bool) – 标志位,指明是否额外返回一个softmax值, 同时返回交叉熵计算结果。默认为False - **return_softmax** (bool) – 标志位,指明是否额外返回一个softmax值, 同时返回交叉熵计算结果。默认为False
返回: 返回:
- 如果 ``return_softmax`` 为 False, 则返回交叉熵,一个形为[N x 1]的二维张量 - 如果 ``return_softmax`` 为 False, 则返回交叉熵损失
- 如果 ``return_softmax`` 为 True,则返回元组 (loss, softmax) ,其中交叉熵loss为形为[N x 1]的二维张量,softmax为[N x K]的二维张量 - 如果 ``return_softmax`` 为 True,则返回元组 (loss, softmax) ,其中交叉熵损失为形为[N x 1]的二维张量,softmax为[N x K]的二维张量
返回类型:变量或者两个变量组成的元组 返回类型:变量或者两个变量组成的元组
...@@ -8935,7 +9229,7 @@ topk ...@@ -8935,7 +9229,7 @@ topk
参数: 参数:
- **input** (Variable)-输入变量可以是一个向量或者更高阶的张量 - **input** (Variable)-输入变量可以是一个向量或者更高阶的张量
- **k** (int)-在输入最后一纬中寻找的前项数目 - **k** (int|Variable)-在输入最后一维中寻找的前项数目
- **name** (str|None)-该层名称(可选)。如果设为空,则自动为该层命名。默认为空 - **name** (str|None)-该层名称(可选)。如果设为空,则自动为该层命名。默认为空
返回:含有两个元素的元组。元素都是变量。第一个元素是最后维切片的前k项。第二个元素是输入最后维里值索引 返回:含有两个元素的元组。元素都是变量。第一个元素是最后维切片的前k项。第二个元素是输入最后维里值索引
...@@ -9096,10 +9390,10 @@ unsqueeze ...@@ -9096,10 +9390,10 @@ unsqueeze
.. py:function:: paddle.fluid.layers.unsqueeze(input, axes, name=None) .. 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)- 未压缩的输入变量 - **input** (Variable)- 未压缩的输入变量
...@@ -10789,7 +11083,7 @@ anchor_generator ...@@ -10789,7 +11083,7 @@ anchor_generator
参数: 参数:
- **input** (Variable) - 输入特征图,格式为NCHW - **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] - **aspect_ratios** (list|tuple|float) - 生成anchor的高宽比,例如[0.5,1.0,2.0]
- **variance** (list|tuple) - 变量,在框回归delta中使用。默认:[0.1,0.1,0.2,0.2] - **variance** (list|tuple) - 变量,在框回归delta中使用。默认:[0.1,0.1,0.2,0.2]
- **stride** (list|tuple) - anchor在宽度和高度方向上的步长,比如[16.0,16.0] - **stride** (list|tuple) - anchor在宽度和高度方向上的步长,比如[16.0,16.0]
...@@ -10801,7 +11095,7 @@ anchor_generator ...@@ -10801,7 +11095,7 @@ anchor_generator
- Variances(Variable): anchor的扩展变量布局为 [H,W,num_priors,4]。 ``H`` 是输入的高度, ``W`` 是输入的宽度, ``num_priors`` 是输入每个位置的框数,每个变量的格式为(xcenter,ycenter,w,h)。 - 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 ...@@ -10955,14 +11249,21 @@ Bounding Box Coder
其中tx,ty,tw,th分别表示目标框的中心坐标、宽度和高度。同样地,px,py,pw,ph表示先验框地中心坐标、宽度和高度。pxv,pyv,pwv,phv表示先验框变量,ox,oy,ow,oh表示编码/解码坐标、宽度和高度。 其中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** (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信息,代表一批输入。批的一个实例可以包含不同的实体数。 - **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) - 是否将先验框作为正则框 - **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`` 为 ``‘encode_center_size’`` 时,形为[N,M,4]的输出张量代表N目标框的结果,目标框用M先验框和变量编码。
- ``code_type`` 为 ``‘decode_center_size’`` 时,N代表batch大小,M代表解码框数 - ``code_type`` 为 ``‘decode_center_size’`` 时,N代表batch大小,M代表解码框数
...@@ -10971,8 +11272,24 @@ Bounding Box Coder ...@@ -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 ...@@ -11036,7 +11353,7 @@ density prior box的量由fixed_sizes and fixed_ratios决定。显然地,fixed
num_priors是输入中每个位置的总box count num_priors是输入中每个位置的总box count
**代码示例**: **代码示例**
.. code-block:: python .. code-block:: python
...@@ -11114,6 +11431,7 @@ detection_map ...@@ -11114,6 +11431,7 @@ detection_map
shape=[10, 6], shape=[10, 6],
append_batch_size=False, append_batch_size=False,
dtype='float32') dtype='float32')
map_out = fluid.layers.detection_map(detect_res, label, 21) map_out = fluid.layers.detection_map(detect_res, label, 21)
...@@ -11137,9 +11455,9 @@ Detection Output Layer for Single Shot Multibox Detector(SSD) ...@@ -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) ...@@ -11156,7 +11474,7 @@ Detection Output Layer for Single Shot Multibox Detector(SSD)
- **nms_eta** (float) - 适应NMS的参数 - **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) 返回类型:变量(Variable)
...@@ -11459,7 +11777,7 @@ multiclass_nms ...@@ -11459,7 +11777,7 @@ multiclass_nms
**多分类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)重叠的框。 在NMS中,如果提供 ``score_threshold`` 阈值,则此运算符贪婪地选择具有高于 ``score_threshold`` 的高分数的检测边界框(bounding box)的子集,然后如果nms_top_k大于-1,则选择最大的nms_top_k置信度分数。 接着,该运算符基于 ``nms_threshold`` 和 ``nms_eta`` 参数,通过自适应阈值NMS移去与已经选择的框具有高IOU(intersection over union)重叠的框。
......
...@@ -152,7 +152,7 @@ Adamax 更新规则: ...@@ -152,7 +152,7 @@ Adamax 更新规则:
AdamOptimizer 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论文 <https://arxiv.org/abs/1412.6980>`_ 的第二节。Adam是一阶基于梯度下降的算法,基于自适应低阶矩估计。 该函数实现了自适应矩估计优化器,介绍自 `Adam论文 <https://arxiv.org/abs/1412.6980>`_ 的第二节。Adam是一阶基于梯度下降的算法,基于自适应低阶矩估计。
Adam更新如下: Adam更新如下:
...@@ -168,6 +168,8 @@ Adam更新如下: ...@@ -168,6 +168,8 @@ Adam更新如下:
- **epsilon** (float)-保持数值稳定性的短浮点类型值 - **epsilon** (float)-保持数值稳定性的短浮点类型值
- **regularization** - 规则化函数,例如''fluid.regularizer.L2DecayRegularizer - **regularization** - 规则化函数,例如''fluid.regularizer.L2DecayRegularizer
- **name** - 可选名称前缀 - **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 ...@@ -285,9 +287,9 @@ FTRL 原始论文: ( `https://www.eecs.tufts.edu/~dsculley/papers/ad-click-predi
参数: 参数:
- **learning_rate** (float|Variable)-全局学习率。 - **learning_rate** (float|Variable)-全局学习率。
- **l1** (float) - 暂无,请等待后期更新 - **l1** (float) - L1 regularization strength.
- **l2** (float) - 暂无,请等待后期更新 - **l2** (float) - L2 regularization strength.
- **lr_power** (float) - 暂无,请等待后期更新 - **lr_power** (float) - 学习率降低指数
- **regularization** - 正则化器,例如 ``fluid.regularizer.L2DecayRegularizer`` - **regularization** - 正则化器,例如 ``fluid.regularizer.L2DecayRegularizer``
- **name** — 可选的名称前缀 - **name** — 可选的名称前缀
...@@ -400,7 +402,7 @@ ModelAverage ...@@ -400,7 +402,7 @@ ModelAverage
exe.run(inference_program...) exe.run(inference_program...)
.. py:method:: apply(*args, **kwds) .. py:method:: apply(executor, need_restore=True)
将平均值应用于当前模型的参数。 将平均值应用于当前模型的参数。
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
cuda_profiler 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 <https://developer.nvidia.com/nvidia-visualprofiler>`_ 工具来加载这个输出文件以可视化结果。 CUDA分析器。通过CUDA运行时应用程序编程接口对CUDA程序进行性能分析。分析结果将以键-值对格式或逗号分隔的格式写入output_file。用户可以通过output_mode参数设置输出模式,并通过配置参数设置计数器/选项。默认配置是[' gpustarttimestamp ', ' gpustarttimestamp ', ' gridsize3d ', ' threadblocksize ', ' streamid ', ' enableonstart 0 ', ' conckerneltrace ']。然后,用户可使用 `NVIDIA Visual Profiler <https://developer.nvidia.com/nvidia-visualprofiler>`_ 工具来加载这个输出文件以可视化结果。
...@@ -62,7 +62,7 @@ CUDA分析器。通过CUDA运行时应用程序编程接口对CUDA程序进行 ...@@ -62,7 +62,7 @@ CUDA分析器。通过CUDA运行时应用程序编程接口对CUDA程序进行
profiler 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++代码中添加更多代码。 profile interface 。与cuda_profiler不同,此profiler可用于分析CPU和GPU程序。默认情况下,它记录CPU和GPU kernel,如果想分析其他程序,可以参考教程来在c++代码中添加更多代码。
......
***
<a name="third_party"></a> <a name="third_party"></a>
# 附录 # 附录
...@@ -36,7 +35,7 @@ ...@@ -36,7 +35,7 @@
<tr> <tr>
<td> SWIG </td> <td> SWIG </td>
<td> 最低 2.0 </td> <td> 最低 2.0 </td>
<td> </td>https://github.com/PaddlePaddle/Paddle/tree/develop/doc/design/mkldnn <td> </td>
<td> <code>apt install swig </code><code> yum install swig </code> </td> <td> <code>apt install swig </code><code> yum install swig </code> </td>
</tr> </tr>
<tr> <tr>
...@@ -176,11 +175,6 @@ ...@@ -176,11 +175,6 @@
<td> 是否编译带有分布式的版本 </td> <td> 是否编译带有分布式的版本 </td>
<td> OFF </td> <td> OFF </td>
</tr> </tr>
<tr>
<td> WITH_MKL </td>
<td> 是否使用MKL数学库,如果为否则是用OpenBLAS </td>
<td> ON </td>
</tr>
<tr> <tr>
<td> WITH_RDMA </td> <td> WITH_RDMA </td>
<td> 是否编译支持RDMA的相关部分 </td> <td> 是否编译支持RDMA的相关部分 </td>
...@@ -245,86 +239,27 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。 ...@@ -245,86 +239,27 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> paddlepaddle==[版本号] 如 paddlepaddle==1.0.1(下载1.0.1版本只支持CPU的PaddlePaddle)</td> <td> paddlepaddle==[版本号] 例如 paddlepaddle==1.2.0 </td>
<td> 只支持CPU对应版本的PaddlePaddle,具体版本请参见<a href=https://pypi.org/project/paddlepaddle/#history>Pypi</a> </td> <td> 只支持CPU对应版本的PaddlePaddle,具体版本请参见<a href=https://pypi.org/project/paddlepaddle/#history>Pypi</a> </td>
</tr> </tr>
<tr> <tr>
<td> paddlepaddle-gpu==1.0.1 </td> <td> paddlepaddle-gpu==1.2.0 </td>
<td> 使用CUDA 9.0和cuDNN 7编译的1.0.1版本 </td> <td> 使用CUDA 9.0和cuDNN 7编译的1.2.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.1.post87 </td>
<td> 使用CUDA 8.0和cuDNN 7编译的1.0.1版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.1.post85 </td>
<td> 使用CUDA 8.0和cuDNN 5编译的1.0.1版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.0 </td>
<td> 使用CUDA 9.0和cuDNN 7编译的1.0.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.0.post87 </td>
<td> 使用CUDA 8.0和cuDNN 7编译的1.0.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.0.post85 </td>
<td> 使用CUDA 8.0和cuDNN 5编译的1.0.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.15.0 </td>
<td> 使用CUDA 9.0和cuDNN 7编译的0.15.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.15.0.post87 </td>
<td> 使用CUDA 8.0和cuDNN 7编译的0.15.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.15.0.post85 </td>
<td> 使用CUDA 8.0和cuDNN 5编译的0.15.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.14.0 </td>
<td> 使用CUDA 9.0和cuDNN 7编译的0.15.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.14.0.post87 </td>
<td> 使用CUDA 8.0和cuDNN 7编译的0.15.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.14.0.post85 </td>
<td> 使用CUDA 8.0和cuDNN 5编译的0.15.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.13.0 </td>
<td> 使用CUDA 9.0和cuDNN 7编译的0.13.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.12.0 </td>
<td> 使用CUDA 8.0和cuDNN 5编译的0.12.0版本 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.11.0.post87 </td>
<td> 使用CUDA 8.0和cuDNN 7编译的0.11.0版本 </td>
</tr> </tr>
<tr> <tr>
<td> paddlepaddle-gpu==0.11.0.post85 </td> <td> paddlepaddle-gpu==1.2.0.post87 </td>
<td> 使用CUDA 8.0和cuDNN 5编译的0.11.0版本 </td> <td> 使用CUDA 8.0和cuDNN 7编译的1.2.0版本 </td>
</tr> </tr>
<tr> <tr>
<td> paddlepaddle-gpu==0.11.0 </td> <td> paddlepaddle-gpu==1.2.0.post85 </td>
<td> 使用CUDA 7.5和cuDNN 5编译的0.11.0版本 </td> <td> 使用CUDA 8.0和cuDNN 5编译的1.2.0版本 </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</p> </p>
您可以在 [Release History](https://pypi.org/project/paddlepaddle-gpu/#history) 中找到PaddlePaddle-gpu的各个发行版本。 您可以在 [Release History](https://pypi.org/project/paddlepaddle-gpu/#history) 中找到PaddlePaddle-gpu的各个发行版本。
需要注意的是,在v1.3版本中,<code> paddlepaddle-gpu </code> 命令在windows环境下,会默认安装CUDA 8.0和cuDNN 5编译的PaddlePaddle
***
*** ***
...@@ -425,10 +360,80 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。 ...@@ -425,10 +360,80 @@ PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/cuDNN库。
<td> <a href="http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp37-cp37m-linux_x86_64.whl">
paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr>
<td> win_amd64 </td>
<td> - </td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp27-cp27m-win_amd64.whl">
paddlepaddle-1.3.0-cp27-cp27m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp35-cp35m-win_amd64.whl">
paddlepaddle-1.3.0-cp35-cp35m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp36-cp36m-win_amd64.whl">
paddlepaddle-1.3.0-cp36-cp36m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp37-cp37m-win_amd64.whl">
paddlepaddle-1.3.0-cp37-cp37m-win_amd64.whl</a></td>
</tr>
<tr>
<td> cuda8.0_cudnn5_win_amd64 </td>
<td> - </td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp27-cp27m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp27-cp27m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp35-cp35m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp35-cp35m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp36-cp36m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp36-cp36m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp37-cp37m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp37-cp37m-win_amd64.whl</a></td>
</tr>
</tbody> </tbody>
</table> </table>
</p> </p>
### 表格说明
- 纵轴
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'
<a name="ciwhls"></a> <a name="ciwhls"></a>
</br></br> </br></br>
## **多版本whl包列表-dev** ## **多版本whl包列表-dev**
......
...@@ -177,11 +177,6 @@ ...@@ -177,11 +177,6 @@
<td> Whether to Compile with distributed version </td> <td> Whether to Compile with distributed version </td>
<td> OFF </td> <td> OFF </td>
</tr> </tr>
<tr>
<td> WITH_MKL </td>
<td> Whether to uses the MKL math library, if not, using OpenBLAS </td>
<td> ON </td>
</tr>
<tr> <tr>
<td> WITH_RDMA </td> <td> WITH_RDMA </td>
<td> Whether to compile the relevant parts that supports RDMA </td> <td> Whether to compile the relevant parts that supports RDMA </td>
...@@ -244,76 +239,20 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif ...@@ -244,76 +239,20 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td> paddlepaddle==[version code] such as paddlepaddle==1.0.1 (download version 1.0.1 which only supports CPU PaddlePaddle)</td> <td> paddlepaddle==[version code] such as paddlepaddle==1.2.0 </td>
<td> Only support the corresponding version of the CPU PaddlePaddle, please refer to <a href=https://pypi.org/project/paddlepaddle/#history>Pypi</a> for the specific version. </td> <td> Only support the corresponding version of the CPU PaddlePaddle, please refer to <a href=https://pypi.org/project/paddlepaddle/#history>Pypi</a> for the specific version. </td>
</tr> </tr>
<tr> <tr>
<td> paddlepaddle-gpu==1.0.1 </td> <td> paddlepaddle-gpu==1.2.0 </td>
<td> Using version 1.0.1 compiled with CUDA 9.0 and cuDNN 7 </td> <td> Using version 1.2.0 compiled with CUDA 9.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.1.post87 </td>
<td> Using version 1.0.1 compiled with CUDA 8.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.1.post85 </td>
<td> Using version 1.0.1 compiled with CUDA 8.0 and cuDNN 5 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.0 </td>
<td> Using version 1.0.0 compiled with CUDA 9.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.0.post87 </td>
<td> Using version 1.0.0 compiled with CUDA 8.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==1.0.0.post85 </td>
<td> Using version 1.0.0 compiled with CUDA 8.0 and cuDNN 5 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.15.0 </td>
<td> Using version 0.15.0 compiled with CUDA 9.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.15.0.post87 </td>
<td> Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.15.0.post85 </td>
<td> Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 5 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.14.0 </td>
<td> Using version 0.15.0 compiled with CUDA 9.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.14.0.post87 </td>
<td> Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.14.0.post85 </td>
<td> Using version 0.15.0 compiled with CUDA 8.0 and cuDNN 5 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.13.0 </td>
<td> Using version 0.13.0 compiled with CUDA 9.0 and cuDNN 7 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.12.0 </td>
<td> Using version 0.12.0 compiled with CUDA 8.0 and cuDNN 5 </td>
</tr>
<tr>
<td> paddlepaddle-gpu==0.11.0.post87 </td>
<td> Using version 0.11.0 compiled with CUDA 8.0 and cuDNN 7 </td>
</tr> </tr>
<tr> <tr>
<td> paddlepaddle-gpu==0.11.0.post85 </td> <td> paddlepaddle-gpu==1.2.0.post87 </td>
<td> Using version 0.11.0 compiled with CUDA 8.0 and cuDNN 5 </td> <td> Using version 1.2.0 compiled with CUDA 8.0 and cuDNN 7 </td>
</tr> </tr>
<tr> <tr>
<td> paddlepaddle-gpu==0.11.0 </td> <td> paddlepaddle-gpu==1.2.0.post85 </td>
<td> Using version 0.11.0 compiled with CUDA 7.5 and cuDNN 5 </td> <td> Using version 1.2.0 compiled with CUDA 8.0 and cuDNN 5 </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
...@@ -322,6 +261,7 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif ...@@ -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). 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
*** ***
<a name="dockers"></a> <a name="dockers"></a>
...@@ -382,81 +322,105 @@ You can find the docker image for each release of PaddlePaddle in the [DockerHub ...@@ -382,81 +322,105 @@ You can find the docker image for each release of PaddlePaddle in the [DockerHub
<tbody> <tbody>
<tr> <tr>
<td> cpu-noavx-mkl </td> <td> cpu-noavx-mkl </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-noavx-mkl/paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-noavx-mkl/paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl">
paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-noavx-mkl/paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-noavx-mkl/paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-noavx-mkl/paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-noavx-mkl/paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-noavx-mkl/paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-noavx-mkl/paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-noavx-mkl/paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-noavx-mkl/paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr> <tr>
<td> cpu_avx_mkl </td> <td> cpu_avx_mkl </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-mkl/paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-mkl/paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl">
paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-mkl/paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-mkl/paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-mkl/paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-mkl/paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-mkl/paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-mkl/paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-mkl/paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-mkl/paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr> <tr>
<td> cpu_avx_openblas </td> <td> cpu_avx_openblas </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-openblas/paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-openblas/paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl">
paddlepaddle-1.2.1-cp27-cp27mu-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp27-cp27mu-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-openblas/paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl"> paddlepaddle-1.2.1-cp27-cp27m-linux_x86_64.whl</a></td> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-openblas/paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl"> paddlepaddle-1.3.0-cp27-cp27m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-openblas/paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-openblas/paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp35-cp35m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-openblas/paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-openblas/paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-cpu-avx-openblas/paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-cpu-avx-openblas/paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl">
paddlepaddle-1.2.1-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr> <tr>
<td> cuda8.0_cudnn5_avx_mkl </td> <td> cuda8.0_cudnn5_avx_mkl </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.2.1.post85-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl</a></td> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.3.0.post85-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.2.1.post85-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.3.0.post85-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.2.1.post85-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.3.0.post85-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.2.1.post85-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.3.0.post85-cp36-cp36m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.2.1.post85-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn5-avx-mkl/paddlepaddle_gpu-1.3.0.post85-cp37-cp37m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr> <tr>
<td> cuda8.0_cudnn7_noavx_mkl </td> <td> cuda8.0_cudnn7_noavx_mkl </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl</a></td> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-noavx-mkl/paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr> <tr>
<td> cuda8.0_cudnn7_avx_mkl </td> <td> cuda8.0_cudnn7_avx_mkl </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post87-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1.post87-cp27-cp27mu-linux_x86_64.whl</a></td> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post87-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0.post87-cp27-cp27mu-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post87-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1.post87-cp27-cp27m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post87-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0.post87-cp27-cp27m-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post87-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1.post87-cp35-cp35m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post87-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0.post87-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post87-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post87-cp36-cp36m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1.post87-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0.post87-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post87-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda8-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post87-cp37-cp37m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1.post87-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0.post87-cp37-cp37m-linux_x86_64.whl</a></td>
</tr> </tr>
<tr> <tr>
<td> cuda9.0_cudnn7_avx_mkl </td> <td> cuda9.0_cudnn7_avx_mkl </td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post97-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp27-cp27mu-linux_x86_64.whl</a></td> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp27-cp27mu-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp27-cp27mu-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post97-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp27-cp27m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp27-cp27m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp27-cp27m-linux_x86_64.whl</a></td>
<td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post97-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl</a></td> <td><a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp35-cp35m-linux_x86_64.whl"> paddlepaddle_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post97-cp36-cp36m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp36-cp36m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1-cp36-cp36m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl</a></td>
<td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.2.1-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.2.1.post97-cp37-cp37m-linux_x86_64.whl"> <td> <a href="http://paddlepaddle.org/download?url=http://paddle-wheel.bj.bcebos.com/1.3.0-gpu-cuda9-cudnn7-avx-mkl/paddlepaddle_gpu-1.3.0.post97-cp37-cp37m-linux_x86_64.whl">
paddlepaddle_gpu-1.2.1-cp37-cp37m-linux_x86_64.whl</a></td> paddlepaddle_gpu-1.3.0-cp37-cp37m-linux_x86_64.whl</a></td>
</tr>
<tr>
<td> win_amd64 </td>
<td> - </td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp27-cp27m-win_amd64.whl">
paddlepaddle-1.3.0-cp27-cp27m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp35-cp35m-win_amd64.whl">
paddlepaddle-1.3.0-cp35-cp35m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp36-cp36m-win_amd64.whl">
paddlepaddle-1.3.0-cp36-cp36m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle-1.3.0-cp37-cp37m-win_amd64.whl">
paddlepaddle-1.3.0-cp37-cp37m-win_amd64.whl</a></td>
</tr>
<tr>
<td> cuda8.0_cudnn5_win_amd64 </td>
<td> - </td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp27-cp27m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp27-cp27m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp35-cp35m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp35-cp35m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp36-cp36m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp36-cp36m-win_amd64.whl</a></td>
<td> <a href="https://paddle-wheel.bj.bcebos.com/1.3.0-win-noavx-openblas/paddlepaddle_gpu-1.3.0-cp37-cp37m-win_amd64.whl">
paddlepaddle_gpu-1.3.0-cp37-cp37m-win_amd64.whl</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
......
...@@ -133,8 +133,8 @@ exe.run(fluid.default_startup_program()) #网络参数初始化 ...@@ -133,8 +133,8 @@ exe.run(fluid.default_startup_program()) #网络参数初始化
#准备数据 #准备数据
import numpy import numpy
data_1 = input("a=") data_1 = int(input("Please enter an integer: a="))
data_2 = input("b=") data_2 = int(input("Please enter an integer: b="))
x = numpy.array([[data_1]]) x = numpy.array([[data_1]])
y = numpy.array([[data_2]]) y = numpy.array([[data_2]])
......
...@@ -137,8 +137,8 @@ exe.run(fluid.default_startup_program()) #initialize network parameters ...@@ -137,8 +137,8 @@ exe.run(fluid.default_startup_program()) #initialize network parameters
#Prepare data #Prepare data
import numpy import numpy
data_1 = input("a=") data_1 = int(input("Please enter an integer: a="))
data_2 = input("b=") data_2 = int(input("Please enter an integer: b="))
x = numpy.array([[data_1]]) x = numpy.array([[data_1]])
y = numpy.array([[data_2]]) y = numpy.array([[data_2]])
......
Subproject commit 2e55fd4630de30ecf86e5c59f89285e5786762ba Subproject commit 2a1d135ccd10247954ba4cc5f870580a76b4530f
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册