PC-DARTS a été accepté pour une présentation phare à l'ICLR 2020 !
PC-DARTS est une méthode d'architecture différentiable économe en mémoire basée sur DARTS . Il se concentre principalement sur la réduction du coût important de la mémoire du super-net dans la méthode NAS one-shot, ce qui signifie qu'il peut également être combiné avec d'autres méthodes NAS one-shot, par exemple ENAS . Différent des méthodes précédentes d'échantillonnage, PC-DARTS échantillonne les canaux du super-réseau construit. Fait intéressant, même si nous avons introduit le caractère aléatoire lors du processus de recherche, les performances de l'architecture recherchée sont meilleures et plus stables que celles de DARTS ! Pour une description détaillée des détails techniques et des résultats expérimentaux, veuillez vous référer à notre article :
Connexions de canaux partiels pour une recherche d'architecture différenciable économe en mémoire
Yuhui Xu, Lingxi Xie, Xiaopeng Zhang, Xin Chen, Guo-Jun Qi, Qi Tian et Hongkai Xiong.
Ce code est basé sur l'implémentation de DARTS.
La mise en œuvre de l'échantillonnage aléatoire est également téléchargée pour votre considération.
Le fichier principal de recherche sur ImageNet a été téléchargé train_search_imagenet.py
.
Méthode | Paramètres (M) | Erreur(%) | Coût de recherche |
---|---|---|---|
AmibeNet-B | 2.8 | 2,55 | 3150 |
FLECHETTESV1 | 3.3 | 3h00 | 0,4 |
FLECHETTESV2 | 3.3 | 2,76 | 1.0 |
SNAS | 2.8 | 2,85 | 1,5 |
PC-FLECHETTES | 3.6 | 2,57 | 0,1 |
Seuls 0,1 GPU-jours sont utilisés pour une recherche sur CIFAR-10 !
Méthode | FLOP | Erreur principale 1 (%) | Erreur Top-5 (%) | Coût de recherche |
---|---|---|---|---|
NASNet-A | 564 | 26,0 | 8.4 | 1800 |
AmibeNet-B | 570 | 24.3 | 7.6 | 3150 |
PNAS | 588 | 25,8 | 8.1 | 225 |
FLECHETTESV2 | 574 | 26,7 | 8.7 | 1.0 |
SNAS | 522 | 27.3 | 9.3 | 1,5 |
PC-FLECHETTES | 597 | 24.2 | 7.3 | 3.8 |
Recherchez une bonne architecture sur ImageNet en utilisant l'espace de recherche de DARTS ( First Time! ).
Pour exécuter notre code, vous n'avez besoin que d'un seul Nvidia 1080ti (mémoire 11G).
python train_search.py
Préparation des données : 10 % et 2,5 % des images doivent être échantillonnées au hasard avant chaque classe d'ensemble de formation comme train et val, respectivement. Les données échantillonnées sont enregistrées dans ./imagenet_search
. Notez qu'il ne faut pas utiliser torch.utils.data.sampler.SubsetRandomSampler pour l'échantillonnage de données car imagenet est trop volumineux.
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
À venir!.
Pour les codes de la branche principale, python2 with pytorch(3.0.1)
est recommandé (fonctionnant sur Nvidia 1080ti
). Nous avons également fourni des codes dans le V100_python1.0
si vous souhaitez implémenter PC-DARTS sur Tesla V100
avec python3+
et pytorch1.0+
.
Vous pouvez même exécuter les codes sur un GPU avec une mémoire uniquement 4G . PC-DARTS ne coûte que moins de 4 Go de mémoire, si nous utilisons les mêmes paramètres d'hyper-paramètres que DARTS (batch-size=64).
Vous pouvez effectuer une recherche sur ImageNet par model_search_imagenet.py
! Le fichier de formation pour la recherche sur ImageNet sera téléchargé après avoir été nettoyé ou vous pouvez le générer selon le fichier train_search sur CIFAR10 et le fichier evluate sur ImageNet. Les hyperparamètres sont rapportés dans notre article ! La recherche a coûté 11,5 heures sur 8 GPU V100 (16G chacun). Si vous disposez du V100 (32G), vous pouvez augmenter encore la taille du lot.
Nous échantillonnons au hasard 10 % et 2,5 % de chaque classe d'ensemble de données de formation d'ImageNet. Il y a encore 1000 cours ! Remplacer input_search, target_search = next(iter(valid_queue))
par les codes suivants serait beaucoup plus rapide :
try: input_search, target_search = next(valid_queue_iter) except: valid_queue_iter = iter(valid_queue) input_search, target_search = next(valid_queue_iter)
Les principaux codes de PC-DARTS sont dans le fichier model_search.py
. Comme décrit dans l'article, nous utilisons un moyen efficace pour mettre en œuvre l'échantillonnage de canal. Tout d’abord, un sous-ensemble fixe de l’entrée est sélectionné pour être intégré aux opérations candidates, puis la sortie concaténée est permutée. Deux opérations d'échange efficaces sont fournies : le mélange de canaux et le changement de canal. Pour la normalisation des bords, nous définissons les paramètres de bord (bêta dans nos codes) ainsi que les paramètres alpha dans les codes de fléchettes d'origine.
La mise en œuvre de l'échantillonnage aléatoire est également fournie model_search_random.py
. Cela fonctionne également même si la lecture aléatoire des chaînes peut avoir de meilleures performances.
Comme PC-DARTS est une méthode NAS ultra économe en mémoire. Il a le potentiel d’être mis en œuvre sur d’autres tâches telles que la détection et la segmentation.
Recherche d'architecture différenciable progressive
Recherche d'architecture différenciable
Si vous utilisez notre code dans votre recherche, veuillez citer notre article en conséquence.
@inproceedings{ xu2020pcdarts, title={{{}PC{}}-{{}DARTS{}} : connexions de canaux partielles pour une recherche d'architecture efficace en mémoire}, author={Yuhui Xu et Lingxi Xie et Xiaopeng Zhang et Xin Chen et Guo-Jun Qi et Qi Tian et Hongkai Xiong}, booktitle={Conférence internationale sur les représentations de l'apprentissage}, année={2020}, url={https://openreview.net/forum?id=BJlS634tPr} }