提交 07c35bed 编写于 作者: M Macrobull

Merge remote-tracking branch 'upstream/master'

# X2Paddle # X2Paddle
[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE) [![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE)
[![Version](https://img.shields.io/github/release/PaddlePaddle/X2Paddle.svg)](https://github.com/PaddlePaddle/X2Paddle/releases)
# 简介 # 简介
X2Paddle支持将Caffe和TensorFlow模型转至PaddlePaddle模型 X2Paddle支持将Caffe和TensorFlow模型转至PaddlePaddle模型,同时我们目前维护了TensorFlow/Caffe与PaddlePaddle接口对比分析文档。
任何使用问题均可通过[ISSUE](https://github.com/PaddlePaddle/X2Paddle/issues)的方式及时反馈,或者也可直接通过pull request的方式一起更新代码和文档。
## [caffe2fluid](caffe2fluid) ## [caffe2fluid](caffe2fluid)
1. 支持将Caffe模型转至PaddlePaddle fluid可加载预测模型 1. 支持将Caffe模型转至PaddlePaddle fluid可加载预测模型
......
# caffe2fluid # caffe2fluid
[![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE) [![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE)
caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc/接口速查表.md)]目录中整理了Caffe-PaddlePaddle的常用API对比分析。 caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc/ReadMe.md)]目录中整理了Caffe-PaddlePaddle的常用API对比分析。
## 环境依赖 ## 环境依赖
...@@ -11,7 +11,7 @@ caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc ...@@ -11,7 +11,7 @@ caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc
> future > future
**caffe2fluid的运行仅依赖上述条件** **caffe2fluid的运行仅依赖上述条件**
但建议在环境中安装好caffe和paddlepaddle,便于转换模型后测试。环境安装可参考[安装文档](prepare.md) 但建议在环境中安装好Caffe和PaddlePaddle,便于转换模型后测试。环境安装可参考[安装文档](prepare.md)
## 使用方法 ## 使用方法
...@@ -19,9 +19,8 @@ caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc ...@@ -19,9 +19,8 @@ caffe2fluid用于将Caffe模型转换为PaddlePaddle模型,此外在[[doc](doc
1. Caffe模型转换为PaddlePaddle模型代码和参数文件(参数以numpy形式保存) 1. Caffe模型转换为PaddlePaddle模型代码和参数文件(参数以numpy形式保存)
``` ```
# alexnet.prototxt : caffe配置文件 # --def_path : Caffe配置文件的保存路径
# --def_path : caffe配置文件的保存路径 # --caffemodel : Caffe模型的保存路径
# --caffemodel : caffe模型的保存路径
# --data-output-path : 转换后模型参数保存路径 # --data-output-path : 转换后模型参数保存路径
# --code-output-path : 转换后模型代码保存路径 # --code-output-path : 转换后模型代码保存路径
python convert.py --def_path alexnet.prototxt \ python convert.py --def_path alexnet.prototxt \
...@@ -43,11 +42,11 @@ python alexnet.py --npy_path alexnet.npy --model-param-path ./fluid --need-layer ...@@ -43,11 +42,11 @@ python alexnet.py --npy_path alexnet.npy --model-param-path ./fluid --need-layer
模型的加载及预测可参考PaddlePaddle官方文档[加载预测模型](http://www.paddlepaddle.org/documentation/docs/zh/1.3/api_guides/low_level/inference.html#id4) 模型的加载及预测可参考PaddlePaddle官方文档[加载预测模型](http://www.paddlepaddle.org/documentation/docs/zh/1.3/api_guides/low_level/inference.html#id4)
### 模型转换前后差异对比 ### 模型转换前后差异对比
模型转换后,可通过如下方式,逐层对比转换后的模型与原模型的计算结果差异(**运行环境依赖caffe和paddlepaddle** 模型转换后,可通过如下方式,逐层对比转换后的模型与原模型的计算结果差异(**运行环境依赖Caffe和paddlepaddle**
``` ```
# alexnet : caffe配置文件(.prototxt)中“name”的值 # alexnet : Caffe配置文件(.prototxt)中“name”的值
# ../../alexnet.prototxt : caffe配置文件路径 # ../../alexnet.prototxt : Caffe配置文件路径
# ../../alexnet.caffemodel : caffe模型文件路径 # ../../alexnet.caffemodel : Caffe模型文件路径
# ../../alexnet.py : 转换后模型代码保存路径 # ../../alexnet.py : 转换后模型代码保存路径
# ../../alexnet.npy : 转换后模型参数保存路径 # ../../alexnet.npy : 转换后模型参数保存路径
# ./data/65.jpeg : 需要测试的图像数据 # ./data/65.jpeg : 需要测试的图像数据
......
### Caffe2Fluid # caffe2fluid
This tool is used to convert a Caffe model to a Fluid model [![License](https://img.shields.io/badge/license-Apache%202-blue.svg)](LICENSE)
### Key Features This tool is used to convert a Caffe model to a Fluid model. In the [[doc](doc/ReadMe.md)] directory, the common APIs of Caffe-PaddlePaddle are compared and analyzed.
1. Convert caffe model to fluid model with codes of defining a network(useful for re-training)
## Prerequisites
2. Pycaffe is not necessary when just want convert model without do caffe-inference
> python >= 2.7
3. Caffe's customized layers convertion also be supported by extending this tool > numpy
> protobuf >= 3.6.0
4. A bunch of tools in `examples/imagenet/tools` are provided to compare the difference > future
### HowTo **The running process of caffe2fluid only relies on above conditions.**
1. Prepare `caffepb.py` in `./proto` if your python has no `pycaffe` module, two options provided here: It is recommended to install the Caffe and PaddlePaddle in the environment for testing after converting the model. For environmental installation, please refer to [Installation Documentation](prepare_en.md)
- Generate pycaffe from caffe.proto
``` ## HowTo
bash ./proto/compile.sh
``` ### Model Conversion
1. Convert the Caffe's model to the PaddlePaddle's model code and parameter file (The parameters are saved as the form of numpy).
- Download one from github directly
``` ```
cd proto/ && wget https://raw.githubusercontent.com/ethereon/caffe-tensorflow/master/kaffe/caffe/caffepb.py # --def_path : The path of Caffe's configuration file
``` # --caffemodel : The save path of Caffe's model file
# --data-output-path : The save path of the model after converting
2. Convert the Caffe model to Fluid model # --code-output-path : The save path of the model code after converting
- Generate fluid code and weight file python convert.py --def_path alexnet.prototxt \
``` --caffemodel alexnet.caffemodel \
python convert.py alexnet.prototxt \ --data-output-path alexnet.npy \
--caffemodel alexnet.caffemodel \ --code-output-path alexnet.py
--data-output-path alexnet.npy \ ```
--code-output-path alexnet.py
``` 2. The model network structure and parameters can be serialized as the model format supported by the PaddlePaddle framework.
```
- Save weights as fluid model file # --model-param-path : The save path of PaddlePaddle's serialized model
``` python alexnet.py --npy_path alexnet.npy --model-param-path ./fluid_model
# only infer the last layer's result ```
python alexnet.py alexnet.npy ./fluid Or you can specify the output of the saved model when saving.
# infer these 2 layer's result ```
python alexnet.py alexnet.npy ./fluid fc8,prob # The output of model is the fc8 layer and prob layer.
``` python alexnet.py --npy_path alexnet.npy --model-param-path ./fluid --need-layers-name fc8,prob
```
3. Use the converted model to infer Model loading and prediction can refer to the [official PaddlePaddle document](http://www.paddlepaddle.org/documentation/docs/en/1.3/api_guides/low_level/inference_en.html).
- See more details in `examples/imagenet/tools/run.sh`
### Comparison of differences before and after model conversion
4. Compare the inference results with caffe After the model is converted, the difference between the converted model and the original model can be compared layer by layer (**the running environment depends on caffe and paddlepaddle**)
- See more details in `examples/imagenet/tools/diff.sh` ```
# alexnet : The value of "name" in the Caffe's configuration file (.prototxt)
### How to convert custom layer # ../../alexnet.prototxt : The path of Caffe's configuration file
# ../../alexnet.caffemodel : The save path of Caffe's model file
# ../../alexnet.py : The save path of the model after converting
# ../../alexnet.npy : The save path of the model code after converting
# ./data/65.jpeg : The path of image which is need to reference
cd examples/imagenet
bash tools/diff.sh alexnet ../../alexnet.prototxt \
../../alexnet.caffemodel \
../../alexnet.py \
../../alexnet.npy \
./data/65.jpeg
```
## How to convert custom layer
In the model conversion, when encounter an unsupported custom layer, users can add code to achieve a custom layer according to their needs. thus supporting the complete conversion of the model. The implementation is the following process.
1. Implement your custom layer in a file under `kaffe/custom_layers`, eg: mylayer.py 1. Implement your custom layer in a file under `kaffe/custom_layers`, eg: mylayer.py
- Implement ```shape_func(input_shape, [other_caffe_params])``` to calculate the output shape - Implement ```shape_func(input_shape, [other_caffe_params])``` to calculate the output shape
- Implement ```layer_func(inputs, name, [other_caffe_params])``` to construct a fluid layer - Implement ```layer_func(inputs, name, [other_caffe_params])``` to construct a fluid layer
- Register these two functions ```register(kind='MyType', shape=shape_func, layer=layer_func)``` - Register these two functions ```register(kind='MyType', shape=shape_func, layer=layer_func)```
- Notes: more examples can be found in `kaffe/custom_layers` - Notes: more examples can be found in `kaffe/custom_layers`
2. Add ```import mylayer``` to `kaffe/custom_layers/\_\_init__.py` 2. Add ```import mylayer``` to `kaffe/custom_layers/__init__.py`
3. Prepare your pycaffe as your customized version(same as previous env prepare) 3. Prepare your pycaffe as your customized version(same as previous env prepare)
- (option1) replace `proto/caffe.proto` with your own caffe.proto and compile it - (option1) replace `proto/caffe.proto` with your own caffe.proto and compile it
...@@ -65,9 +82,8 @@ This tool is used to convert a Caffe model to a Fluid model ...@@ -65,9 +82,8 @@ This tool is used to convert a Caffe model to a Fluid model
export CAFFE2FLUID_CUSTOM_LAYERS=/path/to/caffe2fluid/kaffe export CAFFE2FLUID_CUSTOM_LAYERS=/path/to/caffe2fluid/kaffe
``` ```
6. Use the converted model when loading model in `xxxnet.py` and `xxxnet.npy`(no need if model is already in `fluid/model` and `fluid/params`)
### Tested models ### Tested models
The caffe2fluid passed the test on the following model:
- Lenet: - Lenet:
[model addr](https://github.com/ethereon/caffe-tensorflow/blob/master/examples/mnist) [model addr](https://github.com/ethereon/caffe-tensorflow/blob/master/examples/mnist)
......
...@@ -6,24 +6,24 @@ ...@@ -6,24 +6,24 @@
layer { layer {
name: "accuracy" name: "accuracy"
type: "Accuracy" type: "Accuracy"
bottom: "pred" bottom: "input"
bottom: "label" bottom: "label"
top: "accuracy" top: "accuracy"
include{ include {
phase: TEST phase: TEST
} }
} }
``` ```
### [paddle.fluid.layers.accuracy](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-253-accuracy) ### [paddle.fluid.layers.accuracy](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#accuracy)
```python ```python
paddle.fluid.layers.accuracy( paddle.fluid.layers.accuracy(
input, input,
label, label,
k = 1, k=1,
correct = None, correct=None,
total = None total=None
) )
``` ```
......
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "ArgMax" type: "ArgMax"
bottom: "data" bottom: "data"
top: "argmax" top: "argmax"
argmax_param{ argmax_param {
out_max_val: false out_max_val: false
top_k: 1 top_k: 1
axis: 0 axis: 0
...@@ -17,11 +17,11 @@ layer { ...@@ -17,11 +17,11 @@ layer {
``` ```
### [paddle.fluid.layers.argmax](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-204-argmax) ### [paddle.fluid.layers.argmax](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-214-argmax)
```python ```python
paddle.fluid.layers.argmax( paddle.fluid.layers.argmax(
x, x,
axis = 0 axis=0
) )
``` ```
......
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "BatchNorm" type: "BatchNorm"
bottom: "data" bottom: "data"
top: "bn" top: "bn"
batch_norm_param{ batch_norm_param {
use_global_stats: true use_global_stats: true
moving_average_fraction: 0.999 moving_average_fraction: 0.999
eps: 0.00001 eps: 0.00001
...@@ -17,7 +17,7 @@ layer { ...@@ -17,7 +17,7 @@ layer {
``` ```
### [paddle.fluid.layers.batch_norm](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-36-batch_norm) ### [paddle.fluid.layers.batch_norm](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-36-batch_norm)
```python ```python
paddle.fluid.layers.batch_norm( paddle.fluid.layers.batch_norm(
input, input,
......
...@@ -3,24 +3,24 @@ ...@@ -3,24 +3,24 @@
### [Convolution](http://caffe.berkeleyvision.org/tutorial/layers/convolution.html) ### [Convolution](http://caffe.berkeleyvision.org/tutorial/layers/convolution.html)
``` ```
layer{ layer {
name: "conv" name: "conv"
type: "Convolution" type: "Convolution"
bottom: "data" bottom: "data"
top: "conv" top: "conv"
#卷积核的局部学习率和权值衰减因子 # 卷积核的局部学习率和权值衰减因子
param{ param {
lr_mult: 1 lr_mult: 1
decay_mult: 1 decay_mult: 1
} }
#偏置项的局部学习率和权值衰减因子 # 偏置项的局部学习率和权值衰减因子
param{ param {
lr_mult: 2 lr_mult: 2
decay_mult: 0 decay_mult: 0
} }
convolution_param{ convolution_param {
num_output: 20 #必填项 num_output: 20 # 必填项
kernel_size: 5 #必填项 kernel_size: 5 # 必填项
stride: 1 stride: 1
pad: 0 pad: 0
group: 1 group: 1
...@@ -38,16 +38,16 @@ layer{ ...@@ -38,16 +38,16 @@ layer{
``` ```
### [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-45-conv2d) ### [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-45-conv2d)
```python ```python
paddle.fluid.layers.conv2d( paddle.fluid.layers.conv2d(
input, input,
num_filters, num_filters,
output_size, output_size,
stride = 1, stride=1,
padding = 0, padding=0,
dilation = 1, dilation=1,
groups = None, groups=None,
param_attr=None, param_attr=None,
bias_attr=None, bias_attr=None,
use_cudnn=True, use_cudnn=True,
...@@ -60,7 +60,7 @@ paddle.fluid.layers.conv2d( ...@@ -60,7 +60,7 @@ paddle.fluid.layers.conv2d(
#### 参数初始化 #### 参数初始化
Caffe:Layer定义中共有两个结构体`param`用于设置局部学习率和权值衰减因子,其中第一个用于设置卷积核,第二个则用于设置偏值项;卷积核和偏置项的初始化参数在`convolution_param`中进行设置;是否使用偏置项可以使用`bias_term`进行设置; Caffe:Layer定义中共有两个结构体`param`用于设置局部学习率和权值衰减因子,其中第一个用于设置卷积核,第二个则用于设置偏值项;卷积核和偏置项的初始化参数在`convolution_param`中进行设置;是否使用偏置项可以使用`bias_term`进行设置;
PaddlePaddle:卷积核和偏置项的参数分别使用`param_attr``bias_attr`进行配置,配置参数如下所示,此外将`bias_attr`直接设为`False`表示不使用偏置项。 PaddlePaddle:卷积核和偏置项的参数分别使用`param_attr``bias_attr`进行配置,配置参数如下所示,此外将`bias_attr`直接设为`False`表示不使用偏置项。
``` ```python
paddle.fluid.ParamAttr( paddle.fluid.ParamAttr(
name=None, name=None,
initializer=None, initializer=None,
......
...@@ -9,7 +9,7 @@ layer { ...@@ -9,7 +9,7 @@ layer {
bottom: "data1" bottom: "data1"
bottom: "data2" bottom: "data2"
top: “crop" top: “crop"
crop_param{ crop_param {
axis: 1 axis: 1
offset: 0 offset: 0
offset: 2 offset: 2
...@@ -18,7 +18,7 @@ layer { ...@@ -18,7 +18,7 @@ layer {
``` ```
### [paddle.fluid.layers.crop](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-51-crop) ### [paddle.fluid.layers.crop](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-51-crop)
```python ```python
paddle.fluid.layers.crop( paddle.fluid.layers.crop(
x, x,
...@@ -47,7 +47,7 @@ layer { ...@@ -47,7 +47,7 @@ layer {
bottom: "data1" bottom: "data1"
bottom: "data2" bottom: "data2"
top: ”crop" top: ”crop"
crop_param{ crop_param {
axis: 1 axis: 1
offset: 0 offset: 0
offset: 25 offset: 25
...@@ -59,7 +59,7 @@ layer { ...@@ -59,7 +59,7 @@ layer {
```python ```python
# PaddlePaddle示例: # PaddlePaddle示例:
# inputs1输入shape:(20,3,128,128) # inputs1输入shape:(20,3,128,128)
output1 = fluid.layers.crop(x = inputs1, shape=inputs2, offsets=[0,0,25,25]) output1 = fluid.layers.crop(x=inputs1, shape=inputs2, offsets=[0,0,25,25])
# 输出shape:(20,2,64,64) # 输出shape:(20,2,64,64)
output = fluid.layers.crop(x = inputs1, shape=[20,2,64,64], offsets=[0,0,25,25]) output = fluid.layers.crop(x=inputs1, shape=[20,2,64,64], offsets=[0,0,25,25])
``` ```
...@@ -3,24 +3,24 @@ ...@@ -3,24 +3,24 @@
### [Deconvolution](http://caffe.berkeleyvision.org/tutorial/layers/deconvolution.html) ### [Deconvolution](http://caffe.berkeleyvision.org/tutorial/layers/deconvolution.html)
``` ```
layer{ layer {
name: "deconv" name: "deconv"
type: "Deconvolution" type: "Deconvolution"
bottom: "data" bottom: "data"
top: "conv" top: "deconv"
#卷积核的局部学习率和权值衰减因子 # 卷积核的局部学习率和权值衰减因子
param{ param {
lr_mult: 1 lr_mult: 1
decay_mult: 1 decay_mult: 1
} }
#偏置项的局部学习率和权值衰减因子 # 偏置项的局部学习率和权值衰减因子
param{ param {
lr_mult: 2 lr_mult: 2
decay_mult: 0 decay_mult: 0
} }
convolution_param{ convolution_param {
num_output: 20 #必填项 num_output: 20 # 必填项
kernel_size: 3 #必填项 kernel_size: 3 # 必填项
stride: 1 stride: 1
pad: 0 pad: 0
group: 1 group: 1
...@@ -38,16 +38,16 @@ layer{ ...@@ -38,16 +38,16 @@ layer{
``` ```
### [paddle.fluid.layers.conv2d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-46-conv2d_transpose) ### [paddle.fluid.layers.conv2d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-46-conv2d_transpose)
```python ```python
paddle.fluid.layers.conv2d_transpose( paddle.fluid.layers.conv2d_transpose(
input, input,
num_filters, num_filters,
output_size, output_size,
stride = 1, stride=1,
padding = 0, padding=0,
dilation = 1, dilation=1,
groups = None, groups=None,
param_attr=None, param_attr=None,
bias_attr=None, bias_attr=None,
use_cudnn=True, use_cudnn=True,
...@@ -60,7 +60,7 @@ paddle.fluid.layers.conv2d_transpose( ...@@ -60,7 +60,7 @@ paddle.fluid.layers.conv2d_transpose(
#### 参数初始化 #### 参数初始化
Caffe:Layer定义中共有两个结构体`param`用于设置局部学习率和权值衰减因子,其中第一个用于设置卷积核,第二个则用于设置偏值项;卷积核和偏置项的初始化参数在`convolution_param`中进行设置;是否使用偏置项可以使用`bias_term`进行设置; Caffe:Layer定义中共有两个结构体`param`用于设置局部学习率和权值衰减因子,其中第一个用于设置卷积核,第二个则用于设置偏值项;卷积核和偏置项的初始化参数在`convolution_param`中进行设置;是否使用偏置项可以使用`bias_term`进行设置;
PaddlePaddle:卷积核和偏置项的参数分别使用`param_attr``bias_attr`进行配置,配置参数如下所示,此外将`bias_attr`直接设为`False`表示不使用偏置项。 PaddlePaddle:卷积核和偏置项的参数分别使用`param_attr``bias_attr`进行配置,配置参数如下所示,此外将`bias_attr`直接设为`False`表示不使用偏置项。
``` ```python
paddle.fluid.ParamAttr( paddle.fluid.ParamAttr(
name=None, name=None,
initializer=None, initializer=None,
......
...@@ -8,14 +8,14 @@ layer { ...@@ -8,14 +8,14 @@ layer {
type: "Dropout" type: "Dropout"
bottom: "data" bottom: "data"
top: “dropout" top: “dropout"
dropout_param{ dropout_param {
dropout_ratio: 0.5 dropout_ratio: 0.5
} }
} }
``` ```
### [paddle.fluid.layers.dropout](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-56-dropout) ### [paddle.fluid.layers.dropout](hhttp://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-56-dropout)
```python ```python
paddle.fluid.layers.dropout( paddle.fluid.layers.dropout(
x, x,
...@@ -23,7 +23,7 @@ paddle.fluid.layers.dropout( ...@@ -23,7 +23,7 @@ paddle.fluid.layers.dropout(
is_test=False, is_test=False,
seed=None, seed=None,
name=None, name=None,
dropout_implementation='downgrade_in_infer' dropout_implementation="downgrade_in_infer"
) )
``` ```
...@@ -34,7 +34,7 @@ PaddlePaddle:实现方式支持`downgrade_in_infer`和`upscale_in_infer`两种 ...@@ -34,7 +34,7 @@ PaddlePaddle:实现方式支持`downgrade_in_infer`和`upscale_in_infer`两种
``` ```
1. downgrade_in_infer实现方式 1. downgrade_in_infer实现方式
训练时: out = input * mask 训练时: out = input * mask
预测时: out = input * dropout_prob 预测时: out = input * dropout_prob* (1.0 - dropout_prob)
2. upscale_in_infer实现方式 2. upscale_in_infer实现方式
训练时: out = input * mask / (1.0 - dropout_prob) 训练时: out = input * mask / (1.0 - dropout_prob)
预测时: out = input 预测时: out = input
......
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
layer { layer {
name: "eltwise" name: "eltwise"
type: "Eltwise" type: "Eltwise"
bottom: "num1" bottom: "data1"
bottom: "num2" bottom: "data2"
top: "prod" top: "prod"
eltwise_param{ eltwise_param {
operation: PROD #还有MAX,SUM operation: PROD # 还有MAX,SUM
stable_prod_grad: false stable_prod_grad: false
# coeff: 1 # coeff: 1
# coeff: -1 # coeff: -1
...@@ -19,31 +19,32 @@ layer { ...@@ -19,31 +19,32 @@ layer {
``` ```
### [paddle.fluid.layers.elementwise_sum](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-61-elementwise_add) ### [paddle.fluid.layers.elementwise_add](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-61-elementwise_add)
### [paddle.fluid.layers.elementwise_max](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-63-elementwise_max) ### [paddle.fluid.layers.elementwise_max](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-63-elementwise_max)
### [paddle.fluid.layers.elementwise_mul](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-65-elementwise_mul) ### [paddle.fluid.layers.elementwise_mul](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-65-elementwise_mul)
```python ```python
paddle.fluid.layers.elementwise_sum( paddle.fluid.layers.elementwise_add(
x, x,
y, y,
axis = -1, axis=-1,
act = None, act=None,
name = None name=None
) )
paddle.fluid.layers.elementwise_max( paddle.fluid.layers.elementwise_max(
x, x,
y, y,
axis = -1, axis=-1,
act = None, act=None,
name = None name=None
) )
paddle.fluid.layers.elementwise_mul( paddle.fluid.layers.elementwise_mul(
x, x,
y, y,
axis = -1, axis=-1,
act = None,name = None act=None,
name=None
) )
``` ```
......
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
layer { layer {
name: "loss" name: "loss"
type: "EuclideanLoss" type: "EuclideanLoss"
bottom: "pred" bottom: "input"
bottom: "label" bottom: "label"
top: "loss" top: "loss"
} }
``` ```
### [paddle.fluid.layers.square_error_cost](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-167-square_error_cost) ### [paddle.fluid.layers.square_error_cost](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-173-square_error_cost)
```python ```python
paddle.fluid.layers.square_error_cost( paddle.fluid.layers.square_error_cost(
input, input,
......
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "Exp" type: "Exp"
bottom: "data" bottom: "data"
top: "exp" top: "exp"
exp_param{ exp_param {
base: -1 base: -1
scale: 1 scale: 1
shift: 0 shift: 0
...@@ -17,11 +17,11 @@ layer { ...@@ -17,11 +17,11 @@ layer {
``` ```
### [paddle.fluid.layers.exp](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-186-exp) ### [paddle.fluid.layers.exp](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-196-exp)
```python ```python
paddle.fluid.layers.exp( paddle.fluid.layers.exp(
x, x,
name = None name=None
) )
``` ```
...@@ -30,8 +30,8 @@ paddle.fluid.layers.exp( ...@@ -30,8 +30,8 @@ paddle.fluid.layers.exp(
Caffe:有三个关于计算的参数,其计算公式为: Caffe:有三个关于计算的参数,其计算公式为:
$$ $$
y=\begin{cases} y=\begin{cases}
e^(shift+scale \times x),\quad x\leq 0 \\\\ e^{(shift+scale \times x)},\quad x\leq 0 \\\\
base^(shift+scale \times x),\quad x>0 base^{(shift+scale \times x)},\quad x>0
\end{cases} \end{cases}
$$ $$
......
...@@ -8,15 +8,15 @@ layer { ...@@ -8,15 +8,15 @@ layer {
type: "Flatten" type: "Flatten"
bottom: "data" bottom: "data"
top: "flatten" top: "flatten"
flatten_param{ flatten_param {
axis: 1 axis: 1
end_axis: -1 end_axis: -1
} }
} }
``` ```
### [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-72-reshape) ### [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-134-reshape)
```python ```python
paddle.fluid.layers.reshape( paddle.fluid.layers.reshape(
x, x,
......
## InnerProduct ## InnerProduct
### [InnerProduct](http://caffe.berkeleyvision.org/tutorial/layers/innerproduct.html) ### [InnerProduct](http://caffe.berkeleyvision.org/tutorial/layers/innerproduct.html)
``` ```
layer{ layer {
name: "fc" name: "fc"
type: "InnerProduct" type: "InnerProduct"
bottom: "data" bottom: "data"
top: "fc" top: "fc"
#卷积核的局部学习率和权值衰减因子 # 卷积核的局部学习率和权值衰减因子
param{ param {
lr_mult: 1 lr_mult: 1
decay_mult: 1 decay_mult: 1
} }
#偏置项的局部学习率和权值衰减因子 # 偏置项的局部学习率和权值衰减因子
param{ param {
lr_mult: 2 lr_mult: 2
decay_mult: 0 decay_mult: 0
} }
InnerProduct{ inner_product_param {
num_output: 20 #必填项 num_output: 20 # 必填项
bias_term: True bias_term: True
weight_filler { weight_filler {
type: "gaussian" type: "gaussian"
...@@ -32,7 +32,7 @@ layer{ ...@@ -32,7 +32,7 @@ layer{
``` ```
### [paddle.fluid.layers.fc](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-71-fc) ### [paddle.fluid.layers.fc](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-71-fc)
```python ```python
paddle.fluid.layers.fc( paddle.fluid.layers.fc(
input, input,
...@@ -50,7 +50,7 @@ paddle.fluid.layers.fc( ...@@ -50,7 +50,7 @@ paddle.fluid.layers.fc(
#### 参数初始化 #### 参数初始化
Caffe:Layer定义中共有两个结构体`param`用于设置局部学习率和权值衰减因子,其中第一个用于设置权重,第二个则用于设置偏值项;权重和偏置项的初始化参数在`InnerProduct`中进行设置;是否使用偏置项可以使用`bias_term`进行设置; Caffe:Layer定义中共有两个结构体`param`用于设置局部学习率和权值衰减因子,其中第一个用于设置权重,第二个则用于设置偏值项;权重和偏置项的初始化参数在`InnerProduct`中进行设置;是否使用偏置项可以使用`bias_term`进行设置;
PaddlePaddle:权重和偏置项的参数分别使用`param_attr``bias_attr`进行配置,配置参数如下所示,此外将`bias_attr`直接设为`False`表示不使用偏置项。 PaddlePaddle:权重和偏置项的参数分别使用`param_attr``bias_attr`进行配置,配置参数如下所示,此外将`bias_attr`直接设为`False`表示不使用偏置项。
``` ```python
paddle.fluid.ParamAttr( paddle.fluid.ParamAttr(
name=None, name=None,
initializer=None, initializer=None,
......
...@@ -5,8 +5,8 @@ layer { ...@@ -5,8 +5,8 @@ layer {
name: "input" name: "input"
type: "Input" type: "Input"
top: "input" top: "input"
input_param{ input_param {
shape{ shape {
dim: 10 dim: 10
dim: 3 dim: 3
dim: 227 dim: 227
...@@ -17,7 +17,7 @@ layer { ...@@ -17,7 +17,7 @@ layer {
``` ```
### [paddle.fluid.layers.data](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-20-data) ### [paddle.fluid.layers.data](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-20-data)
```python ```python
paddle.fluid.layers.data( paddle.fluid.layers.data(
name, name,
...@@ -45,12 +45,12 @@ PaddlePaddle:需要强制定义输入数据的类型,同时可以通过设 ...@@ -45,12 +45,12 @@ PaddlePaddle:需要强制定义输入数据的类型,同时可以通过设
### 代码示例 ### 代码示例
``` ```
# Caffe示例: # Caffe示例:
layer{ layer {
name: "input" name: "input"
type: "Input" type: "Input"
top: "input" top: "input"
input_param{ input_param {
shape{ shape {
dim: 10 dim: 10
dim: 3 dim: 3
dim: 227 dim: 227
......
...@@ -8,17 +8,17 @@ layer { ...@@ -8,17 +8,17 @@ layer {
type: "LRN" type: "LRN"
bottom: "data" bottom: "data"
top: "lrn" top: "lrn"
lrn_parame{ lrn_param {
loal_size: 5 local_size: 5
alphe: 1 alpha: 1
beta: 5 beta: 5
norm_region: 'ACROSS_CHANNELS' norm_region: "ACROSS_CHANNELS"
} }
} }
``` ```
### [paddle.fluid.layers.lrn](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-99-lrn) ### [paddle.fluid.layers.lrn](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-101-lrn)
```python ```python
paddle.fluid.layers.lrn( paddle.fluid.layers.lrn(
input, input,
...@@ -36,11 +36,9 @@ Caffe:参数`norm_region`支持`ACROSS_CHANNELS`和`WITHIN_CHANNEL`两种模 ...@@ -36,11 +36,9 @@ Caffe:参数`norm_region`支持`ACROSS_CHANNELS`和`WITHIN_CHANNEL`两种模
PaddlePaddle:默认且仅支持`ACROSS_CHANNELS`模式。 PaddlePaddle:默认且仅支持`ACROSS_CHANNELS`模式。
#### 计算机制 #### 计算机制
Caffe:在`ACROSS_CHANNELS`模式下,计算公式如下, Caffe:在`ACROSS_CHANNELS`模式下,计算公式如下,公式中的$n$即为参数`local_size`
$$output(i,x,y)=input(i,x,y)/(1+\frac{\alpha}{n}\sum_{j=max(0,i-\frac{n}{2})}^{min(C,i+\frac{n}{2})}{input(j,x,y)^2})^\beta$$ $$output(i,x,y)=input(i,x,y)/(1+\frac{\alpha}{n}\sum_{j=max(0,i-\frac{n}{2})}^{min(C,i+\frac{n}{2})}{input(j,x,y)^2})^\beta$$
位移值固定为1,计算缩放参数的同时除以通道数目
PaddlePaddle:计算公式如下, PaddlePaddle:计算公式如下,
$$output(i,x,y)=input(i,x,y)/(k+\alpha\sum_{j=max(0,i-\frac{n}{2})}^{min(C,i+\frac{n}{2})}{input(j,x,y)^2})^\beta$$ $$output(i,x,y)=input(i,x,y)/(k+\alpha\sum_{j=max(0,i-\frac{n}{2})}^{min(C,i+\frac{n}{2})}{input(j,x,y)^2})^\beta$$
能通过设置k来定义位移数。
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "Log" type: "Log"
bottom: "data" bottom: "data"
top: "log" top: "log"
log_param{ log_param {
base: -1 base: -1
scale: 1 scale: 1
shift: 0 shift: 0
...@@ -17,7 +17,7 @@ layer { ...@@ -17,7 +17,7 @@ layer {
``` ```
### [paddle.fluid.layers.log](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-93-log) ### [paddle.fluid.layers.log](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-95-log)
```python ```python
paddle.fluid.layers.log( paddle.fluid.layers.log(
x, x,
......
...@@ -5,29 +5,29 @@ ...@@ -5,29 +5,29 @@
layer{ layer{
name: "pool" name: "pool"
type: "Pooling" type: "Pooling"
bottom: "conv" bottom: "data"
top: "pool" top: "pool"
pooling_param{ pooling_param {
pool: MAX pool: MAX
kernel_size: 3 #必填项 kernel_size: 3 # 必填项
stride: 1 stride: 1
pad: 0 pad: 0
} }
} }
``` ```
### [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-115-pool2d) ### [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-119-pool2d)
```python ```python
paddle.fluid.layers.pool2d( paddle.fluid.layers.pool2d(
input, input,
pool_size, pool_size,
pool_type = 'max', pool_type='max',
pool_stride = 1, pool_stride=1,
pool_padding = 0, pool_padding=0,
global_pooling = False, global_pooling=False,
use_cudnn = True, use_cudnn=True,
ceil_mode = False, ceil_mode=False,
name = None, name=None,
exclusive = True exclusive=True
) )
``` ```
...@@ -64,9 +64,9 @@ PaddlePaddle:`exclusive`参数为`True`的情况下,`avg`平均池化过程 ...@@ -64,9 +64,9 @@ PaddlePaddle:`exclusive`参数为`True`的情况下,`avg`平均池化过程
layer{ layer{
name: "pool" name: "pool"
type: "Pooling" type: "Pooling"
bottom: "conv" bottom: "data"
top: "pool" top: "pool"
pooling_param{ pooling_param {
pool: MAX pool: MAX
kernel_size: 3 kernel_size: 3
stride: 2 stride: 2
...@@ -77,7 +77,9 @@ layer{ ...@@ -77,7 +77,9 @@ layer{
# PaddlePaddle示例: # PaddlePaddle示例:
# 输入shape:(1,3,228,228) # 输入shape:(1,3,228,228)
# 输出shape:(1,3,113,113) # 输出shape:(1,3,113,113)
pool1 = paddle.fluid.layers.pool2d(input = inputs , pool_size = 3, pool_type = 'max', pool_stride = 2, ceil_mode=False) pool1 = paddle.fluid.layers.pool2d(input = inputs , pool_size = 3,
pool_type = 'max', pool_stride = 2,
ceil_mode=False)
``` ```
......
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "Power" type: "Power"
bottom: "data" bottom: "data"
top: "power" top: "power"
power_param{ power_param {
power: 1 power: 1
scale: 1 scale: 1
shift: 0 shift: 0
...@@ -17,12 +17,12 @@ layer { ...@@ -17,12 +17,12 @@ layer {
``` ```
### [paddle.fluid.layers.power](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-117-pow) ### [paddle.fluid.layers.pow](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-121-pow)
```python ```python
paddle.fluid.layers.power( paddle.fluid.layers.pow(
x, x,
factor = 1.0, factor=1.0,
name = None name=None
) )
``` ```
......
## ReLU
### [ReLU](http://caffe.berkeleyvision.org/tutorial/layers/relu.html)
```
layer {
name: "relu"
type: "ReLU"
bottom: "data"
top: "relu"
relu_param{
negative_slope: 0
}
}
```
### [paddle.fluid.layers.relu](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-128-relu)
```python
paddle.fluid.layers.relu(
x,
name=None
)
```
```python
paddle.fluid.layers.leaky_relu(
x,
alpha = 0.02,
name=None
)
```
### 功能差异
#### 实现的差异
Caffe:使用这个Layer即可分别实现ReLU和Leaky ReLU两个功能。
$$
y=\begin{cases}
x,\quad x\geq 0 \\\\
\alpha \times x,\quad x<0
\end{cases}
$$
PaddlePaddle:只能通过两个函数分别实现ReLU和Leaky ReLU。
$$
y=max(x,\alpha \times x)
$$
当alpha设置为0时,也可以直接使用Leaky ReLU带带Caffe中的ReLU层。
# Caffe常用层速查表 # Caffe-Fluid常用层对应表
本文档梳理了Caffe常用Layer与PaddlePaddle API对应关系和差异分析。根据文档对应关系,有Caffe使用经验的用户,可根据对应关系,快速熟悉PaddlePaddle的接口使用 。
**备注说明**
1. 接口对应:即表示PaddlePaddle接口与Caffe层接口基本一致,但使用者需注意参数名及参数类型
2. PaddlePaddle实现:部分接口提供了PaddlePaddle实现的示例代码,可供用户参考
3. 差异对比:接口存在差异,具体可查看差异对比文档
| 序号 | Caffe层 | PaddlePaddle接口 | 备注 | | 序号 | Caffe层 | PaddlePaddle接口 | 备注 |
| ---- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | ---- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 1 | [AbsVal](http://caffe.berkeleyvision.org/tutorial/layers/absval.html) | [paddle.fluid.layers.abs](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-182-abs) | 接口对应 | | 1 | [AbsVal](http://caffe.berkeleyvision.org/tutorial/layers/absval.html) | [fluid.layers.abs](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-189-abs) | 功能一致 |
| 2 | [Accuracy](http://caffe.berkeleyvision.org/tutorial/layers/accuracy.html) | [paddle.fluid.layers.accuracy](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-253-accuracy) | [差异对比](Accuracy.md) | | 2 | [Accuracy](http://caffe.berkeleyvision.org/tutorial/layers/accuracy.html) | [fluid.layers.accuracy](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-269-accuracy) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Accuracy.md) |
| 3 | [ArgMax](http://caffe.berkeleyvision.org/tutorial/layers/argmax.html) | [paddle.fluid.layers.argmax](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-204-argmax) | [差异对比](ArgMax.md) | | 3 | [ArgMax](http://caffe.berkeleyvision.org/tutorial/layers/argmax.html) | [fluid.layers.argmax](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-214-argmax) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/ArgMax.md) |
| 4 | [BatchNorm](http://caffe.berkeleyvision.org/tutorial/layers/batchnorm.html) | [paddle.fluid.layers.batch_norm](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-36-batch_norm) | [差异对比](BatchNorm.md) | | 4 | [BatchNorm](http://caffe.berkeleyvision.org/tutorial/layers/batchnorm.html) | [fluid.layers.batch_norm](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-36-batch_norm) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/BatchNorm.md) |
| 5 | [BNLL](http://caffe.berkeleyvision.org/tutorial/layers/bnll.html) | [paddle.fluid.layers.softplus](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-194-softplus) | 接口对应 | | 5 | [BNLL](http://caffe.berkeleyvision.org/tutorial/layers/bnll.html) | [fluid.layers.softplus](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-204-softplus) | 功能一致 |
| 6 | [Concat](http://caffe.berkeleyvision.org/tutorial/layers/concat.html) | [paddle.fluid.layers.concat](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-209-concat) | 接口对应 | | 6 | [Concat](http://caffe.berkeleyvision.org/tutorial/layers/concat.html) | [fluid.layers.concat](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-219-concat) | 功能一致 |
| 7 | [Convolution](http://caffe.berkeleyvision.org/tutorial/layers/convolution.html) | [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-45-conv2d) | [差异对比](Convolution.md) | | 7 | [Convolution](http://caffe.berkeleyvision.org/tutorial/layers/convolution.html) | [fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-45-conv2d) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Convolution.md) |
| 8 | [Crop](http://caffe.berkeleyvision.org/tutorial/layers/crop.html) | [paddle.fluid.layers.crop](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-51-crop) | [差异对比](Crop.md) | | 8 | [Crop](http://caffe.berkeleyvision.org/tutorial/layers/crop.html) | [fluid.layers.crop](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-51-crop) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Crop.md) |
| 9 | [Deconvolution](http://caffe.berkeleyvision.org/tutorial/layers/deconvolution.html) | [paddle.fluid.layers.conv2d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-46-conv2d_transpose) | [差异对比](Deconvolution.md) | | 9 | [Deconvolution](http://caffe.berkeleyvision.org/tutorial/layers/deconvolution.html) | [fluid.layers.conv2d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-46-conv2d_transpose) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Deconvolution.md) |
| 10 | [Dropout](http://caffe.berkeleyvision.org/tutorial/layers/dropout.html) | [paddle.fluid.layers.dropout](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-56-dropout) | [差异对比](Dropout.md) | | 10 | [Dropout](http://caffe.berkeleyvision.org/tutorial/layers/dropout.html) | [fluid.layers.dropout](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-56-dropout) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Dropout.md) |
| 11 | [Eltwise](http://caffe.berkeleyvision.org/tutorial/layers/eltwise.html) | - | [PaddlePaddle实现](Eltwise.md) | | 11 | [Eltwise](http://caffe.berkeleyvision.org/tutorial/layers/eltwise.html) | 无相应接口 | [Paddle实现方法](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Eltwise.md) |
| 12 | [ELU](http://caffe.berkeleyvision.org/tutorial/layers/elu.html) | [paddle.layers.fluid.elu](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-68-elu) | 接口对应 | | 12 | [ELU](http://caffe.berkeleyvision.org/tutorial/layers/elu.html) | [fluid.layers.elu](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-68-elu) | 功能一致 |
| 13 | [EuclideanLoss](http://caffe.berkeleyvision.org/tutorial/layers/euclideanloss.html) | [paddle.fluid.layers.square_error_cost](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-167-square_error_cost) | [差异对比](EuclideanLoss.md) | | 13 | [EuclideanLoss](http://caffe.berkeleyvision.org/tutorial/layers/euclideanloss.html) | [fluid.layers.square_error_cost](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-173-square_error_cost) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/EuclideanLoss.md) |
| 14 | [Exp](http://caffe.berkeleyvision.org/tutorial/layers/exp.html) | [paddle.fluid.layers.exp](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-186-exp) | [差异对比](Exp.md) | | 14 | [Exp](http://caffe.berkeleyvision.org/tutorial/layers/exp.html) | [fluid.layers.exp](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-196-exp) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Exp.md) |
| 15 | [Flatten](http://caffe.berkeleyvision.org/tutorial/layers/flatten.html) | [paddle.fluid.layer.reshape](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-72-reshape) | [差异对比](Flatten.md) | | 15 | [Flatten](http://caffe.berkeleyvision.org/tutorial/layers/flatten.html) | [fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-134-reshape) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Flatten.md) |
| 16 | [InnerProduct](http://caffe.berkeleyvision.org/tutorial/layers/innerproduct.html) | [paddle.fluid.layers.fc](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-71-fc) | [差异对比](InnerProduct.md) | | 16 | [InnerProduct](http://caffe.berkeleyvision.org/tutorial/layers/innerproduct.html) | [fluid.layers.fc](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-71-fc) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/InnerProduct.md) |
| 17 | [Input](http://caffe.berkeleyvision.org/tutorial/layers/input.html) | [paddle.fluid.layers.data](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-20-data) | [差异对比](Input.md) | | 17 | [Input](http://caffe.berkeleyvision.org/tutorial/layers/input.html) | [fluid.layers.data](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-20-data) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Input.md) |
| 18 | [Log](http://caffe.berkeleyvision.org/tutorial/layers/log.html) | [paddle.fluid.layers.log](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-93-log) | [差异对比](Log.md) | | 18 | [Log](http://caffe.berkeleyvision.org/tutorial/layers/log.html) | [fluid.layers.log](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-95-log) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Log.md) |
| 19 | [LRN](http://caffe.berkeleyvision.org/tutorial/layers/lrn.html) | [paddle.fluid.layers.lrn](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-99-lrn) | [差异对比](LRN.md) | | 19 | [LRN](http://caffe.berkeleyvision.org/tutorial/layers/lrn.html) | [fluid.layers.lrn](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-101-lrn) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/LRN.md) |
| 20 | [Pooling](http://caffe.berkeleyvision.org/tutorial/layers/pooling.html) | [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-115-pool2d) | [差异对比](Pooling.md) | | 20 | [Pooling](http://caffe.berkeleyvision.org/tutorial/layers/pooling.html) | [fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-119-pool2d) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Pooling.md) |
| 21 | [Power](http://caffe.berkeleyvision.org/tutorial/layers/power.html) | [paddle.fluid.layers.pow](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-117-pow) | [差异对比](Power.md) | | 21 | [Power](http://caffe.berkeleyvision.org/tutorial/layers/power.html) | [fluid.layers.pow](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-121-pow) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Power.md) |
| 22 | [PReLU](http://caffe.berkeleyvision.org/tutorial/layers/prelu.html) | [paddle.layers.fluid.prelu](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-118-prelu) | 接口对应 | | 22 | [PReLU](http://caffe.berkeleyvision.org/tutorial/layers/prelu.html) | [fluid.layers.prelu](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-122-prelu) | 功能一致 |
| 23 | [Reduction](http://caffe.berkeleyvision.org/tutorial/layers/reduction.html) | - | [PaddlePaddle实现](Reduction.md) | | 23 | [Reduction](http://caffe.berkeleyvision.org/tutorial/layers/reduction.html) | 无相应接口 | [Paddle实现方法](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Reduction.md) |
| 24 | [ReLU](http://caffe.berkeleyvision.org/tutorial/layers/relu.html) | - | [PaddlePaddle实现](ReLU.md) | | 24 | [ReLU](http://caffe.berkeleyvision.org/tutorial/layers/relu.html) | [fluid.layers.leaky_relu](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-132-relu) | 功能一致 |
| 25 | [Reshape](http://caffe.berkeleyvision.org/tutorial/layers/reshape.html) | [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-130-reshape) | [差异对比](Reshape.md) | | 25 | [Reshape](http://caffe.berkeleyvision.org/tutorial/layers/reshape.html) | [fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-134-reshape) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Reshape.md) |
| 26 | [Scale](http://caffe.berkeleyvision.org/tutorial/layers/scale.html) | [paddle.fluid.layers.scale](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-137-scale) | [差异对比](Scale.md) | | 26 | [SigmoidCrossEntropyLoss](http://caffe.berkeleyvision.org/tutorial/layers/sigmoidcrossentropyloss.html) | [fluid.layers.sigmoid_cross_entropy_with_logits](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-163-sigmoid_cross_entropy_with_logits) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/SigmoidCrossEntropyLoss.md) |
| 27 | [SigmoidCrossEntropyLoss](http://caffe.berkeleyvision.org/tutorial/layers/sigmoidcrossentropyloss.html) | [paddle.fluid.layers.sigmoid_cross_entropy_with_logits](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-158-sigmoid_cross_entropy_with_logits) | [差异对比](SigmoidCrossEntropyLoss.md) | | 27 | [Sigmoid](http://caffe.berkeleyvision.org/tutorial/layers/sigmoid.html) | [fluid.layers.sigmoid](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-202-sigmoid) | 功能一致 |
| 28 | [Sigmoid](http://caffe.berkeleyvision.org/tutorial/layers/sigmoid.html) | [paddle.fluid.layers.sigmoid](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-192-sigmoid) | 接口对应 | | 28 | [Slice](http://caffe.berkeleyvision.org/tutorial/layers/slice.html) | [fluid.layers.slice](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-165-slice) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Slice.md) |
| 29 | [Slice](http://caffe.berkeleyvision.org/tutorial/layers/slice.html) | [paddle.fluid.layers.slice](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-160-slice) | [差异对比](Slice.md) | | 29 | [SoftmaxWithLoss](http://caffe.berkeleyvision.org/tutorial/layers/softmaxwithloss.html) | [fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-164-softmax_with_cross_entropy) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/SofmaxWithLoss.md) |
| 30 | [SoftmaxWithLoss](http://caffe.berkeleyvision.org/tutorial/layers/softmaxwithloss.html) | [paddle.fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-164-softmax_with_cross_entropy) | [差异对比](SofmaxWithLoss.md) | | 30 | [Softmax](http://caffe.berkeleyvision.org/tutorial/layers/softmax.html) | [fluid.layers.softmax](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-169-softmax_with_cross_entropy) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Sofmax.md) |
| 31 | [Softmax](http://caffe.berkeleyvision.org/tutorial/layers/softmax.html) | [paddle.fluid.layers.softmax](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-163-softmax) | [差异对比](Sofmax.md) | | 31 | [TanH](http://caffe.berkeleyvision.org/tutorial/layers/tanh.html) | [fluid.layers.tanh](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-209-tanh) | 功能一致 |
| 32 | [TanH](http://caffe.berkeleyvision.org/tutorial/layers/tanh.html) | [paddle.fluid.layers.tanh](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-199-tanh) | 接口对应 | | 32 | [Tile](http://caffe.berkeleyvision.org/tutorial/layers/tile.html) | [fluid.layers.expand](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-70-expand) | [差异对比](https://github.com/PaddlePaddle/X2Paddle/blob/master/caffe2fluid/doc/Tile.md) |
| 33 | [Tile](http://caffe.berkeleyvision.org/tutorial/layers/tile.html) | [paddle.fluid.layers.expand](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-70-expand) | [差异对比](Tile.md) |
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "Reduction" type: "Reduction"
bottom: "reduce" bottom: "reduce"
top: “reduce" top: “reduce"
reduction_param{ reduction_param {
operation: SUM operation: SUM
axis: 1 axis: 1
coeff: 2 coeff: 2
...@@ -17,8 +17,8 @@ layer { ...@@ -17,8 +17,8 @@ layer {
``` ```
### [paddle.fluid.layers.reduce_sum](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-127-reduce_sum) ### [paddle.fluid.layers.reduce_sum](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-131-reduce_sum)
### [paddle.fluid.layers.reduce_mean](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-124-reduce_mean) ### [paddle.fluid.layers.reduce_mean](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-128-reduce_mean)
```python ```python
paddle.fluid.layers.reduce_sum( paddle.fluid.layers.reduce_sum(
input, input,
...@@ -27,7 +27,7 @@ paddle.fluid.layers.reduce_sum( ...@@ -27,7 +27,7 @@ paddle.fluid.layers.reduce_sum(
name=None name=None
) )
``` ```
``` ```python
paddle.fluid.layers.reduce_mean( paddle.fluid.layers.reduce_mean(
input, input,
dim=None, dim=None,
...@@ -54,7 +54,7 @@ layer { ...@@ -54,7 +54,7 @@ layer {
type: "Reduction" type: "Reduction"
bottom: "reduce" bottom: "reduce"
top: “reduce" top: “reduce"
reduction_param{ reduction_param {
operation: SUM operation: SUM
axis: 2 axis: 2
coeff: 2 coeff: 2
......
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "Reshape" type: "Reshape"
bottom: "data" bottom: "data"
top: "reshape" top: "reshape"
reshape_param{ reshape_param {
shape{ shape{
dim: 1 dim: 1
... ...
...@@ -20,7 +20,7 @@ layer { ...@@ -20,7 +20,7 @@ layer {
``` ```
### [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-130-reshape) ### [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-134-reshape)
```python ```python
paddle.fluid.layers.reshape( paddle.fluid.layers.reshape(
x, x,
...@@ -56,8 +56,8 @@ layer { ...@@ -56,8 +56,8 @@ layer {
type: "Reshape" type: "Reshape"
bottom: "data" bottom: "data"
top: "reshape" top: "reshape"
reshape_param{ reshape_param {
shape{ shape {
dim: 3 dim: 3
dim: 2 dim: 2
} }
...@@ -71,8 +71,8 @@ layer { ...@@ -71,8 +71,8 @@ layer {
type: "Reshape" type: "Reshape"
bottom: "data" bottom: "data"
top: "reshape" top: "reshape"
reshape_param{ reshape_param {
shape{ shape {
dim: 3 dim: 3
dim: 2 dim: 2
dim: 4 dim: 4
...@@ -83,7 +83,7 @@ layer { ...@@ -83,7 +83,7 @@ layer {
# 输出shape:(2,3,2,4) # 输出shape:(2,3,2,4)
``` ```
``` ```python
# PaddlePaddle示例: # PaddlePaddle示例:
# 输入shape:(2,4,6) # 输入shape:(2,4,6)
output1 = paddle.fluid.layers.reshape(x = inputs , shape = [2,4,-1,3]) output1 = paddle.fluid.layers.reshape(x = inputs , shape = [2,4,-1,3])
......
...@@ -6,14 +6,14 @@ ...@@ -6,14 +6,14 @@
layer { layer {
name: "loss" name: "loss"
type: "SigmoidCrossEntropyLoss" type: "SigmoidCrossEntropyLoss"
bottom: "pred" bottom: "x"
bottom: "label" bottom: "label"
top: "loss" top: "loss"
} }
``` ```
### [paddle.fluid.layers.sigmoid_cross_entropy_with_logits](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-158-sigmoid_cross_entropy_with_logits) ### [paddle.fluid.layers.sigmoid_cross_entropy_with_logits](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-163-sigmoid_cross_entropy_with_logits)
```python ```python
paddle.fluid.layers.sigmoid_cross_entropy_with_logits( paddle.fluid.layers.sigmoid_cross_entropy_with_logits(
x, x,
...@@ -25,13 +25,13 @@ paddle.fluid.layers.sigmoid_cross_entropy_with_logits( ...@@ -25,13 +25,13 @@ paddle.fluid.layers.sigmoid_cross_entropy_with_logits(
``` ```
### 功能差异 ### 功能差异
#### 输入格式 #### 输入数据
Caffe:输入的数据维度最大是4维`N*C*H*W` Caffe:输入数据(`x`)的维度最大是4维(`N*C*H*W`);
PaddlePaddle:输入只能是2维`N*H` PaddlePaddle:输入数据(`x``label`)的维度只能是2维(`N*K`)。
#### 输出结果
#### 输出格式
Caffe:输出的数据大小是`1*1*1*1`,即将所有位置上的loss取均值; Caffe:输出的数据大小是`1*1*1*1`,即将所有位置上的loss取均值;
PaddlePaddle:输出和输入大小一致,即`N*H` PaddlePaddle:输出和输入大小一致,即`N*H`
#### 其他 #### 其他差异
PaddlePaddle:可以通过设定`ignore_index`来确定忽略的目标值,同时它有一个`normalize`参数可以输出除以除去`ignore_index`对应目标外的目标数所得的结果。 Caffe:无`ignore_index``normalize`参数;
PaddlePaddle:可以通过设定`ignore_index`来确定忽略的目标值,同时它有一个`normalize`参数进行归一化。
...@@ -10,17 +10,16 @@ layer { ...@@ -10,17 +10,16 @@ layer {
top: "out1" top: "out1"
top: "out2" top: "out2"
top: "out3" top: "out3"
slice_param{ slice_param {
axis: 1 axis: 1
alice_point: 1 alice_point: 1
alice_point: 2 alice_point: 2
# slice_dim: 1
} }
} }
``` ```
### [paddle.fluid.layers.slice](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-160-slice) ### [paddle.fluid.layers.slice](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-165-slice)
```python ```python
paddle.fluid.layers.slice( paddle.fluid.layers.slice(
input, input,
...@@ -31,10 +30,14 @@ paddle.fluid.layers.slice( ...@@ -31,10 +30,14 @@ paddle.fluid.layers.slice(
``` ```
### 功能差异 ### 功能差异
#### 输入参数
Caffe:输入的`axis``alice_point`等参数都是数值。
PaddlePaddle:输入的`axes``starts``ends`等输入参数都是list类型。
#### slice机制 #### slice机制
Caffe:`axis``alice_point`参数为数值,只能在一个维度上截取,但可以截取多个切片; Caffe:只能在一个维度上截取,但可以截取多个切片。
PaddlePaddle:`axes``start``ends`参数为`list`类型,可以在多个维度上截取,但只能截取一个切片。 PaddlePaddle:可以在多个维度上截取,但只能截取到一个切片。
#### 其他差异
PaddlePaddle:如果传递给`starts``end`的值大于n(此维度中的元素数目),则表示n。
### 代码示例 ### 代码示例
``` ```
# Caffe示例: # Caffe示例:
...@@ -46,8 +49,8 @@ layer { ...@@ -46,8 +49,8 @@ layer {
top: "out1" top: "out1"
top: "out2" top: "out2"
top: "out3" top: "out3"
slice_param{ slice_param {
axis: 1 #使用-1效果相同 axis: 1 # 使用-1效果相同
alice_point: 1 alice_point: 1
alice_point: 2 alice_point: 2
} }
...@@ -57,8 +60,8 @@ layer { ...@@ -57,8 +60,8 @@ layer {
```python ```python
# PaddlePaddle示例: # PaddlePaddle示例:
# 输入shape:(2,6) # 输入shape:(2,6)
output1 = paddle.fluid.layers.slice(input = inputs, axes = [1], starts= [1], ends = [3]) output1 = paddle.fluid.layers.slice(input=inputs, axes=[1], starts=[1], ends=[3])
# 输出shape:(2,2) # 输出shape:(2,2)
output2 = paddle.fluid.layers.slice(input = inputs, axes = [0,1], starts= [0,1], ends = [1,3]) output2 = paddle.fluid.layers.slice(input=inputs, axes=[0,1], starts=[0,1], ends=[1,3])
# 输出shape:(1,2) # 输出shape:(1,2)
``` ```
...@@ -12,12 +12,13 @@ layer { ...@@ -12,12 +12,13 @@ layer {
``` ```
### [paddle.fluid.layers.softmax](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-163-softmax) ### [paddle.fluid.layers.softmax](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-168-softmax)
```python ```python
paddle.fluid.layers.softmax( paddle.fluid.layers.softmax(
input, input,
use_cudnn=True, use_cudnn=False,
name=None name=None,
axis=-1
) )
``` ```
...@@ -25,3 +26,5 @@ paddle.fluid.layers.softmax( ...@@ -25,3 +26,5 @@ paddle.fluid.layers.softmax(
#### 计算机制 #### 计算机制
Caffe:计算softmax之前,对每个样本中的每个值减去该样本中的最大值; Caffe:计算softmax之前,对每个样本中的每个值减去该样本中的最大值;
PaddlePaddle:省略了这一操作直接计算softmax。 PaddlePaddle:省略了这一操作直接计算softmax。
#### 使用机制
PaddlePaddle:通过设置`axis`来确定执行softmax的维度索引。
...@@ -6,10 +6,13 @@ ...@@ -6,10 +6,13 @@
layer { layer {
name: "loss" name: "loss"
type: "SoftmaxWithLoss" type: "SoftmaxWithLoss"
bottom: "pred" bottom: "logits"
bottom: "label" bottom: "label"
top: "loss" top: "loss"
loss_param{ softmax_param {
axis: 1
}
loss_param {
ignore_label: -1 ignore_label: -1
normalize: 0 normalize: 0
normalization: FULL normalization: FULL
...@@ -18,47 +21,53 @@ layer { ...@@ -18,47 +21,53 @@ layer {
``` ```
### [paddle.fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-164-softmax_with_cross_entropy) ### [paddle.fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-169-softmax_with_cross_entropy)
```python ```python
paddle.fluid.layers.softmax_with_cross_entropy( paddle.fluid.layers.softmax_with_cross_entropy(
logits, logits,
label, label,
soft_label = False, soft_label=False,
ignore_index = -100, ignore_index=-100,
numeric_stable_mode = False, numeric_stable_mode=True,
return_softmax = False return_softmax=False
) )
``` ```
### 功能差异 ### 功能差异
#### 计算机制 #### 输入数据
Caffe:输入数据(`x`)的维度最大是4维(`N*C*H*W`);
Caffe:只可以使用硬标签的输入,同时进行预处理操作。 PaddlePaddle:输入数据(`x``label`)的维度只能是2维(`N*K`)。
PaddlePaddle:可以使用`soft_label`来设置是使用软标签(True)还是硬标签(False);将`numeric_stable_mode`设为True,同时在GPU环境下运行,可是在使用硬标签之前先进行预处理。此外,软标签和硬标签的label输入略有不同,当log概率的输入大小为`N*K`时(`N`代表batch size,`K`代表类别数量),软标签的输入大小为`N*K`,其重的数值数据类型为`float`或者`double`,每一个batch中的值都是0或者1(1代表属于这个类别,0则代表不属于);硬标签的输入大小为`N*1`,其重的数值数据类型为`int`,每一个batch中的值都是大于等于0且小于K(代表属于某一个类别)。在Caffe中,则只可以使用硬标签的输入,同时进行预处理操作。 #### 输入格式
Caffe: 采用硬标签方式输入,同时进行预处理操作(为了避免上溢出和下溢出,对输入的每个值减去batch中该位置上的最大值);
> 计算softmax的loss时,根据每个样本是否被分配至多个类别中可以分为两类——硬标签和软标签,具体如下: PaddlePaddle:通过参数`soft_label`的设定,支持硬标签和软标签两种输入。
> 计算softmax的loss时,根据每个样本是否被分配至多个类别中可以分为两类——硬标签和软标签
> **硬标签:** 即one-hot label,每个样本仅分到一个类别中。在硬标签中,根据是否对未初始化的log概率进行预处理,又可以分为两类,预处理主要是完成对每个样本中的每个log概率减去该样本中的最大的log概率。 > **硬标签:** 即one-hot label,每个样本仅分到一个类别中。在硬标签中,根据是否对未初始化的log概率进行预处理,又可以分为两类,预处理主要是完成对每个样本中的每个log概率减去该样本中的最大的log概率
> **软标签:** 每个样本至少被分配到一个类别中
> **软标签:** 每个样本至少被分配到一个类别中。
#### 输出结果 #### 输出结果
Caffe:输出是对所有样本的loss进行归一化后的结果,同时根据`normalize``normalization`的设置,归一化形式略有不同,当`normalization`是FULL或0时整个loss取和后除以batch的大小,当`normalization`是VALID或1时整个loss取和后除以除`ignore_label`以外的样本数,为NONE时则取和;当`normalization`未设置时,采用`normalize`的值进行判断,若`normalize==1`则归一化方式是VALID,若`normalize==0`则归一化方式是FULL。 Caffe:输出是对所有样本的loss进行归一化后的结果,归一化的方式由`normalization``normalize`参数决定;
```
归一化形式:
1. 当`normalization`是FULL或0时,整个loss取和后除以batch的大小.
2. 当`normalization`是VALID或1时,整个loss取和后除以除`ignore_label`以外的样本数。
3. 当`normalization`是NONE时,则loss取和.
4. 当`normalization`未设置时,采用`normalize`的值进行判断,若`normalize==1`则归一化方式是VALID,若`normalize==0`则归一化方式是FULL。
```
PaddlePaddle:输出是每个样本的loss所组成的一个向量,同时如果将参数`return_softmax`设为True,则输出的是loss向量和softmax值组成的一个元组。 PaddlePaddle:输出是每个样本的loss所组成的一个向量,同时如果将参数`return_softmax`设为True,则输出的是loss向量和softmax值组成的一个元组。
### 代码示例 ### 代码示例
``` ```
# Caffe示例: # Caffe示例:
# pred输入shape:(100,10) # logits输入shape:(100,10)
# label输入shape:(100,1) # label输入shape:(100,1)
# 输出shape:() # 输出shape:()
layer { layer {
name: "loss" name: "loss"
type: "SoftmaxWithLoss" type: "SoftmaxWithLoss"
bottom: "pred" bottom: "logits"
bottom: "label" bottom: "label"
top: "loss" top: "loss"
loss_param{ loss_param {
ignore_label: -1 ignore_label: -1
normalize: 0 normalize: 0
normalization: FULL normalization: FULL
...@@ -70,8 +79,11 @@ layer { ...@@ -70,8 +79,11 @@ layer {
```python ```python
# PaddlePaddle示例: # PaddlePaddle示例:
# pred输入shape:(100,10) # logits输入shape:(100,10)
# label输入shape:(100,1) # label输入shape:(100,1)
# 输出shape:(10,1) # 输出shape:(10,1)
softmaxwithloss= paddle.fluid.layers.softmax_with_cross_entropy(logits = logs, label = labels, soft_label=False, ignore_index=-100, numeric_stable_mode=False, return_softmax=False) softmaxwithloss = fluid.layers.softmax_with_cross_entropy(logits=logs, label=labels,
soft_label=False, ignore_index=-100,
numeric_stable_mode=True,
return_softmax=False)
``` ```
...@@ -8,7 +8,7 @@ layer { ...@@ -8,7 +8,7 @@ layer {
type: "Tile" type: "Tile"
bottom: "data" bottom: "data"
top: "concat" top: "concat"
tile_param{ tile_param {
axis: 1 axis: 1
tiles: 2 tiles: 2
} }
...@@ -16,7 +16,7 @@ layer { ...@@ -16,7 +16,7 @@ layer {
``` ```
### [paddle.fluid.layers.concat](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-70-expand) ### [paddle.fluid.layers.concat](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#permalink-219-concat)
```python ```python
paddle.fluid.layers.concat( paddle.fluid.layers.concat(
x, x,
......
...@@ -15,13 +15,13 @@ conda create -n caffe-paddle python=3.5 ...@@ -15,13 +15,13 @@ conda create -n caffe-paddle python=3.5
# 激活环境 # 激活环境
source activate caffe-paddle source activate caffe-paddle
# 安装PaddlePaddle和caffe # 安装PaddlePaddle和Caffe
# 安装后,可在python中执行"import caffe"和 # 安装后,可在python中执行"import caffe"和
# "import paddle.fluid",判断是否已经安装成功 # "import paddle.fluid",判断是否已经安装成功
pip install paddlepaddle-gpu pip install paddlepaddle-gpu
conda install caffe-gpu conda install caffe-gpu
# 安装Python的future模块 # 安装python的future模块
pip install future pip install future
......
# Environment Installation
The caffe2fluid is tested in the following environment configuration. In order to meet the environment dependence of the caffe2fluid, users can configure their own environment according to the following process, or configure according to their own needs.
## 1. Anaconda Installation
Directly refer to the official website installation documentation.
[Install in Linux](https://docs.anaconda.com/anaconda/install/linux/)
[Install in Mac](https://docs.anaconda.com/anaconda/install/mac-os/)
## 2.Create Python Environment
Create a python environment by using anaconda. Then install Caffe and PaddlePaddle in the created python environment. The created environment can be independent of the system environment, so the modifications to the creation environment will not affect the dependencies of other environments or systems.
```shell
# Create the environment which is named as caffe_paddle,
# and the version of python is 3.5.
conda create -n caffe-paddle python=3.5
# Activate the environment.
source activate caffe-paddle
# Install the PaddlePaddle and Caffe.
# After installion,run "import caffe" and "import paddle.fluid"
# to determine if it has been installed successfully.
pip install paddlepaddle-gpu
conda install caffe-gpu
# Install the future module of python。
pip install future
# Note: Due to the protobuf version, the installation framework should first install PaddlePaddle and then install Caffe.
# If you installed Caffe first, after installing PaddlePaddle you can solve by the following steps.
pip uninstall protobuf
pip install protobuf==3.6.0
source deactivate
```
此差异已折叠。
...@@ -12,7 +12,7 @@ tf.case( ...@@ -12,7 +12,7 @@ tf.case(
) )
``` ```
### [paddle.fluid.layers.While](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#while) ### [paddle.fluid.layers.While](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#while)
```python ```python
class paddle.fluid.layers.Switch( class paddle.fluid.layers.Switch(
name=None name=None
......
## tf.clip_by_global_norm
### [tf.clip_by_global_norm](https://www.tensorflow.org/api_docs/python/tf/clip_by_global_norm)
```python
tf.clip_by_global_norm(
t_list,
clip_norm,
use_norm=None,
name=None
)
```
### [paddle.fluid.clip.GradientClipByGlobalNorm](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/clip_cn.html#gradientclipbyglobalnorm)
```python
paddle.fluid.clip.GradientClipByGlobalNorm(
clip_norm,
group_name='default_group'
)
```
### 功能差异
#### 使用方式
TensorFlow:采用函数调用形式,输入需要执行global_norm裁剪的tensor,返回裁剪后的结果;
PaddlePaddle:采用类对象定义形式,使用`set_gradient_clip`函数设置`GradientClipByGlobalNorm`对象为裁剪方式。
#### 其他
TensorFlow:使用`use_norm`支持外部设置global_norm,若没有设置则从`t_list`计算得到;
PaddlePaddle:不支持外部设置。
### 代码示例
```
# 获取待裁剪的tensor列表
p_g_clip = fluid.backward.append_backward(loss=avg_cost_clip)
with fluid.program_guard(main_program=prog_clip):
# 设置裁剪方式
fluid.clip.set_gradient_clip(
fluid.clip.GradientClipByGlobalNorm(clip_norm=2.0))
# 执行裁剪并获取结果
p_g_clip = fluid.clip.append_gradient_clip_ops(p_g_clip)
```
## tf.clip_by_norm
### [tf.clip_by_norm](https://www.tensorflow.org/api_docs/python/tf/clip_by_norm)
``` python
tf.clip_by_norm(
t,
clip_norm,
axes=None,
name=None
)
```
### [paddle.fluid.layers.clip_by_norm](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.clip_by_norm)
``` python
paddle.fluid.layers.clip_by_norm(
x,
max_norm,
name=None
)
```
### 功能差异
#### 计算方式
TensorFlow: 使用参数`axis`指定的轴计算L2范数`l2-norm`,如若`axis`为None,则表示使用整个输入数据的L2范数;
PaddlePaddle:使用整个输入数据的L2范数。
## tf.contrib.layers.flatten
### [tf.contrib.layers.flatten](https://www.tensorflow.org/api_docs/python/tf/contrib/layers/flatten)
```python
tf.contrib.layers.flatten(
inputs,
outputs_collections=None,
scope=None
)
```
### [paddle.fluid.layers.flatten](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#flatten)
```python
paddle.fluid.layers.flatten(
x,
axis=1,
name=None
)
```
### 功能差异
#### 计算方式
TensorFlow:固定第0维,将其他维合并;
PaddlePaddle:使用`axis`指定两次合并的维度边界,参考下面示例。
### 代码示例
```
# 张量x的shape为 [2, 3, 4, 5]
out = fluid.layers.flatten(x, axis=2)
out.shape # [2*3, 4*5]
```
...@@ -16,7 +16,7 @@ tf.contrib.rnn.GRUCell( ...@@ -16,7 +16,7 @@ tf.contrib.rnn.GRUCell(
``` ```
### [paddle.fluid.layers.gru_unit](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#gru-unit) ### [paddle.fluid.layers.gru_unit](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#gru-unit)
```python ```python
paddle.fluid.layers.gru_unit( paddle.fluid.layers.gru_unit(
...@@ -43,7 +43,7 @@ on Sequence Modeling](https://arxiv.org/pdf/1412.3555.pdf)。 ...@@ -43,7 +43,7 @@ on Sequence Modeling](https://arxiv.org/pdf/1412.3555.pdf)。
#### 使用方式 #### 使用方式
TensorFlow:首先定义`GRUCell`对象,定义对象时只需要指定单元数`num_units`;由于`GRUCell`内部定义了`__call__`方法,因而其对象是可调用对象,直接使用`step_output, cur_state = cell(step_input, last_state)`的形式,可以计算得到当前步的输出与状态; TensorFlow:首先定义`GRUCell`对象,定义对象时只需要指定单元数`num_units`;由于`GRUCell`内部定义了`__call__`方法,因而其对象是可调用对象,直接使用`step_output, cur_state = cell(step_input, last_state)`的形式,可以计算得到当前步的输出与状态;
PaddlePaddle:提供op形式的调用接口,通常与[paddle.fluid.layers.DynamicRNN](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#dynamicrnn)配合使用,以获取序列中的单步输入。**注意,为了提高`gru_unit`的计算效率,用户在使用该接口时需要遵从如下约定:假设要指定的GRU单元数为`num_units`,则`size`以及`input.shape[-1]`必须为`3*num_units`,`hidden.shape[-1]`为`num_units`,见如下代码示例小节。** PaddlePaddle:提供op形式的调用接口,通常与[paddle.fluid.layers.DynamicRNN](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#dynamicrnn)配合使用,以获取序列中的单步输入。**注意,为了提高`gru_unit`的计算效率,用户在使用该接口时需要遵从如下约定:假设要指定的GRU单元数为`num_units`,则`size`以及`input.shape[-1]`必须为`3*num_units`,`hidden.shape[-1]`为`num_units`,见如下代码示例小节。**
#### 返回值 #### 返回值
TensorFlow:返回一个二元组,分别是当前时刻的输出值与隐藏状态,实际上输出值与隐藏状态为相同的tensor; TensorFlow:返回一个二元组,分别是当前时刻的输出值与隐藏状态,实际上输出值与隐藏状态为相同的tensor;
......
...@@ -11,7 +11,7 @@ tf.expand_dims( ...@@ -11,7 +11,7 @@ tf.expand_dims(
) )
``` ```
### [paddle.fluid.layers.unsqueeze](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#unsqueeze) ### [paddle.fluid.layers.unsqueeze](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#unsqueeze)
``` python ``` python
paddle.fluid.layers.unsqueeze( paddle.fluid.layers.unsqueeze(
input, input,
......
...@@ -13,7 +13,7 @@ tf.image.non_max_suppression( ...@@ -13,7 +13,7 @@ tf.image.non_max_suppression(
) )
``` ```
### [paddle.fluid.layers.multiclass_nms](http://paddlepaddle.org/documentation/docs/en/1.3/api/layers.html#permalink-245-multiclass_nms) ### [paddle.fluid.layers.multiclass_nms](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.multiclass_nms)
``` python ``` python
paddle.fluid.layers.multiclass_nms( paddle.fluid.layers.multiclass_nms(
bboxes, bboxes,
...@@ -35,7 +35,7 @@ PaddlePaddle:相对比Tensorflow,还支持batch和多类别,`bboxes`的sha ...@@ -35,7 +35,7 @@ PaddlePaddle:相对比Tensorflow,还支持batch和多类别,`bboxes`的sha
#### 输出格式 #### 输出格式
TensorFlow: 返回shape为`[N]`的tensor,表示为`boxes`中选取的index集合,长度为`N` TensorFlow: 返回shape为`[N]`的tensor,表示为`boxes`中选取的index集合,长度为`N`
PaddlePaddle: 返回`[N, 6]`[LodTensor](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/fluid_cn.html#lodtensor),其中每行内容为`[lable, confidence, xmin, ymin, xmax, ymax]` PaddlePaddle: 返回`[N, 6]`[LodTensor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#lodtensor),其中每行内容为`[lable, confidence, xmin, ymin, xmax, ymax]`
#### 参数差异 #### 参数差异
TensorFlow: 在所有boxes中,根据其它参数条件,最终选出的boxes数量不超过`max_output_size` TensorFlow: 在所有boxes中,根据其它参数条件,最终选出的boxes数量不超过`max_output_size`
......
...@@ -12,7 +12,7 @@ tf.image.resize_images( ...@@ -12,7 +12,7 @@ tf.image.resize_images(
) )
``` ```
### [paddle.fluid.layers.image_resize](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#paddle.fluid.layers.image_resize) ### [paddle.fluid.layers.image_resize](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.image_resize)
``` python ``` python
paddle.fluid.layers.image_resize( paddle.fluid.layers.image_resize(
input, input,
......
...@@ -26,7 +26,7 @@ tf.layers.conv2d( ...@@ -26,7 +26,7 @@ tf.layers.conv2d(
) )
``` ```
### [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#paddle.fluid.layers.conv2d) ### [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.conv2d)
``` python ``` python
paddle.fluid.layers.conv2d( paddle.fluid.layers.conv2d(
input, input,
...@@ -75,7 +75,7 @@ PaddlePaddle:`padding`参数表示在输入图像四周padding的size大小。 ...@@ -75,7 +75,7 @@ PaddlePaddle:`padding`参数表示在输入图像四周padding的size大小。
#### 参数差异 #### 参数差异
TensorFlow:深度可分离卷积使用[tf.layers.separable_conv2d](https://www.tensorflow.org/api_docs/python/tf/layers/separable_conv2d)接口; TensorFlow:深度可分离卷积使用[tf.layers.separable_conv2d](https://www.tensorflow.org/api_docs/python/tf/layers/separable_conv2d)接口;
PaddlePaddle: 使用`paddle.fluid.layers.conv2d`,可参考 PaddlePaddle: 使用`paddle.fluid.layers.conv2d`,可参考
[PaddlePaddle对卷积的说明文档](http://paddlepaddle.org/documentation/docs/zh/1.3/api_guides/low_level/layers/conv.html), 同时也可参考[tf.nn.separable_conv2d](tf.nn.separable_conv2d.md)中的代码示例。 [PaddlePaddle对卷积的说明文档](http://paddlepaddle.org/documentation/docs/zh/1.4/api_guides/low_level/layers/conv.html), 同时也可参考[tf.nn.separable_conv2d](https://github.com/PaddlePaddle/X2Paddle/blob/master/tensorflow2fluid/doc/tf.nn.separable_conv2d.md)中的代码示例。
### 代码示例 ### 代码示例
```python ```python
......
...@@ -21,7 +21,7 @@ tf.layers.dense( ...@@ -21,7 +21,7 @@ tf.layers.dense(
) )
``` ```
### [paddle.fluid.layers.fc](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#fc) ### [paddle.fluid.layers.fc](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#fc)
``` python ``` python
paddle.fluid.layers.fc( paddle.fluid.layers.fc(
input, input,
......
## tf.losses.mean_and_squared_error
### [tf.losses.mean_and_squared_error](https://www.tensorflow.org/api_docs/python/tf/losses/mean_squared_error)
``` python
tf.losses.mean_squared_error(
labels,
predictions,
weights=1.0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
```
### [paddle.fluid.layers.square_error_cost](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.square_error_cost)
``` python
paddle.fluid.layers.square_error_cost(
input,
label
)
```
### 功能差异
#### 计算方式
TensorFlow: 提供`weights`参数,通过传入`weights`参数的shape,可实现不同的加权方式;
PaddlePaddle:不支持加权。
...@@ -14,14 +14,15 @@ tf.losses.sigmoid_cross_entropy( ...@@ -14,14 +14,15 @@ tf.losses.sigmoid_cross_entropy(
) )
``` ```
### [paddle.fluid.layers.sigmoid_cross_entropy_with_logit](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#sigmoid_cross_entropy_with_logits) ### [paddle.fluid.layers.sigmoid_cross_entropy_with_logit](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#sigmoid_cross_entropy_with_logits)
```python ```python
paddle.fluid.layers.sigmoid_cross_entropy_with_logits( paddle.fluid.layers.sigmoid_cross_entropy_with_logits(
x, x,
label, label,
name=None ignore_index=-100,
) name=None,
normalize=False)
``` ```
### 功能差异 ### 功能差异
...@@ -31,11 +32,19 @@ paddle.fluid.layers.sigmoid_cross_entropy_with_logits( ...@@ -31,11 +32,19 @@ paddle.fluid.layers.sigmoid_cross_entropy_with_logits(
Tensorflow:通过控制`reduction`参数,返回结果可以是rank为0的tensor,也可以是shape与`logits`相同的tensor; Tensorflow:通过控制`reduction`参数,返回结果可以是rank为0的tensor,也可以是shape与`logits`相同的tensor;
PaddlePaddle:固定返回shape与`x`相同的tensor,表示每个样本在每个标签上的损失。 PaddlePaddle:固定返回shape与`x`相同的tensor,表示每个样本在每个标签上的损失。
#### 其他 #### 调权与平滑
Tensorflow:通过`weights`,可以设置不同样本、不同label的权重;通过`label_smoothing`,可以控制对label进行平滑; Tensorflow:通过`weights`,可以设置不同样本、不同label的权重;通过`label_smoothing`,可以控制对label进行平滑;
PaddlePaddle:不支持调权与平滑功能。 PaddlePaddle:不支持调权与平滑功能。
#### 忽略标签
Tensorflow:不支持;
PaddlePaddle:通过设置`ignore_index`可以指定被忽略的标签,不影响梯度。
#### 归一化
Tensorflow:不支持;
PaddlePaddle:通过设置`normalize`,各样本损失函数会除以除去`ignore_index`外的样本数。
### 代码示例 ### 代码示例
``` ```
# x与label均是shape为[3,5]的tensor,表示三个样本,每个样本有5个类别 # x与label均是shape为[3,5]的tensor,表示三个样本,每个样本有5个类别
......
## tf.math.is_finite ## tf.math.is_finite
### [tf.math.is_finite](https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/math/is_finite) ### [tf.math.is_finite](https://www.tensorflow.org/api_docs/python/tf/math/is_finite)
``` python ``` python
tf.math.is_finite( tf.math.is_finite(
x, x,
...@@ -9,7 +9,7 @@ tf.math.is_finite( ...@@ -9,7 +9,7 @@ tf.math.is_finite(
) )
``` ```
### [paddle.fluid.layers.isfinite](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#paddle.fluid.layers.isfinite) ### [paddle.fluid.layers.isfinite](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.isfinite)
``` python ``` python
paddle.fluid.layers.isfinite(x) paddle.fluid.layers.isfinite(x)
``` ```
......
...@@ -16,7 +16,7 @@ tf.matmul( ...@@ -16,7 +16,7 @@ tf.matmul(
) )
``` ```
### [paddle.fluid.layers.matmul](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#matmul) ### [paddle.fluid.layers.matmul](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#matmul)
``` python ``` python
paddle.fluid.layers.matmul( paddle.fluid.layers.matmul(
x, x,
......
...@@ -14,29 +14,30 @@ tf.nn.avg_pool( ...@@ -14,29 +14,30 @@ tf.nn.avg_pool(
``` ```
### [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/en/1.3/api/layers.html#permalink-116-pool2d) ### [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.pool2d)
``` python ``` python
paddle.fluid.layers.pool2d( paddle.fluid.layers.pool2d(
input, input,
pool_size=-1, pool_size=-1,
pool_type='max', pool_type='max',
pool_stride=1, pool_stride=1,
pool_padding=0, pool_padding=0,
global_pooling=False, global_pooling=False,
use_cudnn=True, use_cudnn=True,
ceil_mode=False, ceil_mode=False,
name=None, name=None,
exclusive=True) exclusive=True)
``` ```
### 功能差异 ### 功能差异
#### 输入格式 #### 输入格式
TensorFlow: 默认为`NHWC`的数据输入格式,同时也可通过修改`data_format`参数,支持`NCHW`的输入; TensorFlow: 默认为`NHWC`的数据输入格式,同时也可通过修改`data_format`参数,支持`NCHW`的输入;
PaddlePaddle:只支持`NCHW`的数据输入格式。 PaddlePaddle:只支持`NCHW`的数据输入格式。
#### Padding机制 #### Padding机制
Tensorflow: 存在`SAME``VALID`两种padding方式。当为`SAME`时,padding的size计算方式如下伪代码所示,需要注意的是,当计算得到的`pad_size`为奇数时,右侧与下方相对比左侧和上方会多1个size; Tensorflow: 存在`SAME``VALID`两种padding方式。当为`SAME`时,padding的size计算方式如下伪代码所示,需要注意的是,当计算得到的`pad_size`为奇
数时,右侧与下方相对比左侧和上方会多1个size;
``` python ``` python
# 计算在width上的padding size # 计算在width上的padding size
# height上的padding计算方式同理 # height上的padding计算方式同理
......
...@@ -15,7 +15,7 @@ tf.nn.conv2d( ...@@ -15,7 +15,7 @@ tf.nn.conv2d(
) )
``` ```
### [paddle.fluid.layers.conv2d](http://www.paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#paddle.fluid.layers.conv2d) ### [paddle.fluid.layers.conv2d](http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.conv2d)
```python ```python
paddle.fluid.layers.conv2d( paddle.fluid.layers.conv2d(
...@@ -37,7 +37,7 @@ paddle.fluid.layers.conv2d( ...@@ -37,7 +37,7 @@ paddle.fluid.layers.conv2d(
### 功能差异 ### 功能差异
`tf.nn.conv2d`中的参数`filter`为具体的tensor,而`paddle.fluid.layers.conv2d`参数中则声明卷积核的`size`,函数内部创建卷积核tensor。也可通过如下代码示例,自行创建并复用卷积核 `tf.nn.conv2d`中的参数`filter`为具体的tensor,而`paddle.fluid.layers.conv2d`参数中则声明卷积核的`size`,函数内部创建卷积核tensor。也可通过如下代码示例,自行创建并复用卷积核
需要注意的是PaddlePaddle中的输入、输出以及卷积核的格式与tensorflow存在部分差异,可参考[tf.layers.conv2d](tf.layers.conv2d.md) 需要注意的是PaddlePaddle中的输入、输出以及卷积核的格式与tensorflow存在部分差异,可参考[tf.layers.conv2d](https://github.com/PaddlePaddle/X2Paddle/blob/master/tensorflow2fluid/doc/tf.layers.conv2d.md)
### 代码示例 ### 代码示例
```python ```python
......
...@@ -14,7 +14,7 @@ tf.nn.conv2d_transpose( ...@@ -14,7 +14,7 @@ tf.nn.conv2d_transpose(
) )
``` ```
### [paddle.fluid.layers.conv2d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#paddle.fluid.layers.conv2d_transpose) ### [paddle.fluid.layers.conv2d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.conv2d_transpose)
``` python ``` python
paddle.fluid.layers.conv2d_transpose( paddle.fluid.layers.conv2d_transpose(
input, input,
......
...@@ -14,7 +14,7 @@ tf.nn.conv3d_transpose( ...@@ -14,7 +14,7 @@ tf.nn.conv3d_transpose(
) )
``` ```
### [paddle.fluid.layers.conv3d_transpose](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#permalink-48-conv3d_transpose) ### [paddle.fluid.layers.conv3d_transpose](http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.conv3d_transpose)
``` python ``` python
paddle.fluid.layers.conv3d_transpose( paddle.fluid.layers.conv3d_transpose(
input, input,
......
...@@ -14,7 +14,7 @@ tf.nn.depthwise_conv2d( ...@@ -14,7 +14,7 @@ tf.nn.depthwise_conv2d(
) )
``` ```
### [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#paddle.fluid.layers.conv2d) ### [paddle.fluid.layers.conv2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.conv2d)
```python ```python
paddle.fluid.layers.conv2d( paddle.fluid.layers.conv2d(
...@@ -65,7 +65,7 @@ PaddlePaddle:`padding`参数表示在输入图像四周padding的size大小 ...@@ -65,7 +65,7 @@ PaddlePaddle:`padding`参数表示在输入图像四周padding的size大小
#### 参数差异 #### 参数差异
Tensorflow:普通2维卷积使用`tf.layers.conv2d` Tensorflow:普通2维卷积使用`tf.layers.conv2d`
PaddlePaddle:仍使用本接口,可参考在文档[tf.layers.conv2d](https://github.com/PaddlePaddle/X2Paddle/blob/doc/tensorflow2fluid/doc/tf.layers.conv2d.md) PaddlePaddle:仍使用本接口,可参考在文档[tf.layers.conv2d](https://github.com/PaddlePaddle/X2Paddle/blob/master/tensorflow2fluid/doc/tf.layers.conv2d.md)
### 代码示例 ### 代码示例
......
...@@ -13,7 +13,7 @@ tf.nn.dropout( ...@@ -13,7 +13,7 @@ tf.nn.dropout(
) )
``` ```
### [paddle.fluid.layers.dropout](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#cn-api-fluid-layers-dropout) ### [paddle.fluid.layers.dropout](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#cn-api-fluid-layers-dropout)
``` python ``` python
paddle.fluid.layers.dropout( paddle.fluid.layers.dropout(
x, x,
...@@ -36,7 +36,7 @@ PaddlePaddle:暂无此设置。 ...@@ -36,7 +36,7 @@ PaddlePaddle:暂无此设置。
#### 实现方式 #### 实现方式
TensorFlow:在训练时,被保留的单元输出要乘上`1/keep_prob`的系数,而在测试时,直接关闭dropout。 TensorFlow:在训练时,被保留的单元输出要乘上`1/keep_prob`的系数,而在测试时,直接关闭dropout。
PaddlePaddle:通过设置`dropout_implementation`有不同的实现。当设置为`downgrade_in_infer`时,在训练时,保留单元直接被输出,而测试时所有单元乘以`1-dropout_prob`的系数;当设置为`upgrade_in_train`时,则与tensorflow的实现一致。 PaddlePaddle:通过设置`dropout_implementation`有不同的实现。当设置为`downgrade_in_infer`时,在训练时,保留单元直接被输出,而测试时所有单元乘以`1-dropout_prob`的系数;当设置为`upscale_in_train`时,则与tensorflow的实现一致。
### 代码示例 ### 代码示例
```python ```python
......
...@@ -15,7 +15,7 @@ tf.nn.dynamic_rnn( ...@@ -15,7 +15,7 @@ tf.nn.dynamic_rnn(
) )
``` ```
### [paddle.fluid.layers.DynamicRNN](http://www.paddlepaddle.org/documentation/docs/zh/1.2/api_cn/api_guides/low_level/layers/control_flow.html#dynamicrnn) ### [paddle.fluid.layers.DynamicRNN](http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_cn/api_guides/low_level/layers/control_flow.html#dynamicrnn)
``` python ``` python
paddle.fluid.layers.DynamicRNN(name=None) paddle.fluid.layers.DynamicRNN(name=None)
``` ```
...@@ -28,7 +28,7 @@ PaddlePaddle: 使用`paddle.fluid.layers.DynamicRNN`类实现类似功能 ,通 ...@@ -28,7 +28,7 @@ PaddlePaddle: 使用`paddle.fluid.layers.DynamicRNN`类实现类似功能 ,通
#### 输入格式 #### 输入格式
TensorFlow: `tf.nn.dynamic_rnn`输入为序列数据,批输入中的每个序列需要填充到相同的长度 TensorFlow: `tf.nn.dynamic_rnn`输入为序列数据,批输入中的每个序列需要填充到相同的长度
PaddlePaddle: 使用 PaddlePaddle: 使用
[LoDTensor](http://www.paddlepaddle.org/documentation/docs/zh/1.2/user_guides/howto/basic_concept/lod_tensor.html)表示一个批输入,用户在使用时不需要进行填充操作。 [LoDTensor](http://www.paddlepaddle.org/documentation/docs/zh/1.4/user_guides/howto/basic_concept/lod_tensor.html)表示一个批输入,用户在使用时不需要进行填充操作。
### 代码示例 ### 代码示例
...@@ -74,5 +74,5 @@ state = fluid.layers.sequence_last_step(outputs) ...@@ -74,5 +74,5 @@ state = fluid.layers.sequence_last_step(outputs)
### 其他 ### 其他
为了简化用户定义动态RNN的过程,paddle有如下op可供选择: 为了简化用户定义动态RNN的过程,paddle有如下op可供选择:
- [paddle.fluid.layers.dynamic_lstm](http://www.paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#dynamic-lstm):相当于 `tf.nn.dynamic_rnn`结合`tf.nn.rnn_cell.LSTMCell` - [paddle.fluid.layers.dynamic_lstm](http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#dynamic-lstm):相当于 `tf.nn.dynamic_rnn`结合`tf.nn.rnn_cell.LSTMCell`
- [paddle.fluid.layers.dynamic_gru](http://www.paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#dynamic-gru):相当于`tf.nn.dynamic_rnn`结合`tf.nn.rnn_cell.GRUCell` - [paddle.fluid.layers.dynamic_gru](http://www.paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#dynamic-gru):相当于`tf.nn.dynamic_rnn`结合`tf.nn.rnn_cell.GRUCell`
...@@ -13,7 +13,7 @@ tf.math.l2_normalize( ...@@ -13,7 +13,7 @@ tf.math.l2_normalize(
) )
``` ```
### [paddle.fluid.layers.l2_normalize](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#l2-normalize) ### [paddle.fluid.layers.l2_normalize](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#l2-normalize)
```python ```python
paddle.fluid.layers.l2_normalize( paddle.fluid.layers.l2_normalize(
......
## tf.nn.lrn
### [tf.nn.lrn](https://www.tensorflow.org/api_docs/python/tf/nn/local_response_normalization)
```python
tf.nn.local_response_normalization(
input,
depth_radius=5,
bias=1,
alpha=1,
beta=0.5,
name=None
)
```
### [paddle.fluid.layers.lrn](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.lrn)
```python
paddle.fluid.layers.lrn(
input,
n=5,
k=1.0,
alpha=0.0001,
beta=0.75,
name=None
)
```
### 功能差异
#### 计算方式
TensorFlow:计算公式如下所示,公式中的$n$即为参数`depth_radius`
$$output(i,x,y)=input(i,x,y)/(k+\alpha\sum_{j=max(0,i-n)}^{min(C,i+n+1)}{input(j,x,y)^2})^\beta$$
PaddlePaddle:计算公式如下所示,
$$output(i,x,y)=input(i,x,y)/(k+\alpha\sum_{j=max(0,i-\frac{n}{2})}^{min(C,i+\frac{n}{2})}{input(j,x,y)^2})^\beta$$
#### 输入格式
TensorFlow: 默认输入`NHWC`格式数据;
PaddlePaddle: 默认输入`NCHW`格式数据,
...@@ -14,7 +14,7 @@ tf.nn.max_pool( ...@@ -14,7 +14,7 @@ tf.nn.max_pool(
``` ```
### [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/en/1.3/api/layers.html#permalink-116-pool2d) ### [paddle.fluid.layers.pool2d](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.pool2d)
``` python ``` python
paddle.fluid.layers.pool2d( paddle.fluid.layers.pool2d(
input, input,
......
...@@ -22,7 +22,7 @@ tf.nn.rnn_cell.LSTMCell( ...@@ -22,7 +22,7 @@ tf.nn.rnn_cell.LSTMCell(
) )
``` ```
### [paddle.fluid.layers.lstm_unit](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#lstm-unit) ### [paddle.fluid.layers.lstm_unit](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#lstm-unit)
```python ```python
paddle.fluid.layers.lstm_unit( paddle.fluid.layers.lstm_unit(
...@@ -41,7 +41,7 @@ paddle.fluid.layers.lstm_unit( ...@@ -41,7 +41,7 @@ paddle.fluid.layers.lstm_unit(
#### 使用方式 #### 使用方式
TensorFlow:首先定义`LSTMCell`对象,定义对象时只需要指定单元数`num_units`;由于`LSTMCell`内部定义了`__call__`方法,因而其对象是可调用对象,直接使用`step_output, cur_state = cell(step_input, last_state)`的形式,可以计算得到当前步的输出与状态; TensorFlow:首先定义`LSTMCell`对象,定义对象时只需要指定单元数`num_units`;由于`LSTMCell`内部定义了`__call__`方法,因而其对象是可调用对象,直接使用`step_output, cur_state = cell(step_input, last_state)`的形式,可以计算得到当前步的输出与状态;
PaddlePaddle:提供op形式的调用接口,通常与[paddle.fluid.layers.DynamicRNN](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#dynamicrnn)配合使用,以获取序列中的单步输入。**注意,`lstm_unit`通过`cell_t_prev`最后一个维度来确定lstm的单元数,同时要求`hidden_t_prev`与`cell_t_prev`最后的维度相同。** PaddlePaddle:提供op形式的调用接口,通常与[paddle.fluid.layers.DynamicRNN](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#dynamicrnn)配合使用,以获取序列中的单步输入。**注意,`lstm_unit`通过`cell_t_prev`最后一个维度来确定lstm的单元数,同时要求`hidden_t_prev`与`cell_t_prev`最后的维度相同。**
#### 窥孔连接 #### 窥孔连接
......
...@@ -16,7 +16,7 @@ tf.nn.separable_conv2d( ...@@ -16,7 +16,7 @@ tf.nn.separable_conv2d(
### PaddlePaddle实现 ### PaddlePaddle实现
PaddlePaddle中目前无对应接口,可使用如下代码实现,在如下代码中只考虑了基本的`strides`参数,其它参数如`padding`在PaddlePaddle中使用机制 PaddlePaddle中目前无对应接口,可使用如下代码实现,在如下代码中只考虑了基本的`strides`参数,其它参数如`padding`在PaddlePaddle中使用机制
以及输入输出和卷积核格式与TensorFlow存在差异,可参考文档[tf.layers.conv2d](tf.layers.conv2d.md)[tf.nn.depthwise_conv2d](tf.nn.depthwise_conv2d.md)中的说明。 以及输入输出和卷积核格式与TensorFlow存在差异,可参考文档[tf.layers.conv2d](https://github.com/PaddlePaddle/X2Paddle/blob/master/tensorflow2fluid/doc/tf.layers.conv2d.md)[tf.nn.depthwise_conv2d](https://github.com/PaddlePaddle/X2Paddle/blob/master/tensorflow2fluid/doc/tf.nn.depthwise_conv2d.md)中的说明。
``` python ``` python
# TensorFlow中separable_conv2d的使用 # TensorFlow中separable_conv2d的使用
depthwise_filter = tf.random_uniform([4, 4, 3, 1], 0.0, 1.0) depthwise_filter = tf.random_uniform([4, 4, 3, 1], 0.0, 1.0)
......
...@@ -12,7 +12,7 @@ tf.nn.softmax_cross_entropy_with_logits( ...@@ -12,7 +12,7 @@ tf.nn.softmax_cross_entropy_with_logits(
) )
``` ```
### [paddle.fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#softmax-with-cross-entropy) ### [paddle.fluid.layers.softmax_with_cross_entropy](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#softmax-with-cross-entropy)
```python ```python
paddle.fluid.layers.softmax_with_cross_entropy( paddle.fluid.layers.softmax_with_cross_entropy(
logits, logits,
......
...@@ -11,7 +11,7 @@ tf.math.top_k( ...@@ -11,7 +11,7 @@ tf.math.top_k(
) )
``` ```
### [paddle.fluid.layers.topk](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#topk) ### [paddle.fluid.layers.topk](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#topk)
``` python ``` python
paddle.fluid.layers.topk( paddle.fluid.layers.topk(
input, input,
...@@ -23,7 +23,7 @@ paddle.fluid.layers.topk( ...@@ -23,7 +23,7 @@ paddle.fluid.layers.topk(
### 功能差异 ### 功能差异
#### 参数差异 #### 参数差异
TensorFlow: 通过设置`sorted`参数,对返回的值与下标设置是否进行降序排序;`k`默认为1。 TensorFlow: 通过设置`sorted`参数,对返回的值与下标设置是否进行降序排序;`k`默认为1。
PaddlePaddle: 对返回的`top-k` tensor进行降序排序;`k`没有默认值,必须设置。 PaddlePaddle: 对返回的top-k tensor进行降序排序;`k`没有默认值,必须设置。
### 代码示例 ### 代码示例
```python ```python
......
...@@ -14,7 +14,7 @@ tf.one_hot( ...@@ -14,7 +14,7 @@ tf.one_hot(
) )
``` ```
### [paddle.fluid.layers.one_hot](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#one-hot) ### [paddle.fluid.layers.one_hot](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#one-hot)
``` python ``` python
layers.one_hot(; layers.one_hot(;
input, input,
......
...@@ -12,7 +12,7 @@ tf.pad( ...@@ -12,7 +12,7 @@ tf.pad(
) )
``` ```
### [paddle.fluid.layers.pad](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#cn-api-fluid-layers-pad) ### [paddle.fluid.layers.pad](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#cn-api-fluid-layers-pad)
``` python ``` python
paddle.fluid.layers.pad( paddle.fluid.layers.pad(
x, x,
......
...@@ -10,7 +10,7 @@ tf.placeholder( ...@@ -10,7 +10,7 @@ tf.placeholder(
) )
``` ```
### [paddle.fluid.layers.data](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#cn-api-fluid-layers-data) ### [paddle.fluid.layers.data](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#cn-api-fluid-layers-data)
``` python ``` python
paddle.fluid.layers.data( paddle.fluid.layers.data(
name, name,
......
## tf.pow
### [tf.pow](https://www.tensorflow.org/api_docs/python/tf/math/pow)
```python
tf.math.pow(
x,
y,
name=None
)
```
### [paddle.fluid.layers.pow](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#pow)
```python
paddle.fluid.layers.pow(
x,
factor=1.0,
name=None
)
```
### 功能差异
#### 参数类型
TensorFlow:`x``y`为shape相同的tensor,执行element-wise求幂操作;
PaddlePaddle:`x`为tensor,`factor`为浮点数,返回值为`x`每个元素执行按照`factor`执行求幂操作得到的tensor。
### 代码示例
```
# x为张量 [2, 3]
out = fluid.layers.pow(x, 2.0) # [4,9]
```
...@@ -9,7 +9,7 @@ tf.print( ...@@ -9,7 +9,7 @@ tf.print(
) )
``` ```
### [paddle.fluid.layers.Print](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#print) ### [paddle.fluid.layers.Print](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#print)
```python ```python
paddle.fluid.layers.Print( paddle.fluid.layers.Print(
input, input,
......
...@@ -10,7 +10,7 @@ tf.reshape( ...@@ -10,7 +10,7 @@ tf.reshape(
) )
``` ```
### [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#cn-api-fluid-layers-reshape) ### [paddle.fluid.layers.reshape](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#cn-api-fluid-layers-reshape)
``` python ``` python
paddle.fluid.layers.reshape( paddle.fluid.layers.reshape(
x, x,
......
...@@ -14,7 +14,7 @@ tf.reverse_sequence( ...@@ -14,7 +14,7 @@ tf.reverse_sequence(
) )
``` ```
### [paddle.fluid.layers.sequence_reverse](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#sequence_reverse) ### [paddle.fluid.layers.sequence_reverse](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#paddle.fluid.layers.sequence_reverse)
```python ```python
paddle.fluid.layers.sequence_reverse( paddle.fluid.layers.sequence_reverse(
...@@ -28,7 +28,7 @@ paddle.fluid.layers.sequence_reverse( ...@@ -28,7 +28,7 @@ paddle.fluid.layers.sequence_reverse(
#### 输入格式 #### 输入格式
Tensorflow:`reverse_sequence`中,`input`是一个带padding的tensor,每个序列都会被填充到相同长度; Tensorflow:`reverse_sequence`中,`input`是一个带padding的tensor,每个序列都会被填充到相同长度;
PaddlePaddle:`sequence_reverse`中,`x`是一个[LoDTensor](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/fluid_cn.html#lodtensor) PaddlePaddle:`sequence_reverse`中,`x`是一个[LoDTensor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#lodtensor)
不需要进行填充; 不需要进行填充;
#### 参数类型 #### 参数类型
......
...@@ -12,7 +12,7 @@ tf.scatter_update( ...@@ -12,7 +12,7 @@ tf.scatter_update(
) )
``` ```
### [paddle.fluid.layers.scatter](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#scatter) ### [paddle.fluid.layers.scatter](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#scatter)
```python ```python
paddle.fluid.layers.scatter( paddle.fluid.layers.scatter(
......
...@@ -11,7 +11,7 @@ tf.slice( ...@@ -11,7 +11,7 @@ tf.slice(
) )
``` ```
### [paddle.fluid.layers.slice](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#cn-api-fluid-layers-slice) ### [paddle.fluid.layers.slice](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#cn-api-fluid-layers-slice)
``` python ``` python
paddle.fluid.layers.slice( paddle.fluid.layers.slice(
input, input,
......
...@@ -12,7 +12,7 @@ tf.split( ...@@ -12,7 +12,7 @@ tf.split(
) )
``` ```
### [paddle.fluid.layers.split](http://paddlepaddle.org/documentation/docs/zh/1.2/api_cn/layers_cn.html#split) ### [paddle.fluid.layers.split](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#split)
```python ```python
paddle.fluid.layers.split( paddle.fluid.layers.split(
......
...@@ -17,7 +17,7 @@ tf.while_loop( ...@@ -17,7 +17,7 @@ tf.while_loop(
) )
``` ```
### [paddle.fluid.layers.While](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#while) ### [paddle.fluid.layers.While](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/layers_cn.html#while)
```python ```python
paddle.fluid.layers.While( paddle.fluid.layers.While(
cond, cond,
......
...@@ -102,8 +102,8 @@ class TensorflowGraph(Graph): ...@@ -102,8 +102,8 @@ class TensorflowGraph(Graph):
self.node_map[layer.name]) self.node_map[layer.name])
self._make_connection(pred_node, self.node_map[pred]) self._make_connection(pred_node, self.node_map[pred])
else: else:
raise Exception("Unsupported situation(name:[{}], \ raise Exception("\nUnsupported situation(name:[{}]," \
OP[{}])".format(node.layer_name, node.layer_type)) "OP[{}])".format(layer.name, layer.op))
elif pred in self.node_map: elif pred in self.node_map:
self._make_connection(self.node_map[pred], self._make_connection(self.node_map[pred],
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册