Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
728defbe
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
728defbe
编写于
11月 11, 2016
作者:
H
Haonan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
copy the data when createSparseMatrix
上级
069d0004
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
66 addition
and
32 deletion
+66
-32
paddle/gserver/layers/CostLayer.cpp
paddle/gserver/layers/CostLayer.cpp
+30
-10
paddle/parameter/Argument.cpp
paddle/parameter/Argument.cpp
+34
-18
paddle/parameter/Argument.h
paddle/parameter/Argument.h
+2
-4
未找到文件。
paddle/gserver/layers/CostLayer.cpp
浏览文件 @
728defbe
...
...
@@ -462,29 +462,49 @@ bool MultiBinaryLabelCrossEntropy::init(const LayerMap& layerMap,
void
MultiBinaryLabelCrossEntropy
::
forwardImp
(
Matrix
&
output
,
Argument
&
label
,
Matrix
&
target
)
{
label
.
idsToSparseMatrix
(
output
.
getWidth
(),
useGpu_
);
MatrixPtr
value
=
nullptr
;
if
(
label
.
ids
)
{
CHECK
(
!
label
.
value
);
value
=
Matrix
::
createSparseMatrix
(
label
.
ids
->
getSize
(),
output
.
getWidth
(),
label
.
ids
->
getSize
(),
NO_VALUE
,
SPARSE_CSR
,
false
,
useGpu_
);
label
.
idsToSparseMatrix
(
value
);
}
else
{
CHECK
(
label
.
value
);
value
=
label
.
value
;
}
if
(
dynamic_cast
<
CpuSparseMatrix
*>
(
label
.
value
.
get
())
||
dynamic_cast
<
GpuSparseMatrix
*>
(
label
.
value
.
get
()))
{
target
.
multiBinaryLabelCrossEntropy
(
output
,
*
label
.
value
);
if
(
dynamic_cast
<
CpuSparseMatrix
*>
(
value
.
get
())
||
dynamic_cast
<
GpuSparseMatrix
*>
(
value
.
get
()))
{
target
.
multiBinaryLabelCrossEntropy
(
output
,
*
value
);
}
else
{
Matrix
::
resizeOrCreate
(
targetPerDim_
,
output
.
getHeight
(),
output
.
getWidth
(),
false
,
useGpu_
);
targetPerDim_
->
binaryLabelCrossEntropy
(
output
,
*
label
.
value
);
targetPerDim_
->
binaryLabelCrossEntropy
(
output
,
*
value
);
targetPerDim_
->
rowSum
(
target
);
}
}
void
MultiBinaryLabelCrossEntropy
::
backwardImp
(
Matrix
&
output
,
Argument
&
label
,
Matrix
&
outputG
)
{
label
.
idsToSparseMatrix
(
output
.
getWidth
(),
useGpu_
);
MatrixPtr
value
=
nullptr
;
if
(
label
.
ids
)
{
CHECK
(
!
value
);
value
=
Matrix
::
createSparseMatrix
(
label
.
ids
->
getSize
(),
output
.
getWidth
(),
label
.
ids
->
getSize
(),
NO_VALUE
,
SPARSE_CSR
,
false
,
useGpu_
);
label
.
idsToSparseMatrix
(
value
);
}
else
{
CHECK
(
label
.
value
);
value
=
label
.
value
;
}
if
(
dynamic_cast
<
CpuSparseMatrix
*>
(
label
.
value
.
get
())
||
dynamic_cast
<
GpuSparseMatrix
*>
(
label
.
value
.
get
()))
{
outputG
.
multiBinaryLabelCrossEntropyBp
(
output
,
*
label
.
value
);
if
(
dynamic_cast
<
CpuSparseMatrix
*>
(
value
.
get
())
||
dynamic_cast
<
GpuSparseMatrix
*>
(
value
.
get
()))
{
outputG
.
multiBinaryLabelCrossEntropyBp
(
output
,
*
value
);
}
else
{
outputG
.
binaryLabelCrossEntropyBp
(
output
,
*
label
.
value
);
outputG
.
binaryLabelCrossEntropyBp
(
output
,
*
value
);
}
}
...
...
paddle/parameter/Argument.cpp
浏览文件 @
728defbe
...
...
@@ -572,25 +572,41 @@ void Argument::subArgFrom(const Argument& input, size_t offset, size_t height,
}
}
void
Argument
::
idsToSparseMatrix
(
int
width
,
bool
useGpu
)
{
if
(
ids
)
{
CHECK
(
!
value
);
int
height
=
ids
->
getSize
();
int
nnz
=
height
;
auto
rows
=
IVector
::
create
(
height
+
1
,
useGpu
);
auto
cols
=
IVector
::
create
(
nnz
,
useGpu
);
rows
->
setElement
(
0
,
0
);
for
(
int
i
=
0
;
i
<
height
;
i
++
)
{
int
id
=
ids
->
getElement
(
i
);
CHECK_LT
(
id
,
width
);
rows
->
setElement
(
i
+
1
,
i
+
1
);
cols
->
setElement
(
i
,
id
);
}
value
=
Matrix
::
createSparseMatrix
(
nullptr
,
rows
->
getData
(),
cols
->
getData
(),
height
,
width
,
nnz
,
NO_VALUE
,
SPARSE_CSR
,
false
,
useGpu
);
void
Argument
::
idsToSparseMatrix
(
MatrixPtr
sparse_mat
)
{
int
height
=
ids
->
getSize
();
int
width
=
sparse_mat
->
getWidth
();
CpuIVector
cpu_ids
(
height
);
cpu_ids
.
copyFrom
(
*
ids
);
int
*
id_data
=
cpu_ids
.
getData
();
int
*
rows
=
nullptr
;
int
*
cols
=
nullptr
;
if
(
sparse_mat
->
useGpu
())
{
auto
gpu_sparse_mat
=
dynamic_cast
<
GpuSparseMatrix
*>
(
sparse_mat
.
get
());
rows
=
gpu_sparse_mat
->
rows_
;
cols
=
gpu_sparse_mat
->
cols_
;
}
else
{
CHECK
(
value
);
rows
=
sparse_mat
->
getRows
();
cols
=
sparse_mat
->
getCols
();
}
rows
[
0
]
=
0
;
for
(
int
i
=
0
;
i
<
height
;
i
++
)
{
int
id
=
id_data
[
i
];
CHECK_LT
(
id
,
width
);
rows
[
i
+
1
]
=
i
+
1
;
cols
[
i
]
=
id
;
}
if
(
sparse_mat
->
useGpu
())
{
auto
gpu_sparse_mat
=
dynamic_cast
<
GpuSparseMatrix
*>
(
sparse_mat
.
get
());
hl_memcpy_csr_matrix
(
gpu_sparse_mat
->
sMatrix_
.
get
(),
nullptr
,
rows
,
cols
,
HPPL_STREAM_DEFAULT
);
hl_stream_synchronize
(
HPPL_STREAM_DEFAULT
);
}
}
...
...
paddle/parameter/Argument.h
浏览文件 @
728defbe
...
...
@@ -289,11 +289,9 @@ struct Argument {
/*
@brief convert the ids vector to value as a sparse matrix
the ids vector keeps valid
@param the matrix width (id range)
@useGpu
@param[out] the output sparse_mat (already allocated)
*/
void
idsToSparseMatrix
(
int
width
,
bool
useGpu
);
void
idsToSparseMatrix
(
MatrixPtr
sparse_mat
);
};
}
// namespace paddle
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录