Sample-Analytic Gradient Estimators for Stochastic Binary Networks

Gradient Accuracy Evaluation

run python gradeva/test_grad1.py

This will read model parameters in the saved chekpoints, estimate gradient using different methods, including the exact enumeration method and produce the plots in exp/gradeval/chk-*/test_grad/score/

The number of samples may be set in the "main". For this test, we use a basic non-optimized implementation of all methods found in gradeval/model.py

PSA CUDA extension

To be able to run PSA method, it is needed to compile the CUDA extension. This is done by running

python extensions/setup.py

This should do the job, but there might be issues with the version of cmake and compute capability settings. Go to the directory ./extensions/ration_conv2d/. You need to build it using cmake. In CMakeLists.txt choose the GPU compute capability in set(CMAKE_CUDA_ARCHITECTURES "60;61") If you were able to work through these, copy the dynamic library generated in extensions/build/lib-platform/ e.g. extensions/lib.linux-x86_64-3.7/ratio_conv2d.cpython-37m-x86_64-linux-gnu.so Copy that to extensions/ Test the extension by running python /extensions/ratio_conv.py The test should verify th

Learning Experiments

For the learning experiments we used optimized implementations of all methods found in models/methods.py The experiments from the paper can be reproduced by running experiments/exp_cifar3.py

This will configure and run sequentially all methods. Executing it in a parallel process will learn using the next method on the list, i.e. in parallel. The learning may be continued from the last state by running

experiments/train.py runs/CIFAR/CIFAR_S1-NLL-FlipCrop/train.method=ST #epochs

The learning will save logs and plot results in runs/CIFAR/CIFAR_S1-NLL-FlipCrop/