搜索空间参数配置
搜索空間參數配置
通過參數配置搜索空間。
參數:
? input_size(int|None):- input_size 表示輸入 feature map 的大小。 input_size 和 output_size 用來計算整個模型結構中下采樣次數。
? output_size(int|None):- output_size 表示輸出feature map的大小。 input_size 和 output_size 用來計算整個模型結構中下采樣次數。
? block_num(int|None):- block_num 表示搜索空間中block的數量。
? block_mask(list|None):- block_mask 是一組由0、1組成的列表,0表示當前block是normal block,1表示當前block是reduction block。reduction block表示經過這個block之后的feature map大小下降為之前的一半,normal block表示經過這個block之后feature map大小不變。如果設置了 block_mask ,則主要以 block_mask 為主要配置, input_size , output_size 和 block_num 三種配置是無效的。
SANAS
classpaddleslim.nas.SANAS(configs, server_addr=("", 8881), init_temperature=None, reduce_rate=0.85, init_tokens=None, search_steps=300, save_checkpoint=’./nas_checkpoint’, load_checkpoint=None, is_server=True)
源代碼
SANAS(Simulated Annealing Neural Architecture Search)是基于模擬退火算法進行模型結構搜索的算法,一般用于離散搜索任務。
參數:
? configs(list) - 搜索空間配置列表,格式是 [(key, {input_size, output_size, block_num, block_mask})] 或者 [(key)] (MobileNetV2、MobilenetV1和ResNet的搜索空間使用和原本網絡結構相同的搜索空間,所以僅需指定 key 即可), input_size 和 output_size 表示輸入和輸出的特征圖的大小, block_num 是指搜索網絡中的block數量, block_mask 是一組由0和1組成的列表,0代表不進行下采樣的block,1代表下采樣的block。 更多paddleslim提供的搜索空間配置可以參考Search Space。
? server_addr(tuple) - SANAS的地址,包括server的ip地址和端口號,如果ip地址為None或者為”“的話則默認使用本機ip。默認:(””, 8881)。
? init_temperature(float) - 基于模擬退火進行搜索的初始溫度。如果init_template為None而且init_tokens為None,則默認初始溫度為10.0,如果init_template為None且init_tokens不為None,則默認初始溫度為1.0。詳細的溫度設置可以參考下面的Note。默認:None。
? reduce_rate(float) - 基于模擬退火進行搜索的衰減率。詳細的退火率設置可以參考下面的Note。默認:0.85。
? init_tokens(list|None) - 初始化token,若init_tokens為空,則SA算法隨機生成初始化tokens。默認:None。
? search_steps(int) - 搜索過程迭代的次數。默認:300。
? save_checkpoint(str|None) - 保存checkpoint的文件目錄,如果設置為None的話則不保存checkpoint。默認: ./nas_checkpoint 。
? load_checkpoint(str|None) - 加載checkpoint的文件目錄,如果設置為None的話則不加載checkpoint。默認:None。
? is_server(bool) - 當前實例是否要啟動一個server。默認:True。
返回: 一個SANAS類的實例
示例代碼:
from paddleslim.nas import SANAS
config = [(‘MobileNetV2Space’)]
sanas = SANAS(configs=config)
注解
? 初始化溫度和退火率的意義:
o SA算法內部會保存一個基礎token(初始化token可以自己傳入也可以隨機生成)和基礎score(初始化score為-1),下一個token會在當前SA算法保存的token的基礎上產生。在SA的搜索過程中,如果本輪的token訓練得到的score大于SA算法中保存的score,則本輪的token一定會被SA算法接收保存為下一輪token產生的基礎token。
o 初始溫度越高表示SA算法當前處的階段越不穩定,本輪的token訓練得到的score小于SA算法中保存的score的話,本輪的token和score被SA算法接收的可能性越大。
o 初始溫度越低表示SA算法當前處的階段越穩定,本輪的token訓練得到的score小于SA算法中保存的score的話,本輪的token和score被SA算法接收的可能性越小。
o 退火率越大,表示SA算法收斂的越慢,即SA算法越慢到穩定階段。
o 退火率越低,表示SA算法收斂的越快,即SA算法越快到穩定階段。
? 初始化溫度和退火率的設置:
o 如果原本就有一個較好的初始化token,想要基于這個較好的token來進行搜索的話,SA算法可以處于一個較為穩定的狀態進行搜索r這種情況下初始溫度可以設置的低一些,例如設置為1.0,退火率設置的大一些,例如設置為0.85。如果想要基于這個較好的token利用貪心算法進行搜索,即只有當本輪token訓練得到的score大于SA算法中保存的score,SA算法才接收本輪token,則退火率可設置為一個極小的數字,例如設置為0.85 ** 10。
o 初始化token如果是隨機生成的話,代表初始化token是一個比較差的token,SA算法可以處于一種不穩定的階段進行搜索,盡可能的隨機探索所有可能得token,從而找到一個較好的token。初始溫度可以設置的高一些,例如設置為1000,退火率相對設置的小一些。
next_archs()
獲取下一組模型結構。
返回: 返回模型結構實例的列表,形式為list。
示例代碼:
import paddle.fluid as fluid
from paddleslim.nas import SANAS
config = [(‘MobileNetV2Space’)]
sanas = SANAS(configs=config)
input = fluid.data(name=‘input’, shape=[None, 3, 32, 32], dtype=‘float32’)
archs = sanas.next_archs()
for arch in archs:
output = arch(input)
input = output
print(output)
reward(score)
把當前模型結構的得分情況回傳。
參數:
? score: - 當前模型的得分,分數越大越好。
返回: 模型結構更新成功或者失敗,成功則返回 True ,失敗則返回 False 。
示例代碼:
import paddle.fluid as fluid
from paddleslim.nas import SANAS
config = [(‘MobileNetV2Space’)]
sanas = SANAS(configs=config)
archs = sanas.next_archs()
假設網絡計算出來的score是1,實際代碼中使用時需要返回真實score。
score=float(1.0)
sanas.reward(float(score))
tokens2arch(tokens)
通過一組tokens得到實際的模型結構,一般用來把搜索到最優的token轉換為模型結構用來做最后的訓練。tokens的形式是一個列表,tokens映射到搜索空間轉換成相應的網絡結構,一組tokens對應唯一的一個網絡結構。
參數:
? tokens(list): - 一組tokens。tokens的長度和范圍取決于搜索空間。
返回: 根據傳入的token得到一個模型結構實例列表。
示例代碼:
import paddle.fluid as fluid
from paddleslim.nas import SANAS
config = [(‘MobileNetV2Space’)]
sanas = SANAS(configs=config)
input = fluid.data(name=‘input’, shape=[None, 3, 32, 32], dtype=‘float32’)
tokens = ([0] * 25)
archs = sanas.tokens2arch(tokens)[0]
print(archs(input))
current_info()
返回當前token和搜索過程中最好的token和reward。
返回: 搜索過程中最好的token,reward和當前訓練的token,形式為dict。
示例代碼:
import paddle.fluid as fluid
from paddleslim.nas import SANAS
config = [(‘MobileNetV2Space’)]
sanas = SANAS(configs=config)
print(sanas.current_info())
總結
- 上一篇: deeplearning模型分析
- 下一篇: 卷积层通道剪裁