deeplearning搜索空间

搜索空间是神经网络搜索中的一个概念。搜索空间是一系列模型结构的汇集, SANAS主要是利用模拟退火的思想在搜索空间中搜索到一个比较小的模型结构或者一个精度比较高的模型结构。

paddleslim.nas 提供的搜索空间

根据初始模型结构构造搜索空间:

  1. MobileNetV2Space

      MobileNetV2的网络结构
  2. MobileNetV1Space

      MobilNetV1的网络结构
  3. ResNetSpace

      ResNetSpace的网络结构

根据相应模型的block构造搜索空间:

  1. MobileNetV1BlockSpace

      MobileNetV1Block的结构
  2. MobileNetV2BlockSpace

      MobileNetV2Block的结构
  3. ResNetBlockSpace

      ResNetBlock的结构
  4. InceptionABlockSpace

      InceptionABlock的结构
  5. InceptionCBlockSpace

      InceptionCBlock结构

搜索空间使用示例

  1. 使用paddleslim中提供用初始的模型结构来构造搜索空间的话,仅需要指定搜索空间名字即可。例如:如果使用原本的MobileNetV2的搜索空间进行搜索的话,传入SANAS中的configs直接指定为[(‘MobileNetV2Space’)]。
  2. 使用paddleslim中提供的block搜索空间构造搜索空间:

    2.1 使用input_size, output_size和block_num来构造搜索空间。例如:传入SANAS的configs可以指定为[(‘MobileNetV2BlockSpace’,
    {‘input_size’: 224, ‘output_size’: 32, ‘block_num’: 10})]。

    2.2 使用block_mask构造搜索空间。例如:传入SANAS的configs可以指定为[(‘MobileNetV2BlockSpace’,
    {‘block_mask’: [0, 1, 1, 1, 1, 0, 1, 0]})]。

自定义搜索空间(search space)

自定义搜索空间类需要继承搜索空间基类并重写以下几部分:

  1. 初始化的tokens(init_tokens函数),可以设置为自己想要的tokens列表, tokens列表中的每个数字指的是当前数字在相应的搜索列表中的索引。例如本示例中若tokens=[0, 3, 5],则代表当前模型结构搜索到的通道数为[8, 40, 128]。

  2. tokens中每个数字的搜索列表长度(range_table函数),tokens中每个token的索引范围。

  3. 根据tokens产生模型结构(token2arch函数),根据搜索到的tokens列表产生模型结构。

以新增reset block为例说明如何构造自己的search space。自定义的search space不能和已有的search space同名。

### 引入搜索空间基类函数和search space的注册类函数

from .search_space_base import SearchSpaceBase

from .search_space_registry import SEARCHSPACE

import numpy as np

### 需要调用注册函数把自定义搜索空间注册到space space

@SEARCHSPACE.register

### 定义一个继承SearchSpaceBase基类的搜索空间的类函数

class ResNetBlockSpace2(SearchSpaceBase):

def __init__(self, input_size, output_size, block_num, block_mask):

### 定义一些实际想要搜索的内容,例如:通道数、每个卷积的重复次数、卷积核大小等等

### self.filter_num
代表通道数的搜索列表

self.filter_num = np.array([8, 16, 32, 40, 64, 128, 256, 512])

### 定义初始化token,初始化token的长度根据传入的block_num或者block_mask的长度来得到的

def init_tokens(self):

return [0] * 3 * len(self.block_mask)

### 定义tokenindex的取值范围

def range_table(self):

return [len(self.filter_num)] * 3 * len(self.block_mask)

### token转换成模型结构

def token2arch(self, tokens=None):

if tokens == None:

tokens = self.init_tokens()

self.bottleneck_params_list = []

for i in range(len(self.block_mask)):

self.bottleneck_params_list.append(self.filter_num[tokens[i * 3 + 0]],

self.filter_num[tokens[i * 3 + 1]],

self.filter_num[tokens[i * 3 + 2]],

2 if self.block_mask[i] == 1 else 1)

def net_arch(input):

for i, layer_setting in enumerate(self.bottleneck_params_list):

channel_num, stride = layer_setting[:-1], layer_setting[-1]

input = self._resnet_block(input, channel_num, stride, name='resnet_layer{}'.format(i+1))

return input

return net_arch

### 构造具体block的操作

def _resnet_block(self, input, channel_num, stride, name=None):

shortcut_conv = self._shortcut(input, channel_num[2], stride, name=name)

input = self._conv_bn_layer(input=input, num_filters=channel_num[0], filter_size=1, act='relu', name=name + '_conv0')

input = self._conv_bn_layer(input=input, num_filters=channel_num[1], filter_size=3, stride=stride, act='relu', name=name + '_conv1')

input = self._conv_bn_layer(input=input, num_filters=channel_num[2], filter_size=1, name=name + '_conv2')

return fluid.layers.elementwise_add(x=shortcut_conv, y=input, axis=0, name=name+'_elementwise_add')

def _shortcut(self, input, channel_num, stride, name=None):

