¡PC-DARTS ha sido aceptado para su presentación destacada en ICLR 2020!
PC-DARTS es un método de arquitectura diferenciable con eficiencia de memoria basado en DARTS . Se centra principalmente en reducir el gran coste de memoria de la superred en el método NAS de un solo uso, lo que significa que también se puede combinar con otros métodos NAS de un solo uso, por ejemplo, ENAS . A diferencia de los métodos anteriores de muestreo de operaciones, PC-DARTS muestrea canales de la superred construida. Curiosamente, aunque introdujimos aleatoriedad durante el proceso de búsqueda, ¡el rendimiento de la arquitectura buscada es mejor y más estable que DARTS! Para obtener una descripción detallada de los detalles técnicos y los resultados experimentales, consulte nuestro artículo:
Conexiones de canales parciales para una búsqueda de arquitectura diferenciable con eficiencia de memoria
Yuhui Xu, Lingxi Xie, Xiaopeng Zhang, Xin Chen, Guo-Jun Qi, Qi Tian y Hongkai Xiong.
Este código se basa en la implementación de DARTS.
También se sube para su consideración la implementación del muestreo aleatorio.
Se ha subido el archivo principal para buscar en ImageNet train_search_imagenet.py
.
Método | Parámetros(M) | Error(%) | Costo de búsqueda |
---|---|---|---|
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-DARDOS | 3.6 | 2.57 | 0.1 |
¡Solo se utilizan 0,1 días de GPU para una búsqueda en CIFAR-10!
Método | FLOP | Error principal (%) | Error 5 principales (%) | Costo de búsqueda |
---|---|---|---|---|
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 |
Busque una buena arquitectura en ImageNet utilizando el espacio de búsqueda de DARTS ( ¡primera vez! ).
Para ejecutar nuestro código, solo necesita una Nvidia 1080ti (memoria 11G).
python train_search.py
Preparación de datos: el 10 % y el 2,5 % de las imágenes deben muestrearse aleatoriamente antes de la clase de búsqueda del conjunto de entrenamiento como train y val, respectivamente. Los datos muestreados se guardan en ./imagenet_search
. Tenga en cuenta que no se debe utilizar torch.utils.data.sampler.SubsetRandomSampler para el muestreo de datos ya que imagenet es demasiado 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
¡Muy pronto!.
Para los códigos de la rama principal, se recomienda python2 with pytorch(3.0.1)
(ejecutándose en Nvidia 1080ti
). También proporcionamos códigos en V100_python1.0
si desea implementar PC-DARTS en Tesla V100
con python3+
y pytorch1.0+
.
Incluso puedes ejecutar los códigos en una GPU con memoria solo 4G . PC-DARTS solo cuesta menos que la memoria 4G, si usamos la misma configuración de hiperparámetros que DARTS (tamaño de lote = 64).
¡Puedes buscar en ImageNet mediante model_search_imagenet.py
! El archivo de entrenamiento para la búsqueda en ImageNet se cargará después de limpiarlo o puede generarlo de acuerdo con el archivo train_search en CIFAR10 y el archivo evluate en ImageNet. ¡Los hiperparámetros se informan en nuestro artículo! La búsqueda costó 11,5 horas en 8 GPU V100 (16G cada una). Si tiene V100(32G), puede aumentar aún más el tamaño del lote.
Tomamos muestras aleatorias del 10% y el 2,5% de cada clase de conjunto de datos de entrenamiento de ImageNet. ¡Aún quedan 1000 clases! Reemplazar input_search, target_search = next(iter(valid_queue))
con los siguientes códigos sería mucho más 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)
Los códigos principales de PC-DARTS se encuentran en el archivo model_search.py
. Como se describe en el artículo, utilizamos una forma eficiente de implementar el muestreo de canales. Primero, se selecciona un subconjunto fijo de la entrada para alimentar las operaciones candidatas, luego se intercambia la salida concatenada. Se proporcionan dos operaciones de intercambio eficientes: cambio de canal y cambio de canal. Para la normalización de bordes, definimos parámetros de borde (beta en nuestros códigos) junto con los parámetros alfa en los códigos de dardos originales.
También se proporciona la implementación del muestreo aleatorio model_search_random.py
. También funciona, aunque la reproducción aleatoria de canales puede tener un mejor rendimiento.
Como PC-DARTS es un método NAS con memoria ultraeficiente. Tiene potencial para implementarse en otras tareas como la detección y segmentación.
Búsqueda de arquitectura diferenciable progresiva
Búsqueda de arquitectura diferenciable
Si utiliza nuestro código en su investigación, cite nuestro artículo en consecuencia.
@procedimientos{ xu2020pcdardos, title={{{}PC{}}-{{}DARTS{}}: Conexiones de canales parciales para búsqueda de arquitectura con uso eficiente de la memoria}, autor = {Yuhui Xu y Lingxi Xie y Xiaopeng Zhang y Xin Chen y Guo-Jun Qi y Qi Tian y Hongkai Xiong}, booktitle={Conferencia Internacional sobre Representaciones del Aprendizaje}, año={2020}, URL={https://openreview.net/forum?id=BJlS634tPr} }