当前深度学习的模型设计较为费事,有点玄学,不过,现在是可以进行向超参数一样,搜索出最优的模型架构,于是NAS就诞生了。
自从有了nni以后,nas变得容易很多了,直接就可以进行搜索。
不过,目前仅仅支持随机搜索和ppo(感谢大佬指正,这个说法着实不严谨,nni支持的nas算法非常多,源码里面的例子就能看出来,我是想表达的意思是classic_nas里面只支持随机和ppo)。
nni这篇文章讲过如何安装以及超参数搜索的使用。
nas下面的例子就演示随机搜索,ppo运行时间较长,这里就只展示随机搜索,ppo也亲测可行,和随机搜索一样,按照下面的过程就可以。
等安装nni好并且下载nni的GitHub源码以后就能进行使用了,使用过程如下:
(1)进入到nni源码的nas例子的路径下
cd /opt/nni/examples/nas/classic_nas
(2)在第一次进行搜索的时候,需要敲命令生成搜索空间文件,这里我将其命名为ss.json
因为,仔细看mnist.py文件就可看到,卷积的都是可以进行选择的,就是留给们进行随机选择组合,因此需要搜索 空间文件,不想超参数搜索,自己设置文件,这里需要命令去生成。
nnictl ss_gen --trial_command="python3 mnist.py" --trial_dir=./ --file=ss.json
我们可以看一下,生成后的结果:
[root@localhost classic_nas]# cat ss.json
{
"first_conv": {
"_type": "layer_choice",
"_value": [
"conv5x5",
"conv3x3"
]
},
"mid_conv": {
"_type": "layer_choice",
"_value": [
"0",
"1"
]
},
"skip": {
"_type": "input_choice",
"_value": {
"candidates": [
"",
""
],
"n_chosen": 1
}
}
}
(3)编辑config_random_search.yml,设置searchSpacePath的具体路径:
vim config_random_search.yml
authorName: default
experimentName: example_mnist
trialConcurrency: 1
maxExecDuration: 1h
maxTrialNum: 10
#choice: local, remote, pai
trainingServicePlatform: local
#please use `nnictl ss_gen` to generate search space file first
searchSpacePath: ss.json
useAnnotation: False
tuner:
codeDir: ../../tuners/random_nas_tuner
classFileName: random_nas_tuner.py
className: RandomNASTuner
trial:
command: python3 mnist.py
codeDir: .
gpuNum: 0
(4)运行nas
nnictl create --config config_random_search.yml
运行成功以后就可以,在网页上进行查看:
看一下最好的分数的具体的深度学习结构:
可以看到,这里最高的得分的是第一个卷积层使用卷积核为5X5的。
运行一下ppo结果:
因为这个可枚举的空间不大,导致很早就直接就收敛了,数据结果看起来不如随机搜索,实际上找到网络结构是基本上一样的。