A PyTorch implementation of "Incremental Network Quantization: Towards Lossless CNNs with Low-Precision Weights"
@inproceedings{zhou2017,
title={Incremental Network Quantization: Towards Lossless CNNs with Low-Precision Weights},
author={Aojun Zhou, Anbang Yao, Yiwen Guo, Lin Xu, Yurong Chen},
booktitle={International Conference on Learning Representations,ICLR2017},
year={2017},
}
Official Caffe implementation is available [here] (Code in this repo is based on the paper and not on the official Caffe implementation)
The code is implemented in Python 3.7 and PyTorch 1.1
pip install -e .
inq.SGD(...)
implements SGD that only updates weights according to the weight partitioning scheme of INQ.
inq.INQScheduler(...)
handles the the weight partitioning and group-wise quantization stages of the incremental network quantization procedure.
reset_lr_scheduler(...)
resets the learning rate scheduler.
The INQ training procedure looks like the following:
optimizer = inq.SGD(...)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, ...)
inq_scheduler = inq.INQScheduler(optimizer, [0.5, 0.75, 0.82, 1.0], strategy="pruning")
for inq_step in range(3): # Iteration for accumulated quantized weights of 50% 75% and 82%
inq.reset_lr_scheduler(scheduler)
inq_scheduler.step()
for epoch in range(5):
scheduler.step()
train(...)
inq_scheduler.step() # quantize all weights, further training is useless
validate(...)
examples/imagenet_quantized.py
is a modified version of the official PyTorch imagenet example.
Using this example you can quantize a pretrained model on imagenet.
Compare the file to the original example to see the differences.
Results using this code differ slightly from the results reported in the paper.
Network | Strategy | Bit-width | Top-1 Accuracy | Top-5 Accuracy |
---|---|---|---|---|
resnet18 | ref | 32 | 69.758% | 89.078% |
resnet18 | pruning | 5 | 69.64% | 89.07% |