Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
BaiXuePrincess
Paddle
提交
b915fde9
P
Paddle
项目概览
BaiXuePrincess
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录