deeplearning搜索空间
生活随笔
收集整理的這篇文章主要介紹了
deeplearning搜索空间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
deeplearning搜索空間
搜索空間是神經網絡搜索中的一個概念。搜索空間是一系列模型結構的匯集, SANAS主要是利用模擬退火的思想在搜索空間中搜索到一個比較小的模型結構或者一個精度比較高的模型結構。
paddleslim.nas 提供的搜索空間
根據初始模型結構構造搜索空間:
- MobileNetV2Space
? MobileNetV2的網絡結構 - MobileNetV1Space
? MobilNetV1的網絡結構 - ResNetSpace
? ResNetSpace的網絡結構
根據相應模型的block構造搜索空間: - MobileNetV1BlockSpace
? MobileNetV1Block的結構 - MobileNetV2BlockSpace
? MobileNetV2Block的結構 - ResNetBlockSpace
? ResNetBlock的結構 - InceptionABlockSpace
? InceptionABlock的結構 - InceptionCBlockSpace
? InceptionCBlock結構
搜索空間使用示例 - 使用paddleslim中提供用初始的模型結構來構造搜索空間的話,僅需要指定搜索空間名字即可。例如:如果使用原本的MobileNetV2的搜索空間進行搜索的話,傳入SANAS中的configs直接指定為[(‘MobileNetV2Space’)]。
- 使用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)### 定義token的index的取值范圍
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 inputreturn 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 inputdef _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搜索空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deeplearning算法优化原理
- 下一篇: GEMM与AutoKernel算子优化