PC-DARTS foi aceito para apresentação em destaque no ICLR 2020!
PC-DARTS é um método de arquitetura diferenciável com uso eficiente de memória baseado em DARTS . Ele se concentra principalmente na redução do grande custo de memória da super-rede no método NAS one-shot, o que significa que também pode ser combinado com outro método NAS one-shot, por exemplo, ENAS . Diferente dos métodos anteriores de operações de amostragem, o PC-DARTS amostra canais da super-rede construída. Curiosamente, embora tenhamos introduzido aleatoriedade durante o processo de pesquisa, o desempenho da arquitetura pesquisada é melhor e mais estável que o DARTS! Para uma descrição detalhada dos detalhes técnicos e resultados experimentais, consulte nosso artigo:
Conexões de canais parciais para pesquisa de arquitetura diferenciável com eficiência de memória
Yuhui Xu, Lingxi Xie, Xiaopeng Zhang, Xin Chen, Guo-Jun Qi, Qi Tian e Hongkai Xiong.
Este código é baseado na implementação do DARTS.
A implementação da amostragem aleatória também é enviada para sua consideração.
O arquivo principal para pesquisa no ImageNet foi carregado train_search_imagenet.py
.
Método | Parâmetros(M) | Erro(%) | Custo de pesquisa |
---|---|---|---|
AmoebaNet-B | 2.8 | 2,55 | 3150 |
DARDOSV1 | 3.3 | 3h00 | 0,4 |
DARTSV2 | 3.3 | 2,76 | 1,0 |
SNAS | 2.8 | 2,85 | 1,5 |
PC-DARDOS | 3.6 | 2,57 | 0,1 |
Apenas 0,1 dias de GPU são usados para uma pesquisa no CIFAR-10!
Método | FLOPs | Erro principal 1 (%) | 5 principais erros (%) | Custo de pesquisa |
---|---|---|---|---|
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-DARDOS | 597 | 24.2 | 7.3 | 3.8 |
Pesquise uma boa arquitetura no ImageNet usando o espaço de busca do DARTS ( First Time! ).
Para executar nosso código, você só precisa de uma Nvidia 1080ti (memória 11G).
python train_search.py
Preparação de dados: 10% e 2,5% das imagens precisam ser amostradas aleatoriamente antes de cada classe do conjunto de treinamento como train e val, respectivamente. Os dados amostrados são salvos em ./imagenet_search
. Observe que não use torch.utils.data.sampler.SubsetRandomSampler para amostragem de dados, pois o imagenet é muito grande.
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
Em breve!.
Para os códigos no branch principal, python2 with pytorch(3.0.1)
é recomendado (rodando em Nvidia 1080ti
). Também fornecemos códigos no V100_python1.0
se você deseja implementar PC-DARTS no Tesla V100
com python3+
e pytorch1.0+
.
Você pode até executar os códigos em uma GPU com memória apenas 4G . O PC-DARTS custa menos que 4G de memória, se usarmos as mesmas configurações de hiperparâmetros do DARTS (tamanho do lote = 64).
Você pode pesquisar no ImageNet por model_search_imagenet.py
! O arquivo de treinamento para pesquisa no ImageNet será carregado após a limpeza ou você poderá gerá-lo de acordo com o arquivo train_search no CIFAR10 e o arquivo evluate no ImageNet. Os hiperparâmetros são relatados em nosso artigo! A pesquisa custou 11,5 horas em 8 GPUs V100 (16G cada). Se você tiver o V100 (32G), poderá aumentar ainda mais o tamanho do lote.
Coletamos amostras aleatórias de 10% e 2,5% de cada classe de conjunto de dados de treinamento do ImageNet. Ainda faltam 1000 aulas! Substituir input_search, target_search = next(iter(valid_queue))
pelos seguintes códigos seria muito mais rápido:
try: input_search, target_search = next(valid_queue_iter) except: valid_queue_iter = iter(valid_queue) input_search, target_search = next(valid_queue_iter)
Os principais códigos do PC-DARTS estão no arquivo model_search.py
. Conforme descrito no artigo, usamos uma forma eficiente de implementar a amostragem de canal. Primeiro, um subconjunto fixo da entrada é selecionado para alimentar as operações candidatas e, em seguida, a saída concatenada é trocada. Duas operações de troca eficientes são fornecidas: embaralhamento de canal e mudança de canal. Para a normalização de arestas, definimos parâmetros de arestas (beta em nossos códigos) junto com os parâmetros alfa nos códigos de dardos originais.
A implementação da amostragem aleatória também é fornecida model_search_random.py
. Também funciona enquanto o embaralhamento de canais pode ter melhor desempenho.
Como PC-DARTS é um método NAS com uso ultraeficiente de memória. Tem potencial para ser implementado em outras tarefas, como detecção e segmentação.
Pesquisa progressiva de arquitetura diferenciável
Pesquisa de arquitetura diferenciável
Se você usar nosso código em sua pesquisa, cite nosso artigo adequadamente.
@inproceedings{ xu2020pcdarts, title={{{}PC{}}-{{}DARTS{}}: conexões de canais parciais para pesquisa de arquitetura com uso eficiente de memória}, autor = {Yuhui Xu e Lingxi Xie e Xiaopeng Zhang e Xin Chen e Guo-Jun Qi e Qi Tian e Hongkai Xiong}, booktitle={Conferência Internacional sobre Representações de Aprendizagem}, ano={2020}, url={https://openreview.net/forum?id=BJlS634tPr} }