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} }