Skip to content

Bayesian Convolutional Neural Network with Variational Inference based on Bayes by Backprop in PyTorch.

License

Notifications You must be signed in to change notification settings

illyygrd/PyTorch-BayesianCNN

 
 

Repository files navigation

import os import sys import math import pytest import unittest import numpy as np import torch import torch.nn as nn

import utils from models.BayesianModels.Bayesian3Conv3FC import BBB3Conv3FC from models.BayesianModels.BayesianAlexNet import BBBAlexNet from models.BayesianModels.BayesianLeNet import BBBLeNet from models.NonBayesianModels.AlexNet import AlexNet from models.NonBayesianModels.LeNet import LeNet from models.NonBayesianModels.ThreeConvThreeFC import ThreeConvThreeFC from layers.BBBConv import BBBConv2d from layers.BBBLinear import BBBLinear from layers.misc import FlattenLayer

cuda_available = torch.cuda.is_available() bayesian_models = [BBBLeNet, BBBAlexNet, BBB3Conv3FC] non_bayesian_models = [LeNet, AlexNet, ThreeConvThreeFC]

class TestModelForwardpass:

@pytest.mark.parametrize("model", bayesian_models)
def test_cpu_bayesian(self, model):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 3, 32, 32))
    net = model(10, 3)
    out = net(batch)
    assert out[0].shape[0]==batch_size

@pytest.mark.parametrize("model", non_bayesian_models)
def test_cpu_frequentist(self, model):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 3, 32, 32))
    net = model(10, 3)
    out = net(batch)
    assert out.shape[0]==batch_size

@pytest.mark.skipif(not cuda_available, reason="CUDA not available")
@pytest.mark.parametrize("model", bayesian_models)
def test_gpu_bayesian(self, model):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 3, 32, 32))
    net = model(10, 3)
    if cuda_available:
        net = net.cuda()
        batch = batch.cuda()
    out = net(batch)
    assert out[0].shape[0]==batch_size

@pytest.mark.skipif(not cuda_available, reason="CUDA not available")
@pytest.mark.parametrize("model", non_bayesian_models)
def test_gpu_frequentist(self, model):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 3, 32, 32))
    net = model(10, 3)
    if cuda_available:
        net = net.cuda()
        batch = batch.cuda()
    out = net(batch)
    assert out.shape[0]==batch_size

class TestBayesianLayers:

def test_flatten(self):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 64, 4, 4))

    layer = FlattenLayer(4 * 4 * 64)
    batch = layer(batch)

    assert batch.shape[0]==batch_size
    assert batch.shape[1]==(4 * 4 *64)

def test_conv(self):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 16, 24, 24))

    layer = BBBConv2d(16, 6, 4, alpha_shape=(1,1), padding=0, bias=False)
    batch = layer(batch)

    assert batch.shape[0]==batch_size
    assert batch.shape[1]==6

def test_linear(self):
    batch_size = np.random.randint(1, 256)
    batch = torch.randn((batch_size, 128))

    layer = BBBLinear(128, 64, alpha_shape=(1,1), bias=False)
    batch = layer(batch)

    assert batch.shape[0]==batch_size
    assert batch.shape[1]==64

About

Bayesian Convolutional Neural Network with Variational Inference based on Bayes by Backprop in PyTorch.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%