PC-DARTS已被接受在 ICLR 2020 上进行重点演讲!
PC-DARTS是一种基于DARTS的内存高效可微架构方法。它主要着眼于减少one-shot NAS方法中超级网络的大量内存成本,这意味着它也可以与其他one-shot NAS方法(例如ENAS)结合。与以往对操作进行采样的方法不同,PC-DARTS对构建的超网的通道进行采样。有趣的是,虽然我们在搜索过程中引入了随机性,但搜索到的架构的性能比 DARTS 更好、更稳定!技术细节和实验结果的详细描述,请参考我们的论文:
用于内存高效可微架构搜索的部分通道连接
徐宇辉、谢灵曦、张晓鹏、陈鑫、齐国军、田齐和熊洪凯。
这段代码是基于DARTS的实现。
随机抽样的实现也上传供大家参考。
ImageNet 搜索的主文件已上传train_search_imagenet.py
。
方法 | 参数(M) | 错误(%) | 搜索成本 |
---|---|---|---|
阿米巴网-B | 2.8 | 2.55 | 3150 |
DARTSV1 | 3.3 | 3.00 | 0.4 |
DARTSV2 | 3.3 | 2.76 | 1.0 |
系统NAS | 2.8 | 2.85 | 1.5 |
电脑飞镖 | 3.6 | 2.57 | 0.1 |
CIFAR-10 上的搜索仅使用0.1 个 GPU 天!
方法 | 失败次数 | Top-1 错误(%) | Top-5 错误(%) | 搜索成本 |
---|---|---|---|---|
NASNet-A | 第564章 | 26.0 | 8.4 | 1800 |
阿米巴网-B | 第570章 | 24.3 | 7.6 | 3150 |
美国国家科学院院刊 | 第588章 | 25.8 | 8.1 | 225 |
DARTSV2 | 第574章 | 26.7 | 8.7 | 1.0 |
系统NAS | 第522章 | 27.3 | 9.3 | 1.5 |
电脑飞镖 | 第597章 | 24.2 | 7.3 | 3.8 |
使用DARTS的搜索空间在ImageNet上搜索好的架构(第一次! )。
要运行我们的代码,您只需要一台 Nvidia 1080ti(11G 内存)。
python train_search.py
数据准备:需要事先从训练集的每个类别中随机采样 10% 和 2.5% 图像,分别作为训练集和验证集。采样数据保存到./imagenet_search
中。请注意,不要使用 torch.utils.data.sampler.SubsetRandomSampler 进行数据采样,因为 imagenet 太大。
python train_search_imagenet.py --tmp_data_dir /path/to/your/sampled/data --save log_path
python train.py --auxiliary --cutout
python train_imagenet.py --tmp_data_dir /path/to/your/data --save log_path --auxiliary --note note_of_this_run
即将推出!。
对于主分支中的代码,推荐使用python2 with pytorch(3.0.1)
(在Nvidia 1080ti
上运行)。如果您想使用python3+
和pytorch1.0+
在Tesla V100
上实现 PC-DARTS,我们还在V100_python1.0
中提供了代码。
您甚至可以在内存只有4G的 GPU 上运行代码。如果我们使用与 DARTS 相同的超参数设置(batch-size=64),PC-DARTS 仅花费不到 4G 内存。
您可以通过model_search_imagenet.py
在 ImageNet 上搜索! ImageNet上搜索的训练文件将在清理后上传,也可以根据CIFAR10上的train_search文件和ImageNet上的evluate文件生成。我们的论文中报告了超参数!搜索在 8 个 V100 GPU(每个 16G)上花费了 11.5 小时。如果你有V100(32G),你可以进一步增加batch-size。
我们从 ImageNet 的每一类训练数据集中随机采样 10% 和 2.5%。还有1000节课!用以下代码替换input_search, target_search = next(iter(valid_queue))
会快得多:
try: input_search, target_search = next(valid_queue_iter) except: valid_queue_iter = iter(valid_queue) input_search, target_search = next(valid_queue_iter)
PC-DARTS的主要代码在model_search.py
文件中。正如论文中所述,我们使用一种有效的方法来实现通道采样。首先,选择输入的固定子集输入到候选操作中,然后交换连接的输出。提供了两种有效的交换操作:通道洗牌和通道移位。对于边缘归一化,我们定义边缘参数(代码中的 beta)以及原始 darts 代码中的 alpha 参数。
model_search_random.py
还提供了随机采样的实现。它也可以工作,而通道洗牌可能具有更好的性能。
由于PC-DARTS是一种超内存高效的NAS方法。它有潜力应用于其他任务,例如检测和分割。
渐进式可微架构搜索
可微架构搜索
如果您在研究中使用我们的代码,请相应地引用我们的论文。
@诉讼中{ xu2020pcdarts, title={{{}PC{}}-{{}DARTS{}}:用于内存高效架构搜索的部分通道连接}, 作者={徐宇辉、谢灵曦、张晓鹏、陈鑫、齐国军、田齐、熊洪凯}, booktitle={国际学习表征会议}, 年={2020}, url={https://openreview.net/forum?id=BJlS634tPr} }