From b915fde92a8a56f4011691411008f7795110769f Mon Sep 17 00:00:00 2001 From: ying Date: Tue, 19 Dec 2017 21:14:36 +0800 Subject: [PATCH] use html table. --- doc/howto/usage/capi/a_simple_example.md | 10 +- .../usage/capi/organization_of_the_inputs.md | 195 +++++++++++------- 2 files changed, 125 insertions(+), 80 deletions(-) diff --git a/doc/howto/usage/capi/a_simple_example.md b/doc/howto/usage/capi/a_simple_example.md index d9f0a1d128..b1eceea38b 100644 --- a/doc/howto/usage/capi/a_simple_example.md +++ b/doc/howto/usage/capi/a_simple_example.md @@ -143,8 +143,8 @@ CHECK(paddle_arguments_resize(in_args, 1)); // agument to store the testing samples. paddle_matrix mat = paddle_matrix_create(/* height = batch size */ 1, - /* width = dimensionality of the data layer */ 784, - /* whether to use GPU */ false); + /* width = dimensionality of the data layer */ 784, + /* whether to use GPU */ false); paddle_real* array; // Get the pointer pointing to the start address of the first row of the @@ -172,9 +172,9 @@ paddle_arguments out_args = paddle_arguments_create_none(); // Invoke the forward computation. CHECK(paddle_gradient_machine_forward(machine, - in_args, - out_args, - /* is train taks or not */ false)); + in_args, + out_args, + s/* is train taks or not */ false)); // Create the matrix to hold the forward result of the neural network. paddle_matrix prob = paddle_matrix_create_none(); diff --git a/doc/howto/usage/capi/organization_of_the_inputs.md b/doc/howto/usage/capi/organization_of_the_inputs.md index 1e573618a6..7563e236da 100644 --- a/doc/howto/usage/capi/organization_of_the_inputs.md +++ b/doc/howto/usage/capi/organization_of_the_inputs.md @@ -9,13 +9,13 @@ - 稠密矩阵 - 稀疏矩阵 - - 说明: - 1. 一维数组**仅支持整型值**; - - 常用于自然语言处理任务,例如:表示词语在词典中的序号; - - 分类任务中类别标签; - 1. 逻辑上高于二维的数据(例如含有多个通道的图片,视频等)在程序实现中都会转化为二维矩阵,转化方法在相应的领域都有通用解决方案,需要使用者自己了解并完成转化; - 1. 二维矩阵可以表示行向量和列向量,任何时候如果需要浮点型数组(向量),都应使用C-API中的矩阵来表示,而不是C-API中的一维数组。 - 1. 不论是一维整型数组还是二维浮点数矩阵,**为它们附加上序列信息将变成序列输入。PaddlePaddle 会通过判数据是否附带有序列信息来判断一个向量/矩阵是否是一个序列**。当非序列输入时,无需关心和处理序列信息。关于什么是“序列信息”,下文会详细进行介绍。 +说明: +1. 一维数组**仅支持整型值**; + - 常用于自然语言处理任务,例如:表示词语在词典中的序号; + - 分类任务中类别标签; +1. 逻辑上高于二维的数据(例如含有多个通道的图片,视频等)在程序实现中都会转化为二维矩阵,转化方法在相应的领域都有通用解决方案,需要使用者自己了解并完成转化; +1. 二维矩阵可以表示行向量和列向量,任何时候如果需要浮点型数组(向量),都应使用C-API中的矩阵来表示,而不是C-API中的一维数组。 +1. 不论是一维整型数组还是二维浮点数矩阵,**为它们附加上序列信息将变成序列输入。PaddlePaddle 会通过判数据是否附带有序列信息来判断一个向量/矩阵是否是一个序列**。当非序列输入时,无需关心和处理序列信息。关于什么是“序列信息”,下文会详细进行介绍。 ### 基本使用概念 @@ -32,7 +32,7 @@ - 一维整型数组 概念上可以将`paddle_ivector`理解为一个一维的整型数组,通常用于表示离散的类别标签,或是在自然语言处理任务中表示词语在字典中的序号。下面的代码片段创建了含有三个元素`1`、`2`、`3`的`paddle_ivector`。 - ```cpp + ```c int ids[] = {1, 2, 3}; paddle_ivector ids_array = paddle_ivector_create(ids, sizeof(ids) / sizeof(int), false, false); @@ -40,14 +40,14 @@ ``` - **稠密矩阵** - - 一个$m×n$的稠密矩阵是一个由$m$行$n$列元素排列成的矩形阵列,矩阵里的元素是浮点数。对神经网络来说,矩阵的高度$m$是一次预测接受的样本数目,宽度$n$是神经网络定义时,`paddle.layer.data`的`size`。 + - 一个`m×n`的稠密矩阵是一个由`m`行`n`列元素排列成的矩形阵列,矩阵里的元素是浮点数。对神经网络来说,矩阵的高度`m`是一次预测接受的样本数目,宽度$n$是神经网络定义时,`paddle.layer.data`的`size`。 - 下面的代码片段创建了一个高度为1,宽度为`layer_size`的稠密矩阵,矩阵中每个元素的值随机生成。 - ```cpp - paddle_matrix mat = - paddle_matrix_create(/* height = batch size */ 1, - /* width = dimensionality of the data layer */ layer_size, - /* whether to use GPU */ false); + ```c + paddle_matrix mat = paddle_matrix_create( + /* height = batch size */ 1, + /* width = dimensionality of the data layer */ layer_size, + /* whether to use GPU */ false); paddle_real* array; // Get the pointer pointing to the start address of the first row of the @@ -67,56 +67,55 @@ - **稀疏矩阵** PaddlePaddle C-API 中 稀疏矩阵使用[CSR(Compressed Sparse Row Format)](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format))格式存储。下图是CSR存储稀疏矩阵的示意图。 -

-
图1. CSR存储示意图. +
图1. 稀疏矩阵存储示意图

CSR存储格式通过:(1)非零元素的值(上图中的`values`);(2)行偏移(上图中的`row offsets`):每一行元素在`values`中的起始偏移,`row offsets`中元素个数总是等于行数 + 1;(3)非零元素的列号(上图中的`column indices`)来确定稀疏矩阵的内容。 在PaddlePaddle C-API中,通过调用以下接口创建稀疏矩阵: - ```cpp + + ```c PD_API paddle_matrix paddle_matrix_create_sparse( - uint64_t height, uint64_t width, uint64_t nnz, bool isBinary, bool useGpu); + uint64_t height, uint64_t width, uint64_t nnz, bool isBinary, bool useGpu); ``` 1. 创建稀疏矩阵时需要显示地指定矩阵的(1)高度(`height`,在神经网络中等于一次预测处理的样本数)(2)宽度(`width`,`paddle.layer.data`的`size`)以及(3)非零元个数(`nnz`)。 1. 当上述接口第4个参数`isBinary`指定为`true`时,**只需要设置行偏移(`row_offset`)和列号(`colum indices`),不需要提供元素值(`values`)**,这时行偏移和列号指定的元素默认其值为1。 - - 下面的代码片段创建了一个CPU上的二值稀疏矩阵: - - ```cpp - paddle_matrix mat = paddle_matrix_create_sparse(1, layer_size, nnz, true, false); - int colIndices[] = {9, 93, 109}; // layer_size here is greater than 109. - int rowOffset[] = {0, sizeof(colIndices) / sizeof(int)}; - - CHECK(paddle_matrix_sparse_copy_from(mat, - rowOffset, - sizeof(rowOffset) / sizeof(int), - colIndices, - sizeof(colIndices) / sizeof(int), - NULL /*values array is NULL.*/, - 0 /*size of the value arrary is 0.*/)); - CHECK(paddle_arguments_set_value(in_args, 0, mat)); - ``` - - 下面的代码片段在创建了一个CPU上的带元素值的稀疏矩阵: - ```cpp - paddle_matrix mat = paddle_matrix_create_sparse(1, layer_size, nnz, false, false); - int colIndices[] = {9, 93, 109}; // layer_size here is greater than 109. - int rowOffset[] = {0, sizeof(colIndices) / sizeof(int)}; - float values[] = {0.5, 0.5, 0.5}; - - CHECK(paddle_matrix_sparse_copy_from(mat, - rowOffset, - sizeof(rowOffset) / sizeof(int), - colIndices, - sizeof(colIndices) / sizeof(int), - values, - sizeof(values) / sizeof(float))); - ``` - -- 注意事项: - 1. 移动端预测**不支持**稀疏矩阵及相关的接口。 + 下面的代码片段创建了一个CPU上的二值稀疏矩阵: + + ```c + paddle_matrix mat = paddle_matrix_create_sparse(1, layer_size, nnz, true, false); + int colIndices[] = {9, 93, 109}; // layer_size here is greater than 109. + int rowOffset[] = {0, sizeof(colIndices) / sizeof(int)}; + + CHECK(paddle_matrix_sparse_copy_from(mat, + rowOffset, + sizeof(rowOffset) / sizeof(int), + colIndices, + (colIndices) / sizeof(int), + NULL /*values array is NULL.*/, + 0 /*size of the value arrary is 0.*/)); + CHECK(paddle_arguments_set_value(in_args, 0, mat)); + ``` + 下面的代码片段在创建了一个CPU上的带元素值的稀疏矩阵: + ```c + paddle_matrix mat = paddle_matrix_create_sparse(1, layer_size, nnz, false, false); + int colIndices[] = {9, 93, 109}; // layer_size here is greater than 109. + int rowOffset[] = {0, sizeof(colIndices) / sizeof(int)}; + float values[] = {0.5, 0.5, 0.5}; + + CHECK(paddle_matrix_sparse_copy_from(mat, + rowOffset, + sizeof(rowOffset) / sizeof(int), + colIndices, + sizeof(colIndices) / sizeof(int), + values, + sizeof(values) / sizeof(float))); + ``` + 注意事项: + 1. 移动端预测**不支持**稀疏矩阵及相关的接口。 ### 组织序列信息 @@ -143,7 +142,7 @@ 图2 是PaddlePaddle中单层序列和双层序列存储示意图。

-
图2. 序列输入示意图. +
图2. 序列输入示意图

- 单层序列 @@ -153,7 +152,7 @@ 2. 这时的`sequence_start_positions`为:`[0, 5, 8, 10, 14]`; 3. 不论数据域是`paddle_ivector`类型还是`paddle_matrix`类型,都可以通过调用下面的接口为原有的数据输入附加上序列信息,使之变为一个单层序列输入,代码片段如下: - ```cpp + ```c int seq_pos_array[] = {0, 5, 8, 10, 14}; paddle_ivector seq_pos = paddle_ivector_create( seq_pos_array, sizeof(seq_pos_array) / sizeof(int), false, false); @@ -166,11 +165,10 @@ 图2 (b) 展示了一个含有4个序列的`batch`输入; 1. 4个序列的长度分别为:5、3、2、4;这四个序列又分别含有3、2、1、2个子序列; 1. 这时的需要同时提供: - - 1. 外层序列在`batch`中的起始偏移`:[0, 5, 8, 10, 14]`; - - 2. 内层序列在`batch`中的起始偏移:`[0, 2, 3, 5, 7, 8, 10, 13, 14]`; - + - 外层序列在`batch`中的起始偏移`:[0, 5, 8, 10, 14]`; + - 内层序列在`batch`中的起始偏移:`[0, 2, 3, 5, 7, 8, 10, 13, 14]`; 1. 不论数据域是`paddle_ivector`类型还是`paddle_matrix`类型,这时需要调用创建序列信息和为`argument`设置序列信息的接口**两次**,分别为数据输入添加外层序列和内层序列的序列信息,使之变为一个双层序列输入,代码片段如下: - ```cpp + ```c // set the sequence start positions for the outter sequences. int outter_seq_pos_array[] = {0, 5, 8, 10, 14}; paddle_ivector seq_pos = @@ -193,28 +191,75 @@ CHECK(paddle_arguments_set_sequence_start_pos(in_args, 0, 1, seq_pos)); ``` -- 注意事项: - 1. 当一个`batch`中含有多个序列,**不支持序列长度为`0`的序列(也就是空输入)** 作为输入。不同计算层对空输入的处理策略有可能不同,潜在会引起未定义行为,或者引起行时错误,请在输入时进行合法性检查。 +注意事项: +1. 当一个`batch`中含有多个序列,**不支持序列长度为`0`的序列(也就是空输入)** 作为输入。不同计算层对空输入的处理策略有可能不同,潜在会引起未定义行为,或者引起行时错误,请在输入时进行合法性检查。 ### Python 端数据类型说明 下表列出了Python端训练接口暴露的数据类型(`paddle.layer.data`函数`type`字段的取值)对应于调用C-API需要创建的数据类型: -Python 端数据类型 | C-API 输入数据类型| -:-------------: | :-------------: -`paddle.data_type.integer_value` |整型数组,无需附加序列信息| -`paddle.data_type.dense_vector` |浮点型稠密矩阵,无需附加序列信息| -`paddle.data_type.sparse_binary_vector` |浮点型稀疏矩阵,无需提供非零元的值,默认为1,无需附加序列信息| -`paddle.data_type.sparse_vector` |浮点型稀疏矩阵,需提供非零元的值,无需附加序列信息| -`paddle.data_type.integer_value_sequence` |整型数组,需附加序列信息| -`paddle.data_type.dense_vector_sequence` |浮点型稠密矩阵,需附加序列信息| -`paddle.data_type.sparse_binary_vector_sequence` |浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加序列信息| -`paddle.data_type.sparse_vector_sequence` |浮点型稀疏矩阵,需提供非零元的值,需附加序列信息| -`paddle.data_type.integer_value_sub_sequence` |整型数组,需附加双层序列信息| -`paddle.data_type.dense_vector_sub_sequence` |浮点型稠密矩阵,需附加双层序列信息| -`paddle.data_type.sparse_binary_vector_sub_sequence` |浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加双层序列信息| -`paddle.data_type.sparse_vector_sub_sequence` |浮点型稀疏矩阵,需提供非零元的值,需附加双层序列信息| - + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Python 端数据类型C-API 输入数据类型
paddle.data_type.integer_value整型数组,无需附加序列信息
paddle.data_type.dense_vector浮点型稠密矩阵,无需附加序列信息
paddle.data_type.sparse_binary_vector浮点型稀疏矩阵,无需提供非零元的值,默认为1,无需附加序列信息
paddle.data_type.sparse_vector浮点型稀疏矩阵,需提供非零元的值,无需附加序列信息
paddle.data_type.integer_value_sequence整型数组,需附加序列信息
paddle.data_type.dense_vector_sequence浮点型稠密矩阵,需附加序列信息
paddle.data_type.sparse_binary_vector_sequence浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加序列信息
paddle.data_type.sparse_vector_sequence浮点型稀疏矩阵,需提供非零元的值,需附加序列信息
paddle.data_type.integer_value_sub_sequence整型数组,需附加双层序列信息
paddle.data_type.dense_vector_sub_sequence浮点型稠密矩阵,需附加双层序列信息
paddle.data_type.sparse_binary_vector_sub_sequence浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加双层序列信息
paddle.data_type.sparse_vector_sub_sequence浮点型稀疏矩阵,需提供非零元的值,需附加双层序列信息
+ +
### 输出数据 PaddlePaddle中一个计算层的输出数据组织方式和输入数据组织方式完全相同。一个输出数据同样被组织为一个`argument`,`argument`通过`paddle_matrix`或`paddle_ivector`存数数据,如果输出是一个序列,那么会携带有`sequence_start_positions`信息。调用C-API相关接口,读取需要的结果即可。 -- GitLab