Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleDetection
提交
df9be2d4
P
PaddleDetection
项目概览
PaddlePaddle
/
PaddleDetection
1 年多 前同步成功
通知
696
Star
11112
Fork
2696
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
184
列表
看板
标记
里程碑
合并请求
40
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleDetection
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
184
Issue
184
列表
看板
标记
里程碑
合并请求
40
合并请求
40
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
df9be2d4
编写于
1月 09, 2017
作者:
H
hedaoyuan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix CrossMapNormalFunc and ContextProjectionFunc(remove inouts argument)
上级
57e25211
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
98 addition
and
85 deletion
+98
-85
paddle/function/BufferArg.h
paddle/function/BufferArg.h
+47
-31
paddle/function/ContextProjectionOp.cpp
paddle/function/ContextProjectionOp.cpp
+5
-8
paddle/function/CrossMapNormalOp.cpp
paddle/function/CrossMapNormalOp.cpp
+11
-8
paddle/function/Function.cpp
paddle/function/Function.cpp
+8
-6
paddle/function/Function.h
paddle/function/Function.h
+10
-6
paddle/gserver/layers/ContextProjection.cpp
paddle/gserver/layers/ContextProjection.cpp
+4
-6
paddle/gserver/layers/NormProjectionLayer.cpp
paddle/gserver/layers/NormProjectionLayer.cpp
+13
-20
未找到文件。
paddle/function/BufferArg.h
浏览文件 @
df9be2d4
...
...
@@ -57,58 +57,67 @@ typedef std::shared_ptr<BufferArg> BufferArgPtr;
* output Buffer or added to the output Buffer is determined by the
* argType_ property of the output BufferArg.
*/
// ArgType is only used by output BufferArg.
// For input argument, argType_ is ignored.
// For output argument, need to set the argType_ of the BufferArg.
enum
ArgType
{
UNSPECIFIED
=
0
,
ASSIGN_TO
=
1
,
ADD_TO
=
2
,
};
class
BufferArg
{
public:
// ArgType is only used by output BufferArg.
// For input argument, argType_ is ignored.
// For output argument, need to set the argType_ of the BufferArg.
enum
ArgType
{
UNSPECIFIED
=
0
,
ASSIGN_TO
=
1
,
ADD_TO
=
2
,
};
void
setArgType
(
ArgType
argType
)
{
argType_
=
argType
;
}
ArgType
getArgType
()
const
{
return
argType_
;
}
public:
BufferArg
(
void
*
buf
,
ValueType
valueType
,
const
TensorShape
&
shape
)
:
buf_
(
buf
),
valueType_
(
valueType
),
shape_
(
shape
)
{}
BufferArg
(
void
*
buf
,
ValueType
valueType
,
const
TensorShape
&
shape
,
ArgType
argType
=
UNSPECIFIED
)
:
buf_
(
buf
),
valueType_
(
valueType
),
shape_
(
shape
),
argType_
(
argType
)
{}
BufferArg
(
void
*
buf
,
ValueType
valueType
)
:
buf_
(
buf
),
valueType_
(
valueType
)
{}
BufferArg
(
const
Matrix
&
matrix
)
BufferArg
(
const
Matrix
&
matrix
,
ArgType
argType
=
UNSPECIFIED
)
:
buf_
(
const_cast
<
void
*>
(
reinterpret_cast
<
const
void
*>
(
matrix
.
getData
()))),
valueType_
(
DataType
<
real
>::
value
),
shape_
(
2
)
{
shape_
(
2
),
argType_
(
argType
)
{
shape_
.
setDim
(
0
,
matrix
.
getHeight
());
shape_
.
setDim
(
1
,
matrix
.
getWidth
());
}
BufferArg
(
const
Matrix
&
matrix
,
const
TensorShape
&
shape
)
BufferArg
(
const
Matrix
&
matrix
,
const
TensorShape
&
shape
,
ArgType
argType
=
UNSPECIFIED
)
:
buf_
(
const_cast
<
void
*>
(
reinterpret_cast
<
const
void
*>
(
matrix
.
getData
()))),
valueType_
(
DataType
<
real
>::
value
),
shape_
(
shape
)
{
shape_
(
shape
),
argType_
(
argType
)
{
CHECK_EQ
(
matrix
.
getElementCnt
(),
shape
.
getElements
());
}
BufferArg
(
const
Vector
&
vector
)
BufferArg
(
const
Vector
&
vector
,
ArgType
argType
=
UNSPECIFIED
)
:
buf_
(
const_cast
<
void
*>
(
reinterpret_cast
<
const
void
*>
(
vector
.
getData
()))),
valueType_
(
DataType
<
real
>::
value
),
shape_
(
1
)
{
shape_
(
1
),
argType_
(
argType
)
{
shape_
.
setDim
(
0
,
vector
.
getSize
());
}
BufferArg
(
const
IVector
&
vector
)
BufferArg
(
const
IVector
&
vector
,
ArgType
argType
=
UNSPECIFIED
)
:
buf_
(
const_cast
<
void
*>
(
reinterpret_cast
<
const
void
*>
(
vector
.
getData
()))),
valueType_
(
VALUE_TYPE_INT32
),
shape_
(
1
)
{
shape_
(
1
),
argType_
(
argType
)
{
shape_
.
setDim
(
0
,
vector
.
getSize
());
}
...
...
@@ -163,8 +172,10 @@ protected:
// if a < b then value_.buf_[a] < value_.buf_[b]
class
SequenceIdArg
:
public
BufferArg
{
public:
SequenceIdArg
(
void
*
buf
,
const
TensorShape
&
shape
)
:
BufferArg
(
buf
,
VALUE_TYPE_INT32
,
shape
)
{
SequenceIdArg
(
void
*
buf
,
const
TensorShape
&
shape
,
ArgType
argType
=
UNSPECIFIED
)
:
BufferArg
(
buf
,
VALUE_TYPE_INT32
,
shape
,
argType
)
{
CHECK_EQ
(
shape_
.
ndims
(),
1
);
numSeqs_
=
shape_
[
0
]
-
1
;
}
...
...
@@ -187,11 +198,15 @@ public:
SequenceArg
(
void
*
buf
,
ValueType
valueType
,
const
TensorShape
&
shape
,
const
SequenceIdArg
&
startPositions
)
:
BufferArg
(
buf
,
valueType
,
shape
),
startPositions_
(
startPositions
)
{}
const
SequenceIdArg
&
startPositions
,
ArgType
argType
=
UNSPECIFIED
)
:
BufferArg
(
buf
,
valueType
,
shape
,
argType
),
startPositions_
(
startPositions
)
{}
SequenceArg
(
const
Matrix
&
matrix
,
const
IVector
&
vector
)
:
BufferArg
(
matrix
),
startPositions_
(
vector
)
{}
SequenceArg
(
const
Matrix
&
matrix
,
const
IVector
&
vector
,
ArgType
argType
=
UNSPECIFIED
)
:
BufferArg
(
matrix
,
argType
),
startPositions_
(
vector
)
{}
~
SequenceArg
()
{}
...
...
@@ -214,8 +229,9 @@ public:
const
BufferArg
&
col
,
size_t
nnz
,
SparseDataFormat
format
,
SparseDataType
type
)
:
BufferArg
(
buf
,
valueType
,
shape
),
SparseDataType
type
,
ArgType
argType
=
UNSPECIFIED
)
:
BufferArg
(
buf
,
valueType
,
shape
,
argType
),
row_
(
row
),
col_
(
col
),
nnz_
(
nnz
),
...
...
@@ -232,13 +248,13 @@ public:
}
}
SparseMatrixArg
(
const
CpuSparseMatrix
&
sparse
)
:
BufferArg
(
sparse
),
SparseMatrixArg
(
const
CpuSparseMatrix
&
sparse
,
ArgType
argType
=
UNSPECIFIED
)
:
BufferArg
(
sparse
,
argType
),
row_
(
reinterpret_cast
<
void
*>
(
sparse
.
getRows
()),
VALUE_TYPE_INT32
),
col_
(
reinterpret_cast
<
void
*>
(
sparse
.
getCols
()),
VALUE_TYPE_INT32
)
{}
SparseMatrixArg
(
const
GpuSparseMatrix
&
sparse
)
:
BufferArg
(
sparse
),
SparseMatrixArg
(
const
GpuSparseMatrix
&
sparse
,
ArgType
argType
=
UNSPECIFIED
)
:
BufferArg
(
sparse
,
argType
),
row_
(
reinterpret_cast
<
void
*>
(
sparse
.
getRows
()),
VALUE_TYPE_INT32
),
col_
(
reinterpret_cast
<
void
*>
(
sparse
.
getCols
()),
VALUE_TYPE_INT32
)
{}
...
...
paddle/function/ContextProjectionOp.cpp
浏览文件 @
df9be2d4
...
...
@@ -84,12 +84,9 @@ public:
begin_pad_
=
config
.
get
<
size_t
>
(
"begin_pad"
);
}
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
,
const
BufferArgs
&
inouts
)
override
{
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
)
override
{
CHECK_EQ
(
3
,
inputs
.
size
());
CHECK_EQ
(
1
,
outputs
.
size
());
CHECK_EQ
(
0
,
inouts
.
size
());
CHECK
(
outputs
[
0
].
data
()
&&
inputs
[
0
].
data
()
&&
inputs
[
2
].
data
());
CHECK_EQ
(
outputs
[
0
].
shape
().
ndims
(),
2
);
...
...
@@ -103,6 +100,7 @@ public:
/// input and output has the same batch_size
CHECK_EQ
(
inputs
[
0
].
shape
()[
0
],
outputs
[
0
].
shape
()[
0
]);
CHECK_EQ
(
outputs
[
0
].
getArgType
(),
ADD_TO
);
auto
out_mat
=
outputs
[
0
].
matrix
<
Device
>
();
auto
in_mat
=
inputs
[
0
].
matrix
<
Device
>
();
auto
w_mat
=
!
inputs
[
1
].
data
()
...
...
@@ -194,12 +192,9 @@ public:
total_pad_
=
config
.
get
<
size_t
>
(
"total_pad"
);
}
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
,
const
BufferArgs
&
inouts
)
override
{
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
)
override
{
CHECK_EQ
(
3
,
inputs
.
size
());
CHECK_EQ
(
1
,
outputs
.
size
());
CHECK_EQ
(
0
,
inouts
.
size
());
CHECK
(
outputs
[
0
].
data
()
&&
inputs
[
2
].
data
());
CHECK_EQ
(
outputs
[
0
].
shape
().
ndims
(),
2
);
...
...
@@ -214,6 +209,8 @@ public:
/// dim of output = dim of input * context_length
CHECK_EQ
(
outputs
[
0
].
shape
()[
1
],
inputs
[
0
].
shape
()[
1
]
*
context_length_
);
CHECK_EQ
(
outputs
[
0
].
getArgType
(),
ADD_TO
);
auto
out_grad_mat
=
outputs
[
0
].
matrix
<
Device
>
();
auto
in_grad_mat
=
!
inputs
[
0
].
data
()
?
typename
Tensor
<
real
,
Device
>::
Matrix
(
nullptr
,
0
,
0
)
...
...
paddle/function/CrossMapNormalOp.cpp
浏览文件 @
df9be2d4
...
...
@@ -112,6 +112,8 @@ void CrossMapNormalGrad<DEVICE_TYPE_CPU>(real* inputsGrad,
}
/**
* \brief {o_0, o_1} = calc(i_0)
*
* \param inputs[0] input value.
* \param outputs[0] output value.
* \param outputs[1] denoms.
...
...
@@ -125,17 +127,16 @@ public:
pow_
=
config
.
get
<
real
>
(
"pow"
);
}
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
,
const
BufferArgs
&
inouts
)
override
{
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
)
override
{
CHECK_EQ
(
1
,
inputs
.
size
());
CHECK_EQ
(
2
,
outputs
.
size
());
CHECK_EQ
(
0
,
inouts
.
size
());
CHECK_EQ
(
inputs
[
0
].
shape
().
ndims
(),
4
);
CHECK
(
inputs
[
0
].
shape
()
==
outputs
[
0
].
shape
());
CHECK
(
inputs
[
0
].
shape
()
==
outputs
[
1
].
shape
());
CHECK_EQ
(
outputs
[
0
].
getArgType
(),
ASSIGN_TO
);
CHECK_EQ
(
outputs
[
1
].
getArgType
(),
ASSIGN_TO
);
size_t
samples
=
inputs
[
0
].
shape
()[
0
];
size_t
channels
=
inputs
[
0
].
shape
()[
1
];
size_t
height
=
inputs
[
0
].
shape
()[
2
];
...
...
@@ -160,6 +161,8 @@ private:
};
/**
* \brief {o_0} = calc(i_0, i_1, i_2, i_3)
*
* \param inputs[0] input value.
* \param inputs[1] output value.
* \param inputs[2] output grad.
...
...
@@ -175,12 +178,9 @@ public:
pow_
=
config
.
get
<
real
>
(
"pow"
);
}
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
,
const
BufferArgs
&
inouts
)
override
{
void
calc
(
const
BufferArgs
&
inputs
,
const
BufferArgs
&
outputs
)
override
{
CHECK_EQ
(
4
,
inputs
.
size
());
CHECK_EQ
(
1
,
outputs
.
size
());
CHECK_EQ
(
0
,
inouts
.
size
());
CHECK_EQ
(
inputs
[
0
].
shape
().
ndims
(),
4
);
CHECK
(
inputs
[
0
].
shape
()
==
inputs
[
1
].
shape
());
...
...
@@ -188,6 +188,9 @@ public:
CHECK
(
inputs
[
0
].
shape
()
==
inputs
[
3
].
shape
());
CHECK
(
inputs
[
0
].
shape
()
==
outputs
[
0
].
shape
());
// TODO(hedaoyuan): need support ASSIGN_TO mode.
CHECK_EQ
(
outputs
[
0
].
getArgType
(),
ADD_TO
);
size_t
samples
=
inputs
[
0
].
shape
()[
0
];
size_t
channels
=
inputs
[
0
].
shape
()[
1
];
size_t
height
=
inputs
[
0
].
shape
()[
2
];
...
...
paddle/function/Function.cpp
浏览文件 @
df9be2d4
...
...
@@ -72,16 +72,18 @@ FuncConfig& FuncConfig::set<bool>(const std::string& key, bool v) {
return
*
this
;
}
void
BufferArgs
::
addArg
(
const
Matrix
&
arg
,
const
TensorShape
&
shape
)
{
args_
.
push_back
(
std
::
make_shared
<
BufferArg
>
(
arg
,
shape
));
void
BufferArgs
::
addArg
(
const
Matrix
&
arg
,
const
TensorShape
&
shape
,
ArgType
argType
)
{
args_
.
push_back
(
std
::
make_shared
<
BufferArg
>
(
arg
,
shape
,
argType
));
}
void
BufferArgs
::
addArg
(
const
CpuSparseMatrix
&
arg
)
{
args_
.
push_back
(
std
::
make_shared
<
SparseMatrixArg
>
(
arg
));
void
BufferArgs
::
addArg
(
const
CpuSparseMatrix
&
arg
,
ArgType
argType
)
{
args_
.
push_back
(
std
::
make_shared
<
SparseMatrixArg
>
(
arg
,
argType
));
}
void
BufferArgs
::
addArg
(
const
GpuSparseMatrix
&
arg
)
{
args_
.
push_back
(
std
::
make_shared
<
SparseMatrixArg
>
(
arg
));
void
BufferArgs
::
addArg
(
const
GpuSparseMatrix
&
arg
,
ArgType
argType
)
{
args_
.
push_back
(
std
::
make_shared
<
SparseMatrixArg
>
(
arg
,
argType
));
}
ClassRegistrar
<
FunctionBase
>
FunctionBase
::
funcRegistrar_
;
...
...
paddle/function/Function.h
浏览文件 @
df9be2d4
...
...
@@ -49,7 +49,7 @@ protected:
/**
* Argument type for Function::calc().
* A BufferArgs contains a set of BufferArg,
* because Function can have multiple inputs
, outputs and ino
uts.
* because Function can have multiple inputs
and outp
uts.
*/
class
BufferArgs
{
public:
...
...
@@ -58,9 +58,11 @@ public:
// add argument into BufferArgs
// Tensor can be Matrix, Vector, IVector.
// For inputs, do not need argType.
// For outputs, the argType needs to be specified as ASSIGN_TO or ADD_TO.
template
<
typename
Tensor
>
void
addArg
(
const
Tensor
&
arg
)
{
args_
.
push_back
(
std
::
make_shared
<
BufferArg
>
(
arg
));
void
addArg
(
const
Tensor
&
arg
,
ArgType
argType
=
UNSPECIFIED
)
{
args_
.
push_back
(
std
::
make_shared
<
BufferArg
>
(
arg
,
argType
));
}
// Add arg into BufferArgs and reshape the arg.
...
...
@@ -68,10 +70,12 @@ public:
// For example, arg represents an image buffer,
// but Matrix can only represent a two-dimensional Tensor.
// So need an extra argument to describe the shape of the image buffer.
void
addArg
(
const
Matrix
&
arg
,
const
TensorShape
&
shape
);
void
addArg
(
const
Matrix
&
arg
,
const
TensorShape
&
shape
,
ArgType
argType
=
UNSPECIFIED
);
void
addArg
(
const
CpuSparseMatrix
&
arg
);
void
addArg
(
const
GpuSparseMatrix
&
arg
);
void
addArg
(
const
CpuSparseMatrix
&
arg
,
ArgType
argType
=
UNSPECIFIED
);
void
addArg
(
const
GpuSparseMatrix
&
arg
,
ArgType
argType
=
UNSPECIFIED
);
// get argument
const
BufferArg
&
operator
[](
size_t
num
)
const
{
...
...
paddle/gserver/layers/ContextProjection.cpp
浏览文件 @
df9be2d4
...
...
@@ -122,14 +122,13 @@ void ContextProjection::forward() {
BufferArgs
inputs
;
BufferArgs
outputs
;
BufferArgs
inouts
;
inputs
.
addArg
(
*
in_
->
value
);
inputs
.
addArg
(
CpuMatrix
(
w_ptr
?
w_ptr
->
getData
()
:
nullptr
,
w_ptr
?
w_ptr
->
getHeight
()
:
0
,
input_dim
));
inputs
.
addArg
(
*
in_
->
sequenceStartPositions
->
getVector
(
useGpu_
));
outputs
.
addArg
(
*
out_
->
value
);
forward_
[
0
]
->
calc
(
inputs
,
outputs
,
inouts
);
outputs
.
addArg
(
*
out_
->
value
,
ADD_TO
);
forward_
[
0
]
->
calc
(
inputs
,
outputs
);
if
(
state_
&&
config_
.
context_start
()
<
0
)
{
CHECK_EQ
(
1
,
in_
->
getNumSequences
());
...
...
@@ -166,15 +165,14 @@ void ContextProjection::backward(const UpdateCallback& callback) {
BufferArgs
inputs
;
BufferArgs
outputs
;
BufferArgs
inouts
;
inputs
.
addArg
(
CpuMatrix
(
in_
->
grad
?
in_
->
grad
->
getData
()
:
nullptr
,
batch_size
,
input_dim
));
inputs
.
addArg
(
CpuMatrix
(
w_ptr
?
w_ptr
->
getData
()
:
nullptr
,
w_ptr
?
w_ptr
->
getHeight
()
:
0
,
input_dim
));
inputs
.
addArg
(
*
in_
->
sequenceStartPositions
->
getVector
(
useGpu_
));
outputs
.
addArg
(
*
out_
->
grad
);
backward_
[
0
]
->
calc
(
inputs
,
outputs
,
inouts
);
outputs
.
addArg
(
*
out_
->
grad
,
ADD_TO
);
backward_
[
0
]
->
calc
(
inputs
,
outputs
);
if
(
config_
.
trainable_padding
())
{
weight_
->
getParameterPtr
()
->
incUpdate
(
callback
);
...
...
paddle/gserver/layers/NormProjectionLayer.cpp
浏览文件 @
df9be2d4
...
...
@@ -59,7 +59,6 @@ bool CMRProjectionNormLayer::init(const LayerMap& layerMap,
void
CMRProjectionNormLayer
::
forward
(
PassType
passType
)
{
Layer
::
forward
(
passType
);
/* malloc memory for the output_ if necessary */
/* note: one sample correspond to one row */
MatrixPtr
input
=
inputLayers_
[
0
]
->
getOutputValue
();
...
...
@@ -67,42 +66,36 @@ void CMRProjectionNormLayer::forward(PassType passType) {
int
size
=
getSize
();
resetOutput
(
batchSize
,
size
);
MatrixPtr
outV
=
getOutputValue
();
Matrix
::
resizeOrCreate
(
denoms_
,
batchSize
,
size
,
/* trans */
false
,
useGpu_
);
shape_
=
TensorShape
({
batchSize
,
channels_
,
imgSizeH_
,
imgSizeW_
});
// prepare forward arguments
BufferArgs
inputs
;
BufferArgs
outputs
;
BufferArgs
inouts
;
inputs
.
addArg
(
*
input
,
shape_
);
outputs
.
addArg
(
*
outV
,
shape_
);
outputs
.
addArg
(
*
denoms_
,
shape_
);
inputs
.
addArg
(
*
getInputValue
(
0
),
shape_
);
outputs
.
addArg
(
*
getOutputValue
(),
shape_
,
ASSIGN_TO
);
outputs
.
addArg
(
*
denoms_
,
shape_
,
ASSIGN_TO
);
forward_
[
0
]
->
calc
(
inputs
,
outputs
,
inouts
);
forward_
[
0
]
->
calc
(
inputs
,
outputs
);
}
void
CMRProjectionNormLayer
::
backward
(
const
UpdateCallback
&
callback
)
{
(
void
)
callback
;
if
(
NULL
==
inputLayers_
[
0
]
->
getOutputGrad
(
))
{
if
(
NULL
==
getInputGrad
(
0
))
{
return
;
}
/* Do derivation */
MatrixPtr
preOutGrad
=
inputLayers_
[
0
]
->
getOutputGrad
();
MatrixPtr
localGrad
=
getOutputGrad
();
MatrixPtr
localOutV
=
getOutputValue
();
MatrixPtr
preOutV
=
inputLayers_
[
0
]
->
getOutputValue
();
// prepare backward arguments
BufferArgs
inputs
;
BufferArgs
outputs
;
BufferArgs
inouts
;
inputs
.
addArg
(
*
preOutV
,
shape_
);
inputs
.
addArg
(
*
localOutV
,
shape_
);
inputs
.
addArg
(
*
localGrad
,
shape_
);
inputs
.
addArg
(
*
getInputValue
(
0
),
shape_
);
inputs
.
addArg
(
*
getOutputValue
(),
shape_
);
inputs
.
addArg
(
*
getOutputGrad
(),
shape_
);
inputs
.
addArg
(
*
denoms_
,
shape_
);
outputs
.
addArg
(
*
preOutGrad
,
shape_
);
backward_
[
0
]
->
calc
(
inputs
,
outputs
,
inouts
);
outputs
.
addArg
(
*
getInputGrad
(
0
),
shape_
,
ADD_TO
);
backward_
[
0
]
->
calc
(
inputs
,
outputs
);
}
}
// namespace paddle
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录