PC-DARTS wurde für die Spotlight-Präsentation auf der ICLR 2020 angenommen!
PC-DARTS ist eine speichereffiziente differenzierbare Architekturmethode, die auf DARTS basiert. Es konzentriert sich hauptsächlich auf die Reduzierung der großen Speicherkosten des Supernets in der One-Shot-NAS-Methode, was bedeutet, dass es auch mit anderen One-Shot-NAS-Methoden, z. B. ENAS , kombiniert werden kann. Im Gegensatz zu früheren Methoden zur Abtastung von Vorgängen tastet PC-DARTS Kanäle des aufgebauten Supernetzes ab. Interessanterweise ist die Leistung der gesuchten Architektur besser und stabiler als bei DARTS, obwohl wir während des Suchvorgangs Zufälligkeit eingeführt haben! Eine detaillierte Beschreibung der technischen Details und experimentellen Ergebnisse finden Sie in unserem Artikel:
Teilkanalverbindungen für eine speichereffiziente Suche nach differenzierbaren Architekturen
Yuhui Xu, Lingxi Xie, Xiaopeng Zhang, Xin Chen, Guo-Jun Qi, Qi Tian und Hongkai Xiong.
Dieser Code basiert auf der Implementierung von DARTS.
Die Implementierung der Zufallsstichprobe wird ebenfalls zu Ihrer Überlegung hochgeladen.
Die Hauptdatei für die Suche auf ImageNet wurde train_search_imagenet.py
hochgeladen.
Verfahren | Parameter(M) | Fehler(%) | Suchkosten |
---|---|---|---|
AmoebaNet-B | 2.8 | 2,55 | 3150 |
DARTSV1 | 3.3 | 3,00 | 0,4 |
DARTSV2 | 3.3 | 2,76 | 1,0 |
SNAS | 2.8 | 2,85 | 1.5 |
PC-DARTS | 3.6 | 2,57 | 0,1 |
Für eine Suche auf CIFAR-10 werden nur 0,1 GPU-Tage verbraucht!
Verfahren | FLOPs | Top-1-Fehler (%) | Top-5-Fehler (%) | Suchkosten |
---|---|---|---|---|
NASNet-A | 564 | 26.0 | 8.4 | 1800 |
AmoebaNet-B | 570 | 24.3 | 7.6 | 3150 |
PNAS | 588 | 25.8 | 8.1 | 225 |
DARTSV2 | 574 | 26.7 | 8.7 | 1,0 |
SNAS | 522 | 27.3 | 9.3 | 1.5 |
PC-DARTS | 597 | 24.2 | 7.3 | 3.8 |
Suchen Sie auf ImageNet nach einer guten Architektur, indem Sie den Suchbereich von DARTS nutzen ( zum ersten Mal! ).
Um unseren Code auszuführen, benötigen Sie nur eine Nvidia 1080ti (11G Speicher).
python train_search.py
Datenvorbereitung: 10 % und 2,5 % der Bilder müssen vorab zufällig aus jeder Klasse des Trainingssatzes als Zug bzw. Val ausgewählt werden. Die abgetasteten Daten werden in ./imagenet_search
gespeichert. Beachten Sie, dass Torch.utils.data.sampler.SubsetRandomSampler nicht für die Datenerfassung verwendet werden sollte, da Imagenet zu groß ist.
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
Kommt bald!.
Für die Codes im Hauptzweig wird python2 with pytorch(3.0.1)
empfohlen (läuft auf Nvidia 1080ti
). Wir haben auch Codes in V100_python1.0
bereitgestellt, wenn Sie PC-DARTS auf Tesla V100
mit python3+
und pytorch1.0+
implementieren möchten.
Sie können die Codes sogar auf einer GPU mit nur 4G- Speicher ausführen. PC-DARTS kostet nur dann weniger als 4G-Speicher, wenn wir die gleichen Hyperparametereinstellungen wie DARTS verwenden (Batchgröße=64).
Sie können auf ImageNet nach model_search_imagenet.py
suchen! Die Trainingsdatei für die Suche auf ImageNet wird hochgeladen, nachdem sie bereinigt wurde, oder Sie können sie gemäß der train_search-Datei auf CIFAR10 und der evluate-Datei auf ImageNet generieren. Über Hyperparameter wird in unserem Artikel berichtet! Die Suche kostete 11,5 Stunden auf 8 V100-GPUs (jeweils 16 GB). Wenn Sie über V100 (32G) verfügen, können Sie die Stapelgröße weiter erhöhen.
Wir ziehen zufällig 10 % und 2,5 % aus jeder Klasse von Trainingsdatensätzen von ImageNet. Es gibt noch 1000 Kurse! Das Ersetzen von input_search, target_search = next(iter(valid_queue))
durch die folgenden Codes wäre viel schneller:
try: input_search, target_search = next(valid_queue_iter) except: valid_queue_iter = iter(valid_queue) input_search, target_search = next(valid_queue_iter)
Die Hauptcodes von PC-DARTS befinden sich in der Datei model_search.py
. Wie im Artikel beschrieben, verwenden wir eine effiziente Methode zur Implementierung der Kanalabtastung. Zuerst wird eine feste Teilmenge der Eingabe ausgewählt, die in die Kandidatenoperationen eingespeist werden soll, dann wird die verkettete Ausgabe ausgetauscht. Es stehen zwei effiziente Swap-Operationen zur Verfügung: Channel-Shuffle und Channel-Shift. Für die Kantennormalisierung definieren wir Kantenparameter (Beta in unseren Codes) zusammen mit den Alpha-Parametern in den ursprünglichen Darts-Codes.
Die Implementierung der Zufallsstichprobe wird ebenfalls bereitgestellt model_search_random.py
. Es funktioniert auch, wenn die Kanalmischung möglicherweise eine bessere Leistung bringt.
Da es sich bei PC-DARTS um eine äußerst speichereffiziente NAS-Methode handelt. Es kann auch für andere Aufgaben wie Erkennung und Segmentierung implementiert werden.
Progressive differenzierbare Architektursuche
Differenzierbare Architektursuche
Wenn Sie unseren Code in Ihrer Recherche verwenden, zitieren Sie bitte unseren Artikel entsprechend.
@inproceedings{ xu2020pcdarts, title={{{}PC{}}-{{}DARTS{}}: Partielle Kanalverbindungen für speichereffiziente Architektursuche}, Autor={Yuhui Xu und Lingxi Xie und Xiaopeng Zhang und Xin Chen und Guo-Jun Qi und Qi Tian und Hongkai Xiong}, booktitle={Internationale Konferenz über Lernrepräsentationen}, Jahr={2020}, url={https://openreview.net/forum?id=BJlS634tPr} }