Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle-Lite
提交
42bc56d2
P
Paddle-Lite
项目概览
PaddlePaddle
/
Paddle-Lite
通知
331
Star
4
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
271
列表
看板
标记
里程碑
合并请求
78
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle-Lite
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
271
Issue
271
列表
看板
标记
里程碑
合并请求
78
合并请求
78
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
42bc56d2
编写于
10月 23, 2018
作者:
R
Ray Liu
提交者:
GitHub
10月 23, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' into develop
上级
896f10f9
407517b2
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
479 addition
and
0 deletion
+479
-0
src/common/types.cpp
src/common/types.cpp
+2
-0
src/framework/data_type.cpp
src/framework/data_type.cpp
+107
-0
src/framework/data_type.h
src/framework/data_type.h
+77
-0
src/framework/load_ops.h
src/framework/load_ops.h
+3
-0
src/operators/fill_constant_op.cpp
src/operators/fill_constant_op.cpp
+30
-0
src/operators/fill_constant_op.h
src/operators/fill_constant_op.h
+81
-0
src/operators/math/math_function.cpp
src/operators/math/math_function.cpp
+19
-0
src/operators/math/math_function.h
src/operators/math/math_function.h
+2
-0
src/operators/op_param.h
src/operators/op_param.h
+36
-0
test/CMakeLists.txt
test/CMakeLists.txt
+4
-0
test/operators/test_fill_constant_op.cpp
test/operators/test_fill_constant_op.cpp
+113
-0
tools/op.cmake
tools/op.cmake
+5
-0
未找到文件。
src/common/types.cpp
浏览文件 @
42bc56d2
...
...
@@ -22,6 +22,7 @@ const char *G_OP_TYPE_BATCHNORM = "batch_norm";
const
char
*
G_OP_TYPE_BOX_CODER
=
"box_coder"
;
const
char
*
G_OP_TYPE_CONCAT
=
"concat"
;
const
char
*
G_OP_TYPE_ELEMENTWISE_ADD
=
"elementwise_add"
;
const
char
*
G_OP_TYPE_FILL_CONSTANT
=
"fill_constant"
;
const
char
*
G_OP_TYPE_FUSION_CONV_ADD_RELU
=
"fusion_conv_add_relu"
;
const
char
*
G_OP_TYPE_FUSION_CONV_ADD_PRELU
=
"fusion_conv_add_prelu"
;
const
char
*
G_OP_TYPE_FUSION_CONV_ADD_ADD_PRELU
=
"fusion_conv_add_add_prelu"
;
...
...
@@ -99,6 +100,7 @@ std::unordered_map<
{
G_OP_TYPE_FC
,
{{
"X"
,
"Y"
,
"Z"
},
{
"Out"
}}},
{
G_OP_TYPE_RESHAPE
,
{{
"X"
},
{
"Out"
}}},
{
G_OP_TYPE_DEPTHWISE_CONV
,
{{
"Input"
},
{
"Output"
}}},
{
G_OP_TYPE_FILL_CONSTANT
,
{{},
{
"Out"
}}},
{
G_OP_TYPE_FUSION_CONV_ADD_RELU
,
{{
"Input"
},
{
"Out"
}}},
{
G_OP_TYPE_FUSION_CONV_ADD_PRELU
,
{{
"Input"
},
{
"Out"
}}},
{
G_OP_TYPE_FUSION_CONV_ADD_ADD_PRELU
,
{{
"Input"
},
{
"Out"
}}},
...
...
src/framework/data_type.cpp
0 → 100644
浏览文件 @
42bc56d2
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#include "framework/data_type.h"
#include <stdint.h>
#include <string>
#include <unordered_map>
namespace
paddle_mobile
{
namespace
framework
{
struct
DataTypeMap
{
std
::
unordered_map
<
std
::
type_index
,
_PaddleMobile__Framework__Proto__VarType__Type
>
cpp_to_proto_
;
std
::
unordered_map
<
int
,
std
::
type_index
>
proto_to_cpp_
;
std
::
unordered_map
<
int
,
std
::
string
>
proto_to_str_
;
std
::
unordered_map
<
std
::
type_index
,
size_t
>
cpp_to_size_
;
};
static
DataTypeMap
*
InitDataTypeMap
();
// C++11 removes the need for manual locking. Concurrent execution shall wait if
// a static local variable is already being initialized.
// https://stackoverflow.com/questions/11711920/how-to-implement-multithread-safe-singleton-in-c11-without-using-mutex
static
DataTypeMap
&
gDataTypeMap
()
{
static
DataTypeMap
*
g_data_type_map_
=
InitDataTypeMap
();
return
*
g_data_type_map_
;
}
template
<
typename
T
>
static
inline
void
RegisterType
(
DataTypeMap
*
map
,
_PaddleMobile__Framework__Proto__VarType__Type
proto_type
,
const
std
::
string
&
name
)
{
map
->
proto_to_cpp_
.
emplace
(
static_cast
<
int
>
(
proto_type
),
typeid
(
T
));
map
->
cpp_to_proto_
.
emplace
(
typeid
(
T
),
proto_type
);
map
->
proto_to_str_
.
emplace
(
static_cast
<
int
>
(
proto_type
),
name
);
map
->
cpp_to_size_
.
emplace
(
typeid
(
T
),
sizeof
(
T
));
}
static
DataTypeMap
*
InitDataTypeMap
()
{
auto
retv
=
new
DataTypeMap
();
#define RegType(cc_type, proto_type) \
RegisterType<cc_type>(retv, proto_type, #cc_type)
// NOTE: Add your customize type here.
// RegType(float16, PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__FP16);
RegType
(
float
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__FP32
);
RegType
(
double
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__FP64
);
RegType
(
int
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT32
);
RegType
(
int64_t
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT64
);
RegType
(
bool
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__BOOL
);
RegType
(
size_t
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__SIZE_T
);
RegType
(
int16_t
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT16
);
RegType
(
uint8_t
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__UINT8
);
RegType
(
int8_t
,
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT8
);
#undef RegType
return
retv
;
}
_PaddleMobile__Framework__Proto__VarType__Type
ToDataType
(
std
::
type_index
type
)
{
auto
it
=
gDataTypeMap
().
cpp_to_proto_
.
find
(
type
);
if
(
it
!=
gDataTypeMap
().
cpp_to_proto_
.
end
())
{
return
it
->
second
;
}
PADDLE_MOBILE_THROW_EXCEPTION
(
"Not support %s as tensor type"
,
type
.
name
());
}
std
::
type_index
ToTypeIndex
(
_PaddleMobile__Framework__Proto__VarType__Type
type
)
{
auto
it
=
gDataTypeMap
().
proto_to_cpp_
.
find
(
static_cast
<
int
>
(
type
));
if
(
it
!=
gDataTypeMap
().
proto_to_cpp_
.
end
())
{
return
it
->
second
;
}
PADDLE_MOBILE_THROW_EXCEPTION
(
"Not support _PaddleMobile__Framework__Proto__VarType__Type(%d) as "
"tensor type"
,
static_cast
<
int
>
(
type
));
}
std
::
string
DataTypeToString
(
const
_PaddleMobile__Framework__Proto__VarType__Type
type
)
{
auto
it
=
gDataTypeMap
().
proto_to_str_
.
find
(
static_cast
<
int
>
(
type
));
if
(
it
!=
gDataTypeMap
().
proto_to_str_
.
end
())
{
return
it
->
second
;
}
PADDLE_MOBILE_THROW_EXCEPTION
(
"Not support _PaddleMobile__Framework__Proto__VarType__Type(%d) as "
"tensor type"
,
static_cast
<
int
>
(
type
));
}
}
// namespace framework
}
// namespace paddle_mobile
src/framework/data_type.h
0 → 100644
浏览文件 @
42bc56d2
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#pragma once
#include <string>
#include <typeindex>
#include "common/enforce.h"
#include "framework/framework.pb-c.h"
namespace
paddle_mobile
{
namespace
framework
{
extern
_PaddleMobile__Framework__Proto__VarType__Type
ToDataType
(
std
::
type_index
type
);
extern
std
::
type_index
ToTypeIndex
(
_PaddleMobile__Framework__Proto__VarType__Type
type
);
template
<
typename
Visitor
>
inline
void
VisitDataType
(
_PaddleMobile__Framework__Proto__VarType__Type
type
,
Visitor
visitor
)
{
switch
(
type
)
{
// case PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__FP16:
// visitor.template apply<float16>();
// break;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__FP32
:
visitor
.
template
apply
<
float
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__FP64
:
visitor
.
template
apply
<
double
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT32
:
visitor
.
template
apply
<
int
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT64
:
visitor
.
template
apply
<
int64_t
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__BOOL
:
visitor
.
template
apply
<
bool
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__UINT8
:
visitor
.
template
apply
<
uint8_t
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT16
:
visitor
.
template
apply
<
int16_t
>();
break
;
case
PADDLE_MOBILE__FRAMEWORK__PROTO__VAR_TYPE__TYPE__INT8
:
visitor
.
template
apply
<
int8_t
>();
break
;
default:
PADDLE_MOBILE_THROW_EXCEPTION
(
"Not supported %d"
,
type
);
}
}
extern
std
::
string
DataTypeToString
(
const
_PaddleMobile__Framework__Proto__VarType__Type
type
);
inline
std
::
ostream
&
operator
<<
(
std
::
ostream
&
out
,
const
_PaddleMobile__Framework__Proto__VarType__Type
&
type
)
{
out
<<
DataTypeToString
(
type
);
return
out
;
}
}
// namespace framework
}
// namespace paddle_mobile
src/framework/load_ops.h
浏览文件 @
42bc56d2
...
...
@@ -64,6 +64,9 @@ limitations under the License. */
// load requared ops
LOAD_OP
(
feed
)
LOAD_OP
(
fetch
)
#ifdef FILL_CONSTANT_OP
LOAD_OP
(
fill_constant
)
#endif
#ifdef BATCHNORM_OP
LOAD_OP2
(
batch_norm
,
CPU
,
MALI_GPU
);
#endif
...
...
src/operators/fill_constant_op.cpp
0 → 100644
浏览文件 @
42bc56d2
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#ifdef FILL_CONSTANT_OP
#include "operators/fill_constant_op.h"
namespace
ops
=
paddle_mobile
::
operators
;
#ifdef PADDLE_MOBILE_CPU
REGISTER_OPERATOR_CPU
(
fill_constant
,
ops
::
FillConstantOp
);
#endif
#ifdef PADDLE_MOBILE_MALI_GPU
REGISTER_OPERATOR_MALI_GPU
(
fill_constant
,
ops
::
FillConstantOp
);
#endif
#ifdef PADDLE_MOBILE_FPGA
REGISTER_OPERATOR_FPGA
(
fill_constant
,
ops
::
FillConstantOp
);
#endif
#endif
src/operators/fill_constant_op.h
0 → 100644
浏览文件 @
42bc56d2
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#ifdef FILL_CONSTANT_OP
#pragma once
#include <string>
#include "framework/data_type.h"
#include "framework/operator.h"
#include "framework/selected_rows.h"
#include "operators/math/math_function.h"
#include "operators/op_param.h"
namespace
paddle_mobile
{
namespace
operators
{
using
std
::
string
;
template
<
typename
DeviceType
,
typename
T
>
class
FillConstantOp
:
public
framework
::
OperatorBase
<
DeviceType
>
{
public:
FillConstantOp
(
const
string
&
type
,
const
VariableNameMap
&
inputs
,
const
VariableNameMap
&
outputs
,
const
framework
::
AttributeMap
attrs
,
std
::
shared_ptr
<
framework
::
Scope
>
scope
)
:
framework
::
OperatorBase
<
DeviceType
>
(
type
,
inputs
,
outputs
,
attrs
,
scope
),
param_
(
inputs
,
outputs
,
attrs
,
*
scope
)
{}
void
RunImpl
()
const
{
auto
data_type
=
static_cast
<
_PaddleMobile__Framework__Proto__VarType__Type
>
(
param_
.
DataDtype
());
framework
::
Tensor
*
tensor
=
nullptr
;
auto
value
=
param_
.
Value
();
auto
*
outvar
=
param_
.
OutVar
();
if
(
outvar
->
template
IsType
<
framework
::
LoDTensor
>())
{
tensor
=
outvar
->
template
GetMutable
<
framework
::
LoDTensor
>();
}
else
if
(
outvar
->
template
IsType
<
framework
::
SelectedRows
>())
{
tensor
=
outvar
->
template
GetMutable
<
framework
::
SelectedRows
>()
->
mutable_value
();
}
else
{
PADDLE_MOBILE_THROW_EXCEPTION
(
"fill constant op's output only"
"supports SelectedRows and LoDTensor"
);
}
tensor
->
Resize
(
framework
::
make_ddim
(
param_
.
Shape
()));
tensor
->
mutable_data
(
framework
::
ToTypeIndex
(
data_type
));
math
::
set_constant
(
tensor
,
value
);
}
void
Init
()
{}
void
InferShape
()
const
{
PADDLE_MOBILE_ENFORCE
(
param_
.
Out
()
!=
nullptr
,
"Output (Out) of fill_constant op should not be null."
);
framework
::
DDim
ddim
=
framework
::
make_ddim
(
param_
.
Shape
());
param_
.
Out
()
->
Resize
(
ddim
);
}
protected:
FillConstantParam
<
DeviceType
>
param_
;
};
}
// namespace operators
}
// namespace paddle_mobile
#endif
src/operators/math/math_function.cpp
浏览文件 @
42bc56d2
...
...
@@ -15,12 +15,31 @@ limitations under the License. */
#include "operators/math/math_function.h"
#include <cstring>
#include <string>
#include "framework/data_type.h"
#include "framework/tensor.h"
#include "operators/math/gemm.h"
namespace
paddle_mobile
{
namespace
operators
{
namespace
math
{
struct
TensorSetConstant
{
TensorSetConstant
(
framework
::
Tensor
*
tensor
,
float
value
)
:
tensor_
(
tensor
),
value_
(
value
)
{}
template
<
typename
T
>
void
apply
()
const
{
auto
*
begin
=
tensor_
->
mutable_data
<
T
>
();
std
::
fill
(
begin
,
begin
+
tensor_
->
numel
(),
static_cast
<
T
>
(
value_
));
}
framework
::
Tensor
*
tensor_
;
float
value_
;
};
void
set_constant
(
framework
::
Tensor
*
tensor
,
float
value
)
{
framework
::
VisitDataType
(
framework
::
ToDataType
(
tensor
->
type
()),
TensorSetConstant
(
tensor
,
value
));
}
template
<
>
void
matmul
<
float
>
(
const
framework
::
Tensor
&
matrix_a
,
bool
trans_a
,
const
framework
::
Tensor
&
matrix_b
,
bool
trans_b
,
float
alpha
,
...
...
src/operators/math/math_function.h
浏览文件 @
42bc56d2
...
...
@@ -22,6 +22,8 @@ namespace paddle_mobile {
namespace
operators
{
namespace
math
{
void
set_constant
(
framework
::
Tensor
*
tensor
,
float
value
);
template
<
typename
T
>
void
matmul
(
const
framework
::
Tensor
&
matrix_a
,
bool
trans_a
,
const
framework
::
Tensor
&
matrix_b
,
bool
trans_b
,
T
alpha
,
...
...
src/operators/op_param.h
浏览文件 @
42bc56d2
...
...
@@ -1063,6 +1063,42 @@ class FetchParam : public OpParam {
RType
*
out_
;
};
#ifdef FILL_CONSTANT_OP
template
<
typename
Dtype
>
class
FillConstantParam
:
public
OpParam
{
typedef
typename
DtypeTensorTrait
<
Dtype
>::
gtype
GType
;
typedef
typename
DtypeTensorTrait
<
Dtype
>::
rtype
RType
;
public:
FillConstantParam
(
const
VariableNameMap
&
inputs
,
const
VariableNameMap
&
outputs
,
const
AttributeMap
&
attrs
,
const
Scope
&
scope
)
{
out_var_
=
OutVarFrom
(
outputs
,
scope
);
out_
=
OutFrom
<
GType
>
(
outputs
,
scope
);
dtype_
=
GetAttr
<
int
>
(
"dtype"
,
attrs
);
shape_
=
GetAttr
<
vector
<
int
>>
(
"shape"
,
attrs
);
value_
=
GetAttr
<
float
>
(
"value"
,
attrs
);
}
Variable
*
OutVar
()
const
{
return
out_var_
;
}
RType
*
Out
()
const
{
return
out_
;
}
const
int
&
DataDtype
()
const
{
return
dtype_
;
}
const
vector
<
int
>
&
Shape
()
const
{
return
shape_
;
}
const
float
&
Value
()
const
{
return
value_
;
}
private:
Variable
*
out_var_
;
RType
*
out_
;
int
dtype_
;
vector
<
int
>
shape_
;
float
value_
;
};
#endif
#ifdef TRANSPOSE_OP
template
<
typename
Dtype
>
class
TransposeParam
:
public
OpParam
{
...
...
test/CMakeLists.txt
浏览文件 @
42bc56d2
...
...
@@ -185,6 +185,10 @@ if (NOT FOUND_MATCH)
ADD_EXECUTABLE
(
test-polygon-box-transform-op operators/test_polygon_box_transform_op.cpp test_helper.h test_include.h
)
target_link_libraries
(
test-polygon-box-transform-op paddle-mobile
)
# gen test
ADD_EXECUTABLE
(
test-fill-constant-op operators/test_fill_constant_op.cpp test_helper.h test_include.h
)
target_link_libraries
(
test-fill-constant-op paddle-mobile
)
# gen test
ADD_EXECUTABLE
(
test-reshape-op operators/test_reshape_op.cpp test_helper.h test_include.h
)
target_link_libraries
(
test-reshape-op paddle-mobile
)
...
...
test/operators/test_fill_constant_op.cpp
0 → 100644
浏览文件 @
42bc56d2
/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */
#pragma once
#include "../test_include.h"
#include "operators/fill_constant_op.h"
namespace
paddle_mobile
{
namespace
framework
{
template
<
typename
Dtype
>
class
TestFillConstantOp
{
public:
explicit
TestFillConstantOp
(
const
Program
<
Dtype
>
p
)
:
program_
(
p
)
{
if
(
use_optimize_
)
{
to_predict_program_
=
program_
.
optimizeProgram
;
}
else
{
to_predict_program_
=
program_
.
originProgram
;
}
const
std
::
vector
<
std
::
shared_ptr
<
BlockDesc
>>
blocks
=
to_predict_program_
->
Blocks
();
for
(
auto
block_desc
:
blocks
)
{
std
::
vector
<
std
::
shared_ptr
<
OpDesc
>>
ops
=
block_desc
->
Ops
();
for
(
auto
op
:
ops
)
{
if
(
op
->
Type
()
==
"fill_constant"
)
{
DLOG
<<
" attr size: "
<<
op
->
GetAttrMap
().
size
();
std
::
unordered_map
<
std
::
string
,
Attribute
>
attrs
=
op
->
GetAttrMap
();
for
(
std
::
unordered_map
<
std
::
string
,
Attribute
>::
iterator
it
=
attrs
.
begin
();
it
!=
attrs
.
end
();
++
it
)
{
DLOG
<<
" "
<<
it
->
first
<<
" "
<<
it
->
second
;
}
DLOG
<<
" inputs size: "
<<
op
->
GetInputs
().
size
();
DLOG
<<
" outputs size: "
<<
op
->
GetOutputs
().
size
();
DLOG
<<
" output is : "
<<
op
->
Output
(
"Out"
)[
0
];
output_var_name
=
op
->
Output
(
"Out"
)[
0
];
std
::
shared_ptr
<
operators
::
FillConstantOp
<
Dtype
,
float
>>
op_ptr
=
std
::
make_shared
<
operators
::
FillConstantOp
<
Dtype
,
float
>>
(
op
->
Type
(),
op
->
GetInputs
(),
op
->
GetOutputs
(),
op
->
GetAttrMap
(),
program_
.
scope
);
ops_of_block_
[
*
block_desc
.
get
()].
push_back
(
op_ptr
);
}
}
}
}
std
::
shared_ptr
<
Tensor
>
predict
()
{
auto
scope
=
program_
.
scope
;
Variable
*
output
=
scope
->
Var
(
output_var_name
);
auto
*
output_tensor
=
output
->
GetMutable
<
LoDTensor
>
();
std
::
shared_ptr
<
Tensor
>
out_tensor
=
std
::
make_shared
<
LoDTensor
>
();
out_tensor
.
reset
(
output_tensor
);
predict
(
0
);
return
out_tensor
;
}
private:
const
framework
::
Program
<
Dtype
>
program_
;
std
::
shared_ptr
<
ProgramDesc
>
to_predict_program_
;
std
::
map
<
framework
::
BlockDesc
,
std
::
vector
<
std
::
shared_ptr
<
OperatorBase
<
Dtype
>>>>
ops_of_block_
;
bool
use_optimize_
=
false
;
string
output_var_name
;
void
predict
(
int
block_id
)
{
std
::
shared_ptr
<
BlockDesc
>
to_predict_block
=
to_predict_program_
->
Block
(
block_id
);
for
(
int
j
=
0
;
j
<
ops_of_block_
[
*
to_predict_block
.
get
()].
size
();
++
j
)
{
auto
op
=
ops_of_block_
[
*
to_predict_block
.
get
()][
j
];
op
->
Run
();
}
}
};
template
class
TestFillConstantOp
<
CPU
>;
}
// namespace framework
}
// namespace paddle_mobile
int
main
()
{
DLOG
<<
"----------**********----------"
;
DLOG
<<
"begin to run FillConstant Test"
;
paddle_mobile
::
Loader
<
paddle_mobile
::
CPU
>
loader
;
auto
program
=
loader
.
Load
(
std
::
string
(
g_ocr
)
+
"/model"
,
std
::
string
(
g_ocr
)
+
"/params"
);
paddle_mobile
::
framework
::
TestFillConstantOp
<
paddle_mobile
::
CPU
>
testFillConstantOp
(
program
);
auto
output
=
testFillConstantOp
.
predict
();
auto
*
output_ptr
=
output
->
data
<
float
>
();
DLOG
<<
"output : "
;
for
(
int
i
=
0
;
i
<
output
->
numel
();
++
i
)
{
DLOG
<<
" index "
<<
i
<<
" : "
<<
output_ptr
[
i
];
}
return
0
;
}
tools/op.cmake
浏览文件 @
42bc56d2
...
...
@@ -188,6 +188,7 @@ if(NOT FOUND_MATCH)
set
(
ELEMENTWISEADD_OP ON
)
set
(
ELEMENTWISESUB_OP ON
)
set
(
IM2SEQUENCE_OP ON
)
set
(
FILL_CONSTANT_OP ON
)
set
(
FUSION_CONVADD_OP ON
)
set
(
FUSION_CONVADDPRELU_OP ON
)
set
(
FUSION_CONVADDRELU_OP ON
)
...
...
@@ -233,6 +234,7 @@ endif()
# option(CONV_OP "" ON)
# option(DEPTHWISECONV_OP "" ON)
# option(ELEMENTWISEADD_OP "" ON)
# option(FILL_CONSTANT_OP "" ON)
# option(FUSION_CONVADD_OP "" ON)
# option(FUSION_CONVADDRELU_OP "" ON)
# option(FUSION_FC_OP "" ON)
...
...
@@ -270,6 +272,9 @@ endif()
if
(
ELEMENTWISESUB_OP
)
add_definitions
(
-DELEMENTWISESUB_OP
)
endif
()
if
(
FILL_CONSTANT_OP
)
add_definitions
(
-DFILL_CONSTANT_OP
)
endif
()
if
(
FUSION_CONVADD_OP
)
add_definitions
(
-DFUSION_CONVADD_OP
)
endif
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录