channel_in = input.shape[1]

if channel_in != channel_num or stride != 1:

return self.conv_bn_layer(input, num_filters=channel_num, filter_size=1, stride=stride, name=name+'_shortcut')

else:

return input

def _conv_bn_layer(self, input, num_filters, filter_size, stride=1, padding='SAME', act=None, name=None):

conv = fluid.layers.conv2d(input, num_filters, filter_size, stride, name=name+'_conv')

bn = fluid.layers.batch_norm(conv, act=act, name=name+'_bn')

return bn

deeplearning搜索空间的更多相关文章

  1. deeplearning算法优化原理

    deeplearning算法优化原理目录· 量化原理介绍 · 剪裁原理介绍 · 蒸馏原理介绍 · 轻量级模型结构搜索原理介绍 1. Quantization Aware Training量化介绍1.1 ...

  2. deeplearning模型库

    deeplearning模型库 1. 图像分类 数据集:ImageNet1000类 1.1  量化 分类模型Lite时延(ms) 设备 模型类型 压缩策略 armv7 Thread 1 armv7 T ...

  3. DeepLearning之路(三)MLP

    DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/articl ...

  4. DeepLearning之路(二)SoftMax回归

    Softmax回归   1. softmax回归模型 softmax回归模型是logistic回归模型在多分类问题上的扩展(logistic回归解决的是二分类问题). 对于训练集,有. 对于给定的测试 ...

  5. 用中文把玩Google开源的Deep-Learning项目word2vec

    google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算term之间的相似度,对term聚类等,该项目也支持phrase的自动识别,以及与t ...

  6. Deeplearning原文作者Hinton代码注解

    [z]Deeplearning原文作者Hinton代码注解 跑Hinton最初代码时看到这篇注释文章,很少细心,待研究... 原文地址:>http://www.cnblogs.com/BeDPS ...

  7. Google开源的Deep-Learning项目word2vec

    用中文把玩Google开源的Deep-Learning项目word2vec   google最近新开放出word2vec项目,该项目使用deep-learning技术将term表示为向量,由此计算te ...

  8. DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络

    介绍 DeepLearning课程总共五大章节,该系列笔记将按照课程安排进行记录. 另外第一章的前两周的课程在之前的Andrew Ng机器学习课程笔记(博客园)&Andrew Ng机器学习课程 ...

  9. DeepLearning.ai学习笔记汇总

    第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...

随机推荐

  1. http文件下载与404

    # http文件下载与404 if (!file_exists($file_path)) { header('HTTP/1.1 404 Not Found'); header("status ...

  2. 对c语言回调函数的理解

    对于回调函数,可以简单的理解为一种特别的函数调用方法,我们可以对比一下回调函数与普通函数在调用方法上的区别. 1. 普通函数调用 一般为实现方在其函数体执行过程中直接调用. 代码示例: #includ ...

  3. UVA10340子序列

    题意:       给你两个串,问你第二个第一个串是否是第一个串删除0个或多个字母得到的? 思路:       直接模拟就行了,在第二个串中去按顺序更新第一个串的下标,好像没说明白啊,不管了,水题,不 ...

  4. Wampserver-添加虚拟主机

    鼠标左键点击,之后点击第一个 localhost(有一个小房子) 添加虚拟地址 具体添加 完成界面 注意:这个时候一定需要重启一个Wampserver64 如果没有重启直接进入4这个步骤,会发现进入的 ...

  5. layui中select的change事件、动态追加option

    说明:layui中用jquery 中的选择器例如$('#id').change(function(){})发现不起作用 layui操作:lay-felter标识操作哪个select html部分: & ...

  6. 浅析DDD——领域驱动设计的理解

    浅析DDD--领域驱动设计的理解 我觉得领域驱动设计概念的提出,是为了更清晰的区分边界.这里的边界包括业务边界和功能的边界,每个边界都包含具体的领域对象,当业务和功能的领域对象一一对应上之后,业务的变 ...

  7. Unity动态构建mesh绘制多边形算法流程分析和实践

    前言 先说一下,写这篇博文的动机,原文的博主代码写的十分潇洒,以至于代码说明和注释都没有,最近恰逢看到,所以以此博文来分析其中的算法和流程 参考博文:https://blog.csdn.net/lin ...

  8. 在其他程序集访问internal类

    前言  本文将介绍如何在其他程序集访问internal类的方法 首先我们新建一个解决方案,其中同时新建两个类库FooALibray和FooALibray,如下: 其中FooA类代码如下: intern ...

  9. Linux 面试总结

    1. 统计指定目录的文件个数: find / -type f | wc –l 2.Linux 下常用目录 /boot:这个目录是用来存放与系统启动相关的文件/root:root用户的家目录/bin:存 ...

  10. Flutter 2.2 更新详解

    Flutter 2.2 版已正式发布!要获取新版本,您只需切换到 stable 渠道并更新目前安装的 Flutter,或前往 flutter.cn/docs/get-started 从头开始安装. 虽 ...