efficient_densenet_pytorch
1.0.0
pytorch> = 1.0登錄實現,優化以保存GPU內存。
儘管在深度學習框架中易於實現,但大多數暗示(例如原始)往往是渴望記憶的。特別是,通過批處理標準化和串聯操作生成的中間特徵圖的數量隨著網絡深度而倍增。值得強調的是,這不是登記材料固有的財產,而是實施的屬性。
該實施採用新的策略來減少登錄的記憶消耗。我們使用檢查點來計算批處理標準和串聯特徵圖。這些中間特徵地圖在向前傳球期間被丟棄,並重新計算為向後通行證。這增加了15-20%的時間開銷供培訓,但將特徵圖的消耗從二次變為線性。
該技術報告的啟發是此實現的啟發,該報告概述了通過內存共享的有效緻密材料的策略。
在您現有的項目中: models文件夾中有一個文件。
models/densenet.py是基於火炬和項目殺手實現的實現。如果您關心速度,而不是一種內存,則將efficient=False參數傳遞到DenseNet構造函數中。否則,通過efficient=True 。
選項:
block_config選項控制efficient=True使用內存效率版本small_inputs=False 。對於CIFAR或SVHN,設置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上進行了測試):
| 執行 | 記憶助理(GB/GPU) | 速度(SEC/迷你批次) |
|---|---|---|
| 幼稚的 | 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}
}