Source code for test_bayesian_resnet

import unittest
import numpy as np
import torch
import h0rton.models as models

[docs]class TestBayesianResNet(unittest.TestCase): """A suite of tests on ResNet models """ @classmethod
[docs] def setUpClass(cls): cls.Y_dim = 12 cls.out_dim = cls.Y_dim**2 + 3*cls.Y_dim + 1 cls.dropout_rate = 0.05 cls.batch_size = 7 cls.dummy_X = torch.randn(cls.batch_size, 1, 64, 64) cls.dummy_Y = torch.randn(cls.batch_size, cls.out_dim)
[docs] def test_bayesian_resnet_forward(self): """Test instantiation and forward method of BayesianResNet """ resnet34 = models.resnet34(num_classes=self.out_dim, dropout_rate=self.dropout_rate) pred34 = resnet34.forward(self.dummy_X) resnet44 = models.resnet44(num_classes=self.out_dim, dropout_rate=self.dropout_rate) pred44 = resnet44.forward(self.dummy_X) resnet56 = models.resnet56(num_classes=self.out_dim, dropout_rate=self.dropout_rate) pred56 = resnet56.forward(self.dummy_X) resnet50 = models.resnet50(num_classes=self.out_dim, dropout_rate=self.dropout_rate) pred50 = resnet50.forward(self.dummy_X) resnet101 = models.resnet101(num_classes=self.out_dim, dropout_rate=self.dropout_rate) pred101 = resnet101.forward(self.dummy_X) np.testing.assert_array_equal(pred34.shape, [self.batch_size, self.out_dim], err_msg="output shape of resnet34") np.testing.assert_array_equal(pred44.shape, [self.batch_size, self.out_dim], err_msg="output shape of resnet44") np.testing.assert_array_equal(pred56.shape, [self.batch_size, self.out_dim], err_msg="output shape of resnet56") np.testing.assert_array_equal(pred50.shape, [self.batch_size, self.out_dim], err_msg="output shape of resnet50") np.testing.assert_array_equal(pred101.shape, [self.batch_size, self.out_dim], err_msg="output shape of resnet101")
[docs] def test_bayesian_resnet_dropout(self): """Test if dropout rate is propagated to basic blocks """ resnet44 = models.resnet44(num_classes=self.out_dim, dropout_rate=self.dropout_rate) # Take the first BasicBlock in each layer assert resnet44.layer1[0].dropout_rate == self.dropout_rate assert resnet44.layer2[0].dropout_rate == self.dropout_rate assert resnet44.layer3[0].dropout_rate == self.dropout_rate
[docs] def test_activation_maps_layer3(self): """Test if the 3-layer BNN has the correctly shaped activation maps (intermediate feature maps) """ bnn = models.resnet44(num_classes=self.out_dim, dropout_rate=self.dropout_rate) activations = bnn._forward_debug(self.dummy_X) np.testing.assert_array_equal(activations[0], self.dummy_X.shape, err_msg="input") np.testing.assert_array_equal(activations[1], [self.batch_size, 64, 32, 32], err_msg="after conv1 with stride 2") np.testing.assert_array_equal(activations[2], [self.batch_size, 64, 16, 16], err_msg="after maxpool") np.testing.assert_array_equal(activations[3], [self.batch_size, 64, 16, 16], err_msg="after layer1") np.testing.assert_array_equal(activations[4], [self.batch_size, 128, 8, 8], err_msg="after layer2") np.testing.assert_array_equal(activations[5], [self.batch_size, 256, 4, 4], err_msg="after layer3") np.testing.assert_array_equal(activations[6], [self.batch_size, 256, 4, 4], err_msg="after layer4") np.testing.assert_array_equal(activations[7], [self.batch_size, 256, 1, 1], err_msg="after avgpool") np.testing.assert_array_equal(activations[-1], [self.batch_size, self.out_dim], err_msg="output")
[docs] def test_activation_maps_layer4(self): """Test if the 4-layer BNN has the correctly shaped activation maps """ bnn = models.resnet34(num_classes=self.out_dim, dropout_rate=self.dropout_rate) activations = bnn._forward_debug(self.dummy_X) np.testing.assert_array_equal(activations[0], self.dummy_X.shape, err_msg="input") np.testing.assert_array_equal(activations[1], [self.batch_size, 64, 32, 32], err_msg="after conv1 with stride 2") np.testing.assert_array_equal(activations[2], [self.batch_size, 64, 16, 16], err_msg="after maxpool") np.testing.assert_array_equal(activations[3], [self.batch_size, 64, 16, 16], err_msg="after layer1") np.testing.assert_array_equal(activations[4], [self.batch_size, 128, 8, 8], err_msg="after layer2") np.testing.assert_array_equal(activations[5], [self.batch_size, 256, 4, 4], err_msg="after layer3") np.testing.assert_array_equal(activations[6], [self.batch_size, 512, 2, 2], err_msg="after layer4") np.testing.assert_array_equal(activations[7], [self.batch_size, 512, 1, 1], err_msg="after avgpool") np.testing.assert_array_equal(activations[-1], [self.batch_size, self.out_dim], err_msg="output")
if __name__ == '__main__': unittest.main()