PyTorch implementation of binary neural networks
Implementation of some architectures from Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation in Pytorch
All architectures are based on ResNet18 now.
There are two groups of models:
When we train binary neural networks we usually use quantized weights and activations for forward and backward passes and full-precision weights for update.
That’s why usual backward pass and weights update
optimizer.zero_grad()
loss.backward()
optimizer.step()
should be changed with:
optimizer.zero_grad()
loss.backward()
for p in list(model.parameters()):
if hasattr(p, 'original'):
p.data.copy_(p.original)
optimizer.step()
for p in list(model.parameters()):
if hasattr(p, 'original'):
p.original.copy_(p.data.clamp_(-1, 1))
Some changes were made into models with fusion gate to make them ONNX-compatible.
Models for training use modules with custom backward function, that can’t be converted with ONNX, that’s why they are changed with simple sign function for inference.
To create inference model you should pass freeze=True
flag.
Proper initialization for inference models: