该方法由Single Path One-Shot Neural Architecture Search with Uniform Sampling
中提出,主体思想可以分为两个部分,分别是Single Path和One-shot。其中One-Shot指,前期训练一个超网络,
后期对超网络不断进行采样或剪枝等等的方法来获得最终的子网络。而Single Path指,在对于训练好的超网络,每一个模型都是超网络的一条路径。
该算法整体来看即:将网络的层级结构视为一条路径,路径的节点即每个神经层,每个节点有多种选择(多种神经层),对每个节点进行采样得到一个确定的神经层,
并连接每个节点成为一个路径,该路径即最终采样得到的子网络。
本实例参照microsoft nni中的spos repo实现了spos的超网训练、子网络的进化搜索、最终选取网络的重训练。
可以将imagenet数据放在./data
目录下,标准的数据处理方式可以参考这里
imagenet文件准备好之后,训练集和测试集应分别包含1000个子文件夹。
将文件准备齐全之后,目录结构应类似如下:
spos
├── architecture_final.json
├── blocks.py
├── config_search.yml
├── data
│ ├── imagenet
│ │ ├── train
│ │ └── val
│ └── op_flops_dict.pkl
├── dataloader.py
├── network.py
├── readme.md
├── scratch.py
├── supernet.py
├── tester.py
├── evolution_tuner.py
└── utils.py
python supernet.py
./data
目录下./checkpoints
路径下首先准备搜索空间
python tester.py --mode gen
然后进行基于进化算法的搜索
python search.py
./acc
,路径下./checkpoints
路径下./id2cand
路径下python scartch.py
today