OneShotSearch#
+-
+
- paddleslim.nas.one_shot.OneShotSearch(model, eval_func, strategy='sa', search_steps=100)代码 +
-
+
从超级网络中搜索出一个最佳的子网络。
+
+
参数:
+-
+
-
+
model(fluid.dygraph.layer): 通过在
+OneShotSuperNet
前后添加若该模块构建的动态图模块。因为OneShotSuperNet
是一个超网络,所以model
也是一个超网络。换句话说,在model
模块的子模块中,至少有一个是OneShotSuperNet
的实例。该方法从model
超网络中搜索得到一个最佳的子网络。超网络model
需要先被训练,具体细节请参考OneShotSuperNet。
+ -
+
eval_func: 用于评估子网络性能的回调函数。该回调函数需要接受
+model
为参数,并调用model
的forward
方法进行性能评估。
+ -
+
strategy(str): 搜索策略的名称。默认为'sa', 当前仅支持'sa'.
+
+ -
+
search_steps(int): 搜索轮次数。默认为100。
+
+
返回:
+-
+
- best_tokens: 表示最佳子网络的编码信息(tokens)。 +
示例代码:
+ +OneShotSuperNet#
+用于OneShot
搜索策略的超级网络的基类,所有超级网络的实现要继承该类。
-
+
- paddleslim.nas.one_shot.OneShotSuperNet(name_scope) +
-
+
构造方法。
+
+
参数:
+-
+
- **name_scope:(str) **超级网络的命名空间。 +
返回:
+-
+
- super_net: 一个
OneShotSuperNet
实例。
+
-
+
- init_tokens() +
-
+
获得当前超级网络的初始化子网络的编码,主要用于搜索。
+
+
返回:
+-
+
- tokens(list
): 一个子网络的编码。
+
-
+
- range_table() +
-
+
超级网络中各个子网络由一组整型数字编码表示,该方法返回编码每个位置的取值范围。
+
+
返回:
+-
+
- range_table(tuple): 子网络编码每一位的取值范围。
range_table
格式为(min_values, max_values)
,其中,min_values
为一个整型数组,表示每个编码位置可选取的最小值;max_values
表示每个编码位置可选取的最大值。
+
-
+
- _forward_impl(input, tokens) +
-
+
前向计算函数。
+OneShotSuperNet
的子类需要实现该函数。
+
参数:
+-
+
-
+
input(Variable): 超级网络的输入。
+
+ -
+
tokens(list
+): 执行前向计算所用的子网络的编码。默认为None
,即随机选取一个子网络执行前向。
+
返回:
+-
+
- output(Variable): 前向计算的输出 +
-
+
- forward(self, input, tokens=None) +
-
+
执行前向计算。
+
+
参数:
+-
+
-
+
input(Variable): 超级网络的输入。
+
+ -
+
tokens(list
+): 执行前向计算所用的子网络的编码。默认为None
,即随机选取一个子网络执行前向。
+
返回:
+-
+
- output(Variable): 前向计算的输出 +
-
+
- _random_tokens() +
-
+
随机选取一个子网络,并返回其编码。
+
+
返回:
+-
+
- tokens(list
): 一个子网络的编码。
+
SuperMnasnet#
+在Mnasnet基础上修改得到的超级网络, 该类继承自OneShotSuperNet
.
-
+
- paddleslim.nas.one_shot.SuperMnasnet(name_scope, input_channels=3, out_channels=1280, repeat_times=[6, 6, 6, 6, 6, 6], stride=[1, 1, 1, 1, 2, 1], channels=[16, 24, 40, 80, 96, 192, 320], use_auxhead=False) +
-
+
构造函数。
+
+
参数:
+-
+
-
+
name_scope(str): 命名空间。
+
+ -
+
input_channels(str): 当前超级网络的输入的特征图的通道数量。
+
+ -
+
out_channels(str): 当前超级网络的输出的特征图的通道数量。
+
+ -
+
repeat_times(list): 每种
+block
重复的次数。
+ -
+
stride(list): 一种
+block
重复堆叠成repeat_block
,stride
表示每个repeat_block
的下采样比例。
+ -
+
channels(list): channels[i]和channels[i+1]分别表示第i个
+repeat_block
的输入特征图的通道数和输出特征图的通道数。
+ -
+
use_auxhead(bool): 是否使用辅助特征图。如果设置为
+True
,则SuperMnasnet
除了返回输出特征图,还还返回辅助特征图。默认为False.
+
返回:
+-
+
- instance(SuperMnasnet): 一个
SuperMnasnet
实例
+
示例: +
import paddle +import paddle.fluid as fluid +class MNIST(fluid.dygraph.Layer): + def __init__(self): + super(MNIST, self).__init__() + self.arch = SuperMnasnet( + name_scope="super_net", input_channels=20, out_channels=20) + self.pool_2_shape = 50 * 13 * 13 + SIZE = 10 + scale = (2.0 / (self.pool_2_shape**2 * SIZE))**0.5 + self._fc = Linear( + self.pool_2_shape, + 10, + param_attr=fluid.param_attr.ParamAttr( + initializer=fluid.initializer.NormalInitializer( + loc=0.0, scale=scale)), + act="softmax") + + def forward(self, inputs, label=None, tokens=None): + + x = self.arch(inputs, tokens=tokens) + x = fluid.layers.reshape(x, shape=[-1, self.pool_2_shape]) + x = self._fc(x) + if label is not None: + acc = fluid.layers.accuracy(input=x, label=label) + return x, acc + else: + return x +