A Pytorch> = 1.0 Реализация Densenets, оптимизированную для сохранения памяти GPU.
В то время как денсенеты довольно легко реализовать в рамках глубокого обучения, большинство имплеменций (например, оригинал), как правило, жаждут памяти. В частности, количество промежуточных карт признаков, генерируемых с помощью операций нормализации пакетов и конкатенации, увеличивается квадратично с глубиной сети. Стоит подчеркнуть, что это не собственность, присущая тряски, а скорее реализации.
Эта реализация использует новую стратегию для снижения потребления памяти денсенотов. Мы используем контрольно -пропускную точку для вычисления карт партии нормы и функций конкатенации. Эти промежуточные карты функций отбрасываются во время переднего прохода и перечисляются для обратного прохода. Это добавляет 15-20% времени на накладные расходы для обучения, но снижает потребление карты признаков от квадратичного до линейного.
Эта реализация вдохновлена этим техническим отчетом, в котором изложена стратегия эффективных ткани посредством обмена памятью.
В вашем существующем проекте: в папке models есть один файл.
models/densenet.py - это реализация, основанная на реализации Torchvision и Project Killer. Если вы заботитесь о скорости, а память не является вариантом, передайте efficient=False аргумент в конструктор DenseNet . В противном случае, пройти в efficient=True .
Параметры:
block_configefficient=True использует версию с эффективной памятьюsmall_inputs=False . Для cifar или svhn set small_inputs=True .Запуск демонстрации:
Единственный дополнительный пакет, который вам нужно установить, это Python-Fire:
pip install fireCUDA_VISIBLE_DEVICES=0 python demo.py --efficient True --data < path_to_folder_with_cifar 10> --save < path_to_save_dir >CUDA_VISIBLE_DEVICES=0,1,2 python demo.py --efficient True --data < path_to_folder_with_cifar 10> --save < path_to_save_dir >Параметры:
--depth (int) -глубина сети (количество слоев свертки) (по умолчанию 40)--growth_rate (int) -количество функций, добавленных на слой Densenet (по умолчанию 12)--n_epochs (int) -количество эпох для обучения (по умолчанию 300)--batch_size (int) -размер Minibatch (по умолчанию 256)--seed (int) -вручную установить случайное семя (по умолчанию нет) Сравнение двух реализаций (каждая представляет собой Densenet-BC с 100 слоями, размер партии 64, протестированный на Nvidia Pascal Titan-X):
| Выполнение | Coscoman (GB/GPU) | Скорость (Sec/Mini Parath) |
|---|---|---|
| Наив | 2.863 | 0,165 |
| Эффективный | 1.605 | 0,207 |
| Эффективно (мульти-GPU) | 0,985 | - |
@article{pleiss2017memory,
title={Memory-Efficient Implementation of DenseNets},
author={Pleiss, Geoff and Chen, Danlu and Huang, Gao and Li, Tongcheng and van der Maaten, Laurens and Weinberger, Kilian Q},
journal={arXiv preprint arXiv:1707.06990},
year={2017}
}