Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSlim
提交
9fdb6054
P
PaddleSlim
项目概览
PaddlePaddle
/
PaddleSlim
大约 1 年 前同步成功
通知
51
Star
1434
Fork
344
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
53
列表
看板
标记
里程碑
合并请求
16
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleSlim
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
53
Issue
53
列表
看板
标记
里程碑
合并请求
16
合并请求
16
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
9fdb6054
编写于
11月 11, 2019
作者:
C
ceci3
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add multi search_space support
上级
af0eb732
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
118 addition
and
26 deletion
+118
-26
paddleslim/nas/search_space/combine_search_space.py
paddleslim/nas/search_space/combine_search_space.py
+94
-0
paddleslim/nas/search_space/mobilenetv2.py
paddleslim/nas/search_space/mobilenetv2.py
+18
-13
paddleslim/nas/search_space/search_space_base.py
paddleslim/nas/search_space/search_space_base.py
+1
-1
paddleslim/nas/search_space/search_space_factory.py
paddleslim/nas/search_space/search_space_factory.py
+5
-12
未找到文件。
paddleslim/nas/search_space/combine_search_space.py
0 → 100644
浏览文件 @
9fdb6054
# Copyright (c) 2019 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.
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
numpy
as
np
import
paddle.fluid
as
fluid
from
paddle.fluid.param_attr
import
ParamAttr
from
.search_space_base
import
SearchSpaceBase
from
.search_space_registry
import
SEARCHSPACE
from
.base_layer
import
conv_bn_layer
__all__
=
[
"CombineSearchSpace"
]
class
CombineSearchSpace
(
object
):
"""
Combine Search Space.
Args:
configs(list<tuple>): multi config.
"""
def
__init__
(
self
,
config_lists
):
self
.
lens
=
len
(
config_lists
)
self
.
spaces
=
[]
for
config_list
in
config_lists
:
key
,
config
=
config_list
self
.
spaces
.
append
(
self
.
_get_single_search_space
(
key
,
config
))
def
_get_single_search_space
(
self
,
key
,
config
):
"""
get specific model space based on key and config.
Args:
key(str): model space name.
config(dict): basic config information.
return:
model space(class)
"""
cls
=
SEARCHSPACE
.
get
(
key
)
space
=
cls
(
config
[
'input_size'
],
config
[
'output_size'
],
config
[
'block_num'
])
return
space
def
init_tokens
(
self
):
"""
Combine init tokens.
"""
tokens
=
[]
self
.
token
=
[]
for
space
in
self
.
spaces
:
tokens
.
extend
(
space
.
init_tokens
())
self
.
token
.
append
(
space
.
init_tokens
())
return
tokens
def
range_table
(
self
):
"""
Combine range table.
"""
range_tables
=
[]
for
space
in
self
.
spaces
:
range_tables
.
extend
(
space
.
range_table
())
return
range_tables
def
token2arch
(
self
,
tokens
=
None
):
"""
Combine model arch
"""
if
tokens
is
None
:
self
.
init_tokens
()
model_archs
=
[]
for
space
,
token
in
zip
(
self
.
spaces
,
self
.
token
):
model_archs
.
append
(
space
.
token2arch
(
token
))
def
net_arch
(
input
):
for
model_arch
in
model_archs
:
input
=
model_arch
(
input
)
return
input
return
net_arch
paddleslim/nas/search_space/mobilenetv2.py
浏览文件 @
9fdb6054
...
...
@@ -52,6 +52,7 @@ class MobileNetV2Space(SearchSpaceBase):
self
.
scale
=
scale
self
.
class_dim
=
class_dim
def
init_tokens
(
self
):
"""
The initial token send to controller.
...
...
@@ -60,7 +61,7 @@ class MobileNetV2Space(SearchSpaceBase):
"""
# original MobileNetV2
# yapf: disable
return
[
4
,
# 1, 16, 1
init_token_base
=
[
4
,
# 1, 16, 1
4
,
5
,
1
,
0
,
# 6, 24, 1
4
,
5
,
1
,
0
,
# 6, 24, 2
4
,
4
,
2
,
0
,
# 6, 32, 3
...
...
@@ -69,6 +70,7 @@ class MobileNetV2Space(SearchSpaceBase):
4
,
7
,
2
,
0
,
# 6, 160, 3
4
,
9
,
0
,
0
]
# 6, 320, 1
# yapf: enable
return
init_token_base
#[:self.tokens_lens]
def
range_table
(
self
):
"""
...
...
@@ -76,7 +78,7 @@ class MobileNetV2Space(SearchSpaceBase):
"""
# head_num + 7 * [multiple(expansion_factor), filter_num, repeat, kernel_size]
# yapf: disable
r
eturn
[
7
,
r
ange_table_base
=
[
7
,
5
,
8
,
6
,
2
,
5
,
8
,
6
,
2
,
5
,
8
,
6
,
2
,
...
...
@@ -85,6 +87,7 @@ class MobileNetV2Space(SearchSpaceBase):
5
,
10
,
6
,
2
,
5
,
12
,
6
,
2
]
# yapf: enable
return
range_table_base
#[:self.tokens_lens]
def
token2arch
(
self
,
tokens
=
None
):
"""
...
...
@@ -127,6 +130,8 @@ class MobileNetV2Space(SearchSpaceBase):
else
:
break
self
.
tokens_lens
=
1
+
(
len
(
bottleneck_params_list
)
-
1
)
*
4
def
net_arch
(
input
):
#conv1
# all padding is 'SAME' in the conv2d, can compute the actual padding automatic.
...
...
@@ -137,7 +142,7 @@ class MobileNetV2Space(SearchSpaceBase):
stride
=
2
,
padding
=
'SAME'
,
act
=
'relu6'
,
name
=
'conv1_1'
)
name
=
'
mobilenetv2_
conv1_1'
)
# bottleneck sequences
i
=
1
...
...
@@ -145,7 +150,7 @@ class MobileNetV2Space(SearchSpaceBase):
for
layer_setting
in
bottleneck_params_list
:
t
,
c
,
n
,
s
,
k
=
layer_setting
i
+=
1
input
=
self
.
invresi_blocks
(
input
=
self
.
_
invresi_blocks
(
input
=
input
,
in_c
=
in_c
,
t
=
t
,
...
...
@@ -153,7 +158,7 @@ class MobileNetV2Space(SearchSpaceBase):
n
=
n
,
s
=
s
,
k
=
k
,
name
=
'conv'
+
str
(
i
))
name
=
'
mobilenetv2_
conv'
+
str
(
i
))
in_c
=
int
(
c
*
self
.
scale
)
# if output_size is 1, add fc layer in the end
...
...
@@ -161,8 +166,8 @@ class MobileNetV2Space(SearchSpaceBase):
input
=
fluid
.
layers
.
fc
(
input
=
input
,
size
=
self
.
class_dim
,
param_attr
=
ParamAttr
(
name
=
'
fc10
_weights'
),
bias_attr
=
ParamAttr
(
name
=
'
fc10
_offset'
))
param_attr
=
ParamAttr
(
name
=
'
mobilenetv2_fc
_weights'
),
bias_attr
=
ParamAttr
(
name
=
'
mobilenetv2_fc
_offset'
))
else
:
assert
self
.
output_size
==
input
.
shape
[
2
],
\
(
"output_size must EQUAL to input_size / (2^block_num)."
...
...
@@ -173,7 +178,7 @@ class MobileNetV2Space(SearchSpaceBase):
return
net_arch
def
shortcut
(
self
,
input
,
data_residual
):
def
_
shortcut
(
self
,
input
,
data_residual
):
"""Build shortcut layer.
Args:
input(Variable): input.
...
...
@@ -183,7 +188,7 @@ class MobileNetV2Space(SearchSpaceBase):
"""
return
fluid
.
layers
.
elementwise_add
(
input
,
data_residual
)
def
inverted_residual_unit
(
self
,
def
_
inverted_residual_unit
(
self
,
input
,
num_in_filter
,
num_filters
,
...
...
@@ -240,10 +245,10 @@ class MobileNetV2Space(SearchSpaceBase):
name
=
name
+
'_linear'
)
out
=
linear_out
if
ifshortcut
:
out
=
self
.
shortcut
(
input
=
input
,
data_residual
=
out
)
out
=
self
.
_
shortcut
(
input
=
input
,
data_residual
=
out
)
return
out
def
invresi_blocks
(
self
,
input
,
in_c
,
t
,
c
,
n
,
s
,
k
,
name
=
None
):
def
_
invresi_blocks
(
self
,
input
,
in_c
,
t
,
c
,
n
,
s
,
k
,
name
=
None
):
"""Build inverted residual blocks.
Args:
input: Variable, input.
...
...
@@ -257,7 +262,7 @@ class MobileNetV2Space(SearchSpaceBase):
Returns:
Variable, layers output.
"""
first_block
=
self
.
inverted_residual_unit
(
first_block
=
self
.
_
inverted_residual_unit
(
input
=
input
,
num_in_filter
=
in_c
,
num_filters
=
c
,
...
...
@@ -271,7 +276,7 @@ class MobileNetV2Space(SearchSpaceBase):
last_c
=
c
for
i
in
range
(
1
,
n
):
last_residual_block
=
self
.
inverted_residual_unit
(
last_residual_block
=
self
.
_
inverted_residual_unit
(
input
=
last_residual_block
,
num_in_filter
=
last_c
,
num_filters
=
c
,
...
...
paddleslim/nas/search_space/search_space_base.py
浏览文件 @
9fdb6054
...
...
@@ -39,6 +39,6 @@ class SearchSpaceBase(object):
Args:
tokens(list<int>): The tokens which represent a network.
Return:
list<layers>
model arch
"""
raise
NotImplementedError
(
'Abstract method.'
)
paddleslim/nas/search_space/search_space_factory.py
浏览文件 @
9fdb6054
...
...
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from
search_space_registry
import
SEARCHSPACE
from
.combine_search_space
import
CombineSearchSpace
__all__
=
[
"SearchSpaceFactory"
]
...
...
@@ -21,18 +21,11 @@ class SearchSpaceFactory(object):
def
__init__
(
self
):
pass
def
get_search_space
(
self
,
key
,
config
):
def
get_search_space
(
self
,
config_lists
):
"""
get
specific model space based on key and config.
get
model spaces based on list(key, config).
Args:
key(str): model space name.
config(dict): basic config information.
return:
model space(class)
"""
cls
=
SEARCHSPACE
.
get
(
key
)
space
=
cls
(
config
[
'input_size'
],
config
[
'output_size'
],
config
[
'block_num'
])
assert
isinstance
(
config_lists
,
list
),
"configs must be a list"
return
space
return
CombineSearchSpace
(
config_lists
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录