Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Xiaomi
Mace
提交
27757d88
Mace
项目概览
Xiaomi
/
Mace
通知
106
Star
40
Fork
27
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Mace
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
27757d88
编写于
4月 14, 2020
作者:
B
Bin Li
提交者:
luxuhui
4月 21, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix hexagon deconv and stridedslice
上级
2895c3ee
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
43 addition
and
28 deletion
+43
-28
tools/python/transform/hexagon_converter.py
tools/python/transform/hexagon_converter.py
+43
-28
未找到文件。
tools/python/transform/hexagon_converter.py
浏览文件 @
27757d88
...
...
@@ -94,6 +94,17 @@ def get_op_and_port_from_tensor(tensor_name):
return
op
,
port
def
get_input_shape
(
tensor_name
,
model
):
producer_op_name
,
_
=
get_op_and_port_from_tensor
(
tensor_name
)
input_shape
=
None
for
producer_op
in
model
.
op
:
if
producer_op
.
name
==
producer_op_name
:
input_shape
=
producer_op
.
output_shape
[
0
].
dims
break
mace_check
(
input_shape
is
not
None
,
"Missing input shape."
)
return
input_shape
def
normalize_name
(
name
):
return
name
.
replace
(
':'
,
'_'
)
...
...
@@ -471,27 +482,37 @@ class HexagonConverter(base_converter.ConverterInterface):
ConverterUtil
.
get_arg
(
op
,
MaceKeyword
.
mace_padding_type_str
)
mace_check
(
padding_type_arg
is
not
None
,
"Missing padding of Deconv."
)
padding_type
=
PaddingMode
(
padding_type_arg
.
i
)
strides_arg
=
ConverterUtil
.
get_arg
(
op
,
MaceKeyword
.
mace_strides_str
)
mace_check
(
strides_arg
is
not
None
,
"Missing strides of Deconv."
)
stride_h
=
strides_arg
.
ints
[
0
]
stride_w
=
strides_arg
.
ints
[
1
]
input_shape
=
get_input_shape
(
op
.
input
[
0
],
self
.
_model
)
input_h
=
input_shape
[
1
]
input_w
=
input_shape
[
2
]
filter_tensor
=
self
.
_consts
[
op
.
input
[
1
]]
filter_height
=
filter_tensor
.
dims
[
1
]
filter_width
=
filter_tensor
.
dims
[
2
]
filter_h
=
filter_tensor
.
dims
[
1
]
filter_w
=
filter_tensor
.
dims
[
2
]
output_h
=
op
.
output_shape
[
0
].
dims
[
1
]
output_w
=
op
.
output_shape
[
0
].
dims
[
2
]
if
padding_type
==
PaddingMode
.
VALID
:
paddings
=
[
0
,
0
,
0
,
0
]
expected_input_h
=
(
output_h
-
filter_h
+
stride_h
)
//
stride_h
expected_input_w
=
(
output_w
-
filter_w
+
stride_w
)
//
stride_w
elif
padding_type
==
PaddingMode
.
SAME
:
pad_height
,
pad_width
=
filter_height
//
2
,
filter_width
//
2
paddings
=
[
pad_height
,
pad_height
,
pad_width
,
pad_width
]
expected_input_h
=
(
output_h
+
stride_h
-
1
)
//
stride_h
expected_input_w
=
(
output_w
+
stride_w
-
1
)
//
stride_w
else
:
raise
Exception
(
'Hexagon deconv does not support padding type: '
,
padding_type
)
mace_check
(
expected_input_h
==
input_h
,
"Wrong input/output height"
)
mace_check
(
expected_input_w
==
input_w
,
"Wrong input/output width"
)
padding_tensor
=
self
.
_model
.
tensors
.
add
()
padding_tensor
.
name
=
op
.
name
+
"/paddings:0"
padding_tensor
.
data_type
=
mace_pb2
.
DT_INT32
padding_tensor
.
dims
.
extend
([
1
,
1
,
2
,
2
])
padding_tensor
.
int32_data
.
extend
(
paddings
)
self
.
_consts
[
padding_tensor
.
name
]
=
padding_tensor
op
.
input
.
append
(
padding_tensor
.
name
)
pad_h
=
(
input_h
-
1
)
*
stride_h
+
filter_h
-
output_h
pad_w
=
(
input_w
-
1
)
*
stride_w
+
filter_w
-
output_w
pad_h
,
pad_w
=
max
(
pad_h
,
0
),
max
(
pad_w
,
0
)
paddings
=
[
pad_h
,
pad_h
,
pad_w
,
pad_w
]
self
.
add_arg_const_node
(
op
,
"/paddings:0"
,
[
1
,
1
,
2
,
2
],
paddings
)
def
convert_deconv2d
(
self
,
op
):
channels
=
op
.
output_shape
[
0
].
dims
[
3
]
...
...
@@ -549,7 +570,7 @@ class HexagonConverter(base_converter.ConverterInterface):
if
len
(
op
.
input
)
==
1
:
scalar_input_arg
=
ConverterUtil
.
get_arg
(
op
,
MaceKeyword
.
mace_scalar_input_str
)
self
.
add_scalar_const_node
(
"/b:0"
,
scalar_input_arg
.
i
,
op
)
self
.
add_scalar_const_node
(
"/b:0"
,
scalar_input_arg
.
f
,
op
)
self
.
add_min_max_const_node
(
op
,
op
.
input
[
0
])
self
.
add_min_max_const_node
(
op
,
op
.
input
[
1
])
...
...
@@ -631,18 +652,12 @@ class HexagonConverter(base_converter.ConverterInterface):
for
i
in
axis_arg
.
ints
:
mace_check
(
1
<=
i
<=
2
,
"Hexagon Reduce Mean only supports spatial now"
)
producer_op_name
,
_
=
get_op_and_port_from_tensor
(
op
.
input
[
0
])
input_dims
=
None
for
producer_op
in
self
.
_model
.
op
:
if
producer_op
.
name
==
producer_op_name
:
input_dims
=
producer_op
.
output_shape
[
0
].
dims
break
mace_check
(
input_dims
is
not
None
,
"Missing input shape."
)
input_shape
=
get_input_shape
(
op
.
input
[
0
],
self
.
_model
)
if
len
(
axis_arg
.
ints
)
==
1
:
dim1
,
dim2
=
(
input_
dims
[
1
],
1
)
\
if
axis_arg
.
ints
[
0
]
==
1
else
(
1
,
input_
dims
[
2
])
dim1
,
dim2
=
(
input_
shape
[
1
],
1
)
\
if
axis_arg
.
ints
[
0
]
==
1
else
(
1
,
input_
shape
[
2
])
else
:
dim1
,
dim2
=
input_
dims
[
1
],
input_dims
[
2
]
dim1
,
dim2
=
input_
shape
[
1
],
input_shape
[
2
]
self
.
add_arg_const_node
(
op
,
'/window:0'
,
[
1
,
dim1
,
dim2
,
1
])
self
.
add_arg_const_node
(
op
,
'/strides:0'
,
[
1
,
dim1
,
dim2
,
1
])
...
...
@@ -669,15 +684,15 @@ class HexagonConverter(base_converter.ConverterInterface):
op
.
type
=
HexagonOp
.
QuantizedSoftmax_8
.
name
def
convert_stridedslice
(
self
,
op
):
be
i
gin_mask
=
ConverterUtil
.
get_arg
(
begin_mask
=
ConverterUtil
.
get_arg
(
op
,
MaceKeyword
.
mace_begin_mask_str
).
i
end_mask
=
ConverterUtil
.
get_arg
(
op
,
MaceKeyword
.
mace_end_mask_str
).
i
shrink_mask
=
ConverterUtil
.
get_arg
(
op
,
MaceKeyword
.
mace_shrink_axis_mask_str
).
i
self
.
add_
scalar_const_node
(
"/begin_mask:0"
,
beigin_mask
,
op
)
self
.
add_
scalar_const_node
(
"/end_mask:0"
,
end_mask
,
op
)
self
.
add_
scalar_const_node
(
"/shrink_mask:0"
,
shrink_mask
,
op
)
self
.
add_
arg_const_node
(
op
,
"/begin_mask:0"
,
[
1
],
[
begin_mask
]
)
self
.
add_
arg_const_node
(
op
,
"/end_mask:0"
,
[
1
],
[
end_mask
]
)
self
.
add_
arg_const_node
(
op
,
"/shrink_mask:0"
,
[
1
],
[
shrink_mask
]
)
self
.
add_min_max_const_node
(
op
,
op
.
input
[
0
])
op
.
type
=
HexagonOp
.
QuantizedStridedSlice_8
.
name
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录