This repository contains the code (in PyTorch) for "CondenseNet: An Efficient DenseNet using Learned Group Convolutions" paper by Gao Huang*, Shichen Liu*, Laurens van der Maaten and Kilian Weinberger (* Authors contributed equally).
If you find our project useful in your research, please consider citing:
@inproceedings{huang2018condensenet,
title={Condensenet: An efficient densenet using learned group convolutions},
author={Huang, Gao and Liu, Shichen and Van der Maaten, Laurens and Weinberger, Kilian Q},
booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
pages={2752--2761},
year={2018}
}
CondenseNet is a novel, computationally efficient convolutional network architecture. It combines dense connectivity between layers with a mechanism to remove unused connections. The dense connectivity facilitates feature re-use in the network, whereas learned group convolutions remove connections between layers for which this feature re-use is superfluous. At test time, our model can be implemented using standard grouped convolutions —- allowing for efficient computation in practice. Our experiments demonstrate that CondenseNets are much more efficient than other compact convolutional networks such as MobileNets and ShuffleNets.
Figure 1: Learned Group Convolution with G=C=3.
Figure 2: CondenseNets with Fully Dense Connectivity and Increasing Growth Rate.
As an example, use the following command to train a CondenseNet on ImageNet
python main.py --model condensenet -b 256 -j 20 /PATH/TO/IMAGENET \
--stages 4-6-8-10-8 --growth 8-16-32-64-128 --gpu 0,1,2,3,4,5,6,7 --resume
As another example, use the following command to train a CondenseNet on CIFAR-10
python main.py --model condensenet -b 64 -j 12 cifar10 \
--stages 14-14-14 --growth 8-16-32 --gpu 0 --resume
We take the ImageNet model trained above as an example.
To evaluate the trained model, use evaluate
to evaluate from the default checkpoint directory:
python main.py --model condensenet -b 64 -j 20 /PATH/TO/IMAGENET \
--stages 4-6-8-10-8 --growth 8-16-32-64-128 --gpu 0 --resume \
--evaluate
or use evaluate-from
to evaluate from an arbitrary path:
python main.py --model condensenet -b 64 -j 20 /PATH/TO/IMAGENET \
--stages 4-6-8-10-8 --growth 8-16-32-64-128 --gpu 0 --resume \
--evaluate-from /PATH/TO/BEST/MODEL
Note that these models are still the large models. To convert the model to group-convolution version as described in the paper, use the convert-from
function:
python main.py --model condensenet -b 64 -j 20 /PATH/TO/IMAGENET \
--stages 4-6-8-10-8 --growth 8-16-32-64-128 --gpu 0 --resume \
--convert-from /PATH/TO/BEST/MODEL
Finally, to directly load from a converted model (that is, a CondenseNet), use a converted model file in combination with the evaluate-from
option:
python main.py --model condensenet_converted -b 64 -j 20 /PATH/TO/IMAGENET \
--stages 4-6-8-10-8 --growth 8-16-32-64-128 --gpu 0 --resume \
--evaluate-from /PATH/TO/CONVERTED/MODEL
We also include DenseNet implementation in this repository.
For more examples of usage, please refer to script.sh
For detailed options, please python main.py --help
(* trained 600 epochs)
Inference time on ARM platform Model FLOPs Top-1 Time(s) VGG-16 15,300M 28.5 354 ResNet-18 1,818M 30.2 8.14 1.0 MobileNet-224 569M 29.4 1.96 CondenseNet-74 (C=G=4) 529M 26.2 1.89 CondenseNet-74 (C=G=8) 274M 29.0 0.99liushichen95@gmail.com
gh349@cornell.com
We are working on the implementation on other frameworks.
Any discussions or concerns are welcomed!
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4