Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
b915fde9
P
Paddle
项目概览
PaddlePaddle
/
Paddle
1 年多 前同步成功
通知
2302
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b915fde9
编写于
12月 19, 2017
作者:
Y
ying
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use html table.
上级
26d5a7aa
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
125 addition
and
80 deletion
+125
-80
doc/howto/usage/capi/a_simple_example.md
doc/howto/usage/capi/a_simple_example.md
+5
-5
doc/howto/usage/capi/organization_of_the_inputs.md
doc/howto/usage/capi/organization_of_the_inputs.md
+120
-75
未找到文件。
doc/howto/usage/capi/a_simple_example.md
浏览文件 @
b915fde9
...
@@ -174,7 +174,7 @@ paddle_arguments out_args = paddle_arguments_create_none();
...
@@ -174,7 +174,7 @@ paddle_arguments out_args = paddle_arguments_create_none();
CHECK
(
paddle_gradient_machine_forward
(
machine
,
CHECK
(
paddle_gradient_machine_forward
(
machine
,
in_args
,
in_args
,
out_args
,
out_args
,
/* is train taks or not */
false
));
s
/* is train taks or not */
false
));
// Create the matrix to hold the forward result of the neural network.
// Create the matrix to hold the forward result of the neural network.
paddle_matrix
prob
=
paddle_matrix_create_none
();
paddle_matrix
prob
=
paddle_matrix_create_none
();
...
...
doc/howto/usage/capi/organization_of_the_inputs.md
浏览文件 @
b915fde9
...
@@ -9,13 +9,13 @@
...
@@ -9,13 +9,13 @@
-
稠密矩阵
-
稠密矩阵
-
稀疏矩阵
-
稀疏矩阵
-
说明:
说明:
1.
一维数组
**仅支持整型值**
;
1.
一维数组
**仅支持整型值**
;
-
常用于自然语言处理任务,例如:表示词语在词典中的序号;
-
常用于自然语言处理任务,例如:表示词语在词典中的序号;
-
分类任务中类别标签;
-
分类任务中类别标签;
1.
逻辑上高于二维的数据(例如含有多个通道的图片,视频等)在程序实现中都会转化为二维矩阵,转化方法在相应的领域都有通用解决方案,需要使用者自己了解并完成转化;
1.
逻辑上高于二维的数据(例如含有多个通道的图片,视频等)在程序实现中都会转化为二维矩阵,转化方法在相应的领域都有通用解决方案,需要使用者自己了解并完成转化;
1.
二维矩阵可以表示行向量和列向量,任何时候如果需要浮点型数组(向量),都应使用C-API中的矩阵来表示,而不是C-API中的一维数组。
1.
二维矩阵可以表示行向量和列向量,任何时候如果需要浮点型数组(向量),都应使用C-API中的矩阵来表示,而不是C-API中的一维数组。
1.
不论是一维整型数组还是二维浮点数矩阵,
**为它们附加上序列信息将变成序列输入。PaddlePaddle 会通过判数据是否附带有序列信息来判断一个向量/矩阵是否是一个序列**
。当非序列输入时,无需关心和处理序列信息。关于什么是“序列信息”,下文会详细进行介绍。
1.
不论是一维整型数组还是二维浮点数矩阵,
**为它们附加上序列信息将变成序列输入。PaddlePaddle 会通过判数据是否附带有序列信息来判断一个向量/矩阵是否是一个序列**
。当非序列输入时,无需关心和处理序列信息。关于什么是“序列信息”,下文会详细进行介绍。
### 基本使用概念
### 基本使用概念
...
@@ -32,7 +32,7 @@
...
@@ -32,7 +32,7 @@
-
一维整型数组
-
一维整型数组
概念上可以将`paddle_ivector`理解为一个一维的整型数组,通常用于表示离散的类别标签,或是在自然语言处理任务中表示词语在字典中的序号。下面的代码片段创建了含有三个元素`1`、`2`、`3`的`paddle_ivector`。
概念上可以将`paddle_ivector`理解为一个一维的整型数组,通常用于表示离散的类别标签,或是在自然语言处理任务中表示词语在字典中的序号。下面的代码片段创建了含有三个元素`1`、`2`、`3`的`paddle_ivector`。
```c
pp
```c
int ids[] = {1, 2, 3};
int ids[] = {1, 2, 3};
paddle_ivector ids_array =
paddle_ivector ids_array =
paddle_ivector_create(ids, sizeof(ids) / sizeof(int), false, false);
paddle_ivector_create(ids, sizeof(ids) / sizeof(int), false, false);
...
@@ -40,12 +40,12 @@
...
@@ -40,12 +40,12 @@
```
```
-
**稠密矩阵**
-
**稠密矩阵**
-
一个
$m×n$的稠密矩阵是一个由$m$行$n$列元素排列成的矩形阵列,矩阵里的元素是浮点数。对神经网络来说,矩阵的高度$m$
是一次预测接受的样本数目,宽度$n$是神经网络定义时,
`paddle.layer.data`
的
`size`
。
-
一个
`m×n`
的稠密矩阵是一个由
`m`
行
`n`
列元素排列成的矩形阵列,矩阵里的元素是浮点数。对神经网络来说,矩阵的高度
`m`
是一次预测接受的样本数目,宽度$n$是神经网络定义时,
`paddle.layer.data`
的
`size`
。
-
下面的代码片段创建了一个高度为1,宽度为
`layer_size`
的稠密矩阵,矩阵中每个元素的值随机生成。
-
下面的代码片段创建了一个高度为1,宽度为
`layer_size`
的稠密矩阵,矩阵中每个元素的值随机生成。
```c
pp
```c
paddle_matrix mat =
paddle_matrix mat =
paddle_matrix_create(
paddle_matrix_create(
/* height = batch size */ 1,
/* height = batch size */ 1,
/* width = dimensionality of the data layer */ layer_size,
/* width = dimensionality of the data layer */ layer_size,
/* whether to use GPU */ false);
/* whether to use GPU */ false);
...
@@ -67,15 +67,15 @@
...
@@ -67,15 +67,15 @@
-
**稀疏矩阵**
-
**稀疏矩阵**
PaddlePaddle C-API 中 稀疏矩阵使用
[
CSR(Compressed Sparse Row Format)
](
https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format
)
)格式存储。下图是CSR存储稀疏矩阵的示意图。
PaddlePaddle C-API 中 稀疏矩阵使用
[
CSR(Compressed Sparse Row Format)
](
https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format
)
)格式存储。下图是CSR存储稀疏矩阵的示意图。
<p
align=
"center"
>
<p
align=
"center"
>
<img
src=
"
images/csr.png"
width=
70%
></br>
图1. CSR存储示意图.
<img
src=
"
https://user-images.githubusercontent.com/5842774/34159369-009fd328-e504-11e7-9e08-36bc6dc5e505.png"
width=
700
><br>
图1. 稀疏矩阵存储示意图
</p>
</p>
CSR存储格式通过:(1)非零元素的值(上图中的
`values`
);(2)行偏移(上图中的
`row offsets`
):每一行元素在
`values`
中的起始偏移,
`row offsets`
中元素个数总是等于行数 + 1;(3)非零元素的列号(上图中的
`column indices`
)来确定稀疏矩阵的内容。
CSR存储格式通过:(1)非零元素的值(上图中的
`values`
);(2)行偏移(上图中的
`row offsets`
):每一行元素在
`values`
中的起始偏移,
`row offsets`
中元素个数总是等于行数 + 1;(3)非零元素的列号(上图中的
`column indices`
)来确定稀疏矩阵的内容。
在PaddlePaddle C-API中,通过调用以下接口创建稀疏矩阵:
在PaddlePaddle C-API中,通过调用以下接口创建稀疏矩阵:
```
cpp
```
c
PD_API
paddle_matrix
paddle_matrix_create_sparse
(
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
);
```
```
...
@@ -83,9 +83,9 @@
...
@@ -83,9 +83,9 @@
1.
创建稀疏矩阵时需要显示地指定矩阵的(1)高度(
`height`
,在神经网络中等于一次预测处理的样本数)(2)宽度(
`width`
,
`paddle.layer.data`
的
`size`
)以及(3)非零元个数(
`nnz`
)。
1.
创建稀疏矩阵时需要显示地指定矩阵的(1)高度(
`height`
,在神经网络中等于一次预测处理的样本数)(2)宽度(
`width`
,
`paddle.layer.data`
的
`size`
)以及(3)非零元个数(
`nnz`
)。
1.
当上述接口第4个参数
`isBinary`
指定为
`true`
时,
**只需要设置行偏移(`row_offset`)和列号(`colum indices`),不需要提供元素值(`values`)**
,这时行偏移和列号指定的元素默认其值为1。
1.
当上述接口第4个参数
`isBinary`
指定为
`true`
时,
**只需要设置行偏移(`row_offset`)和列号(`colum indices`),不需要提供元素值(`values`)**
,这时行偏移和列号指定的元素默认其值为1。
-
下面的代码片段创建了一个CPU上的二值稀疏矩阵:
下面的代码片段创建了一个CPU上的二值稀疏矩阵:
```cpp
```
c
paddle_matrix
mat
=
paddle_matrix_create_sparse
(
1
,
layer_size
,
nnz
,
true
,
false
);
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
colIndices
[]
=
{
9
,
93
,
109
};
// layer_size here is greater than 109.
int
rowOffset
[]
=
{
0
,
sizeof
(
colIndices
)
/
sizeof
(
int
)};
int
rowOffset
[]
=
{
0
,
sizeof
(
colIndices
)
/
sizeof
(
int
)};
...
@@ -94,13 +94,13 @@
...
@@ -94,13 +94,13 @@
rowOffset
,
rowOffset
,
sizeof
(
rowOffset
)
/
sizeof
(
int
),
sizeof
(
rowOffset
)
/
sizeof
(
int
),
colIndices
,
colIndices
,
sizeof
(colIndices) / sizeof(int),
(
colIndices
)
/
sizeof
(
int
),
NULL
/*values array is NULL.*/
,
NULL
/*values array is NULL.*/
,
0
/*size of the value arrary is 0.*/
));
0
/*size of the value arrary is 0.*/
));
CHECK
(
paddle_arguments_set_value
(
in_args
,
0
,
mat
));
CHECK
(
paddle_arguments_set_value
(
in_args
,
0
,
mat
));
```
```
-
下面的代码片段在创建了一个CPU上的带元素值的稀疏矩阵:
下面的代码片段在创建了一个CPU上的带元素值的稀疏矩阵:
```
cpp
```
c
paddle_matrix
mat
=
paddle_matrix_create_sparse
(
1
,
layer_size
,
nnz
,
false
,
false
);
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
colIndices
[]
=
{
9
,
93
,
109
};
// layer_size here is greater than 109.
int
rowOffset
[]
=
{
0
,
sizeof
(
colIndices
)
/
sizeof
(
int
)};
int
rowOffset
[]
=
{
0
,
sizeof
(
colIndices
)
/
sizeof
(
int
)};
...
@@ -114,8 +114,7 @@
...
@@ -114,8 +114,7 @@
values
,
values
,
sizeof
(
values
)
/
sizeof
(
float
)));
sizeof
(
values
)
/
sizeof
(
float
)));
```
```
注意事项:
-
注意事项:
1.
移动端预测
**不支持**
稀疏矩阵及相关的接口。
1.
移动端预测
**不支持**
稀疏矩阵及相关的接口。
### 组织序列信息
### 组织序列信息
...
@@ -143,7 +142,7 @@
...
@@ -143,7 +142,7 @@
图2 是PaddlePaddle中单层序列和双层序列存储示意图。
图2 是PaddlePaddle中单层序列和双层序列存储示意图。
<p
align=
"center"
>
<p
align=
"center"
>
<img
src=
"
images/sequence_data.png"
width=
80%
></br>
图2. 序列输入示意图.
<img
src=
"
https://user-images.githubusercontent.com/5842774/34159714-1f81a9be-e505-11e7-8a8a-4902146ec899.png"
width=
800
><br>
图2. 序列输入示意图
</p>
</p>
-
单层序列
-
单层序列
...
@@ -153,7 +152,7 @@
...
@@ -153,7 +152,7 @@
2. 这时的`sequence_start_positions`为:`[0, 5, 8, 10, 14]`;
2. 这时的`sequence_start_positions`为:`[0, 5, 8, 10, 14]`;
3. 不论数据域是`paddle_ivector`类型还是`paddle_matrix`类型,都可以通过调用下面的接口为原有的数据输入附加上序列信息,使之变为一个单层序列输入,代码片段如下:
3. 不论数据域是`paddle_ivector`类型还是`paddle_matrix`类型,都可以通过调用下面的接口为原有的数据输入附加上序列信息,使之变为一个单层序列输入,代码片段如下:
```c
pp
```c
int seq_pos_array[] = {0, 5, 8, 10, 14};
int seq_pos_array[] = {0, 5, 8, 10, 14};
paddle_ivector seq_pos = paddle_ivector_create(
paddle_ivector seq_pos = paddle_ivector_create(
seq_pos_array, sizeof(seq_pos_array) / sizeof(int), false, false);
seq_pos_array, sizeof(seq_pos_array) / sizeof(int), false, false);
...
@@ -166,11 +165,10 @@
...
@@ -166,11 +165,10 @@
图2 (b) 展示了一个含有4个序列的`batch`输入;
图2 (b) 展示了一个含有4个序列的`batch`输入;
1. 4个序列的长度分别为:5、3、2、4;这四个序列又分别含有3、2、1、2个子序列;
1. 4个序列的长度分别为:5、3、2、4;这四个序列又分别含有3、2、1、2个子序列;
1. 这时的需要同时提供:
1. 这时的需要同时提供:
- 1. 外层序列在`batch`中的起始偏移`:[0, 5, 8, 10, 14]`;
- 外层序列在`batch`中的起始偏移`:[0, 5, 8, 10, 14]`;
- 2. 内层序列在`batch`中的起始偏移:`[0, 2, 3, 5, 7, 8, 10, 13, 14]`;
- 内层序列在`batch`中的起始偏移:`[0, 2, 3, 5, 7, 8, 10, 13, 14]`;
1. 不论数据域是`paddle_ivector`类型还是`paddle_matrix`类型,这时需要调用创建序列信息和为`argument`设置序列信息的接口**两次**,分别为数据输入添加外层序列和内层序列的序列信息,使之变为一个双层序列输入,代码片段如下:
1. 不论数据域是`paddle_ivector`类型还是`paddle_matrix`类型,这时需要调用创建序列信息和为`argument`设置序列信息的接口**两次**,分别为数据输入添加外层序列和内层序列的序列信息,使之变为一个双层序列输入,代码片段如下:
```c
pp
```c
// set the sequence start positions for the outter sequences.
// set the sequence start positions for the outter sequences.
int outter_seq_pos_array[] = {0, 5, 8, 10, 14};
int outter_seq_pos_array[] = {0, 5, 8, 10, 14};
paddle_ivector seq_pos =
paddle_ivector seq_pos =
...
@@ -193,28 +191,75 @@
...
@@ -193,28 +191,75 @@
CHECK(paddle_arguments_set_sequence_start_pos(in_args, 0, 1, seq_pos));
CHECK(paddle_arguments_set_sequence_start_pos(in_args, 0, 1, seq_pos));
```
```
-
注意事项:
注意事项:
1.
当一个
`batch`
中含有多个序列,
**不支持序列长度为`0`的序列(也就是空输入)**
作为输入。不同计算层对空输入的处理策略有可能不同,潜在会引起未定义行为,或者引起行时错误,请在输入时进行合法性检查。
1.
当一个
`batch`
中含有多个序列,
**不支持序列长度为`0`的序列(也就是空输入)**
作为输入。不同计算层对空输入的处理策略有可能不同,潜在会引起未定义行为,或者引起行时错误,请在输入时进行合法性检查。
### Python 端数据类型说明
### Python 端数据类型说明
下表列出了Python端训练接口暴露的数据类型(
`paddle.layer.data`
函数
`type`
字段的取值)对应于调用C-API需要创建的数据类型:
下表列出了Python端训练接口暴露的数据类型(
`paddle.layer.data`
函数
`type`
字段的取值)对应于调用C-API需要创建的数据类型:
Python 端数据类型 | C-API 输入数据类型|
<html>
:-------------: | :-------------:
<table
border=
"2"
frame=
"border"
>
`paddle.data_type.integer_value`
|整型数组,无需附加序列信息|
<table>
`paddle.data_type.dense_vector`
|浮点型稠密矩阵,无需附加序列信息|
<thead>
`paddle.data_type.sparse_binary_vector`
|浮点型稀疏矩阵,无需提供非零元的值,默认为1,无需附加序列信息|
<tr>
`paddle.data_type.sparse_vector`
|浮点型稀疏矩阵,需提供非零元的值,无需附加序列信息|
<th
style=
"text-align:left"
>
Python 端数据类型
</th>
`paddle.data_type.integer_value_sequence`
|整型数组,需附加序列信息|
<th
style=
"text-align:left"
>
C-API 输入数据类型
</th>
`paddle.data_type.dense_vector_sequence`
|浮点型稠密矩阵,需附加序列信息|
</tr>
`paddle.data_type.sparse_binary_vector_sequence`
|浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加序列信息|
</thead>
`paddle.data_type.sparse_vector_sequence`
|浮点型稀疏矩阵,需提供非零元的值,需附加序列信息|
<tbody>
`paddle.data_type.integer_value_sub_sequence`
|整型数组,需附加双层序列信息|
<tr>
`paddle.data_type.dense_vector_sub_sequence`
|浮点型稠密矩阵,需附加双层序列信息|
<td
style=
"text-align:left"
>
paddle.data_type.integer_value
</td>
`paddle.data_type.sparse_binary_vector_sub_sequence`
|浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加双层序列信息|
<td
style=
"text-align:left"
>
整型数组,无需附加序列信息
</td>
`paddle.data_type.sparse_vector_sub_sequence`
|浮点型稀疏矩阵,需提供非零元的值,需附加双层序列信息|
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.dense_vector
</td>
<td
style=
"text-align:left"
>
浮点型稠密矩阵,无需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.sparse_binary_vector
</td>
<td
style=
"text-align:left"
>
浮点型稀疏矩阵,无需提供非零元的值,默认为1,无需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.sparse_vector
</td>
<td
style=
"text-align:left"
>
浮点型稀疏矩阵,需提供非零元的值,无需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.integer_value_sequence
</td>
<td
style=
"text-align:left"
>
整型数组,需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.dense_vector_sequence
</td>
<td
style=
"text-align:left"
>
浮点型稠密矩阵,需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.sparse_binary_vector_sequence
</td>
<td
style=
"text-align:left"
>
浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.sparse_vector_sequence
</td>
<td
style=
"text-align:left"
>
浮点型稀疏矩阵,需提供非零元的值,需附加序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.integer_value_sub_sequence
</td>
<td
style=
"text-align:left"
>
整型数组,需附加双层序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.dense_vector_sub_sequence
</td>
<td
style=
"text-align:left"
>
浮点型稠密矩阵,需附加双层序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.sparse_binary_vector_sub_sequence
</td>
<td
style=
"text-align:left"
>
浮点型稀疏矩阵,无需提供非零元的值,默认为1,需附加双层序列信息
</td>
</tr>
<tr>
<td
style=
"text-align:left"
>
paddle.data_type.sparse_vector_sub_sequence
</td>
<td
style=
"text-align:left"
>
浮点型稀疏矩阵,需提供非零元的值,需附加双层序列信息
</td>
</tr>
</tbody>
</table>
</html>
<br>
### 输出数据
### 输出数据
PaddlePaddle中一个计算层的输出数据组织方式和输入数据组织方式完全相同。一个输出数据同样被组织为一个
`argument`
,
`argument`
通过
`paddle_matrix`
或
`paddle_ivector`
存数数据,如果输出是一个序列,那么会携带有
`sequence_start_positions`
信息。调用C-API相关接口,读取需要的结果即可。
PaddlePaddle中一个计算层的输出数据组织方式和输入数据组织方式完全相同。一个输出数据同样被组织为一个
`argument`
,
`argument`
通过
`paddle_matrix`
或
`paddle_ivector`
存数数据,如果输出是一个序列,那么会携带有
`sequence_start_positions`
信息。调用C-API相关接口,读取需要的结果即可。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录