def test_basic_multilayer_wo_mult_by_inputs(self) -> None: model = BasicModel_MultiLayer(inplace=True) model.eval() inputs = torch.tensor([[1.0, 20.0, 10.0]]) baselines = torch.randn(2, 3) self._assert_attributions(model, model.linear1, inputs, baselines, 0, 60)
def test_basic_multilayer(self) -> None: model = BasicModel_MultiLayer(inplace=True) model.eval() inputs = torch.tensor([[1.0, 20.0, 10.0]]) baselines = torch.zeros(2, 3) ngs = NeuronGradientShap(model, model.linear1, multiply_by_inputs=False) attr = ngs.attribute(inputs, 0, baselines=baselines, stdevs=0.0) self.assertFalse(ngs.multiplies_by_inputs) assertTensorAlmostEqual(self, attr, [1.0, 1.0, 1.0])
def test_basic_multilayer(self) -> None: model = BasicModel_MultiLayer(inplace=True) model.eval() inputs = torch.tensor([[1.0, -20.0, 10.0]]) baselines = torch.tensor([[0.0, 0.0, 0.0], [1.0, 1.0, 1.0], [2.0, 2.0, 2.0]]) expected = [[-8.4, 0.0]] self._assert_attributions(model, model.linear2, inputs, baselines, 0, expected)
def test_basic_multilayer_wo_mult_by_inputs_agg_neurons(self) -> None: model = BasicModel_MultiLayer(inplace=True) model.eval() inputs = torch.tensor([[1.0, 20.0, 10.0]]) baselines = torch.randn(2, 3) self._assert_attributions(model, model.linear1, inputs, baselines, (slice(0, 1, 1), ), 60) self._assert_attributions(model, model.linear1, inputs, baselines, lambda x: x[:, 0:1], 60)
def test_basic_multilayer_wo_multiplying_by_inputs(self) -> None: model = BasicModel_MultiLayer(inplace=True) model.eval() inputs = torch.tensor([[1.0, -20.0, 10.0]]) baselines = torch.zeros(3, 3) lgs = LayerGradientShap(model, model.linear2, multiply_by_inputs=False) attrs = lgs.attribute( inputs, baselines, target=0, stdevs=0.0, ) assertTensorAlmostEqual(self, attrs, torch.tensor([[1.0, 0.0]]))
def test_basic_multi_tensor_output(self) -> None: model = BasicModel_MultiLayer(multi_input_module=True) model.eval() inputs = torch.tensor([[0.0, 100.0, 0.0]]) expected = ([90.0, 100.0, 100.0, 100.0], [90.0, 100.0, 100.0, 100.0]) self._assert_attributions( model, model.multi_relu, inputs, torch.zeros_like(inputs), 0, expected, n_samples=5, )
def test_basic_multilayer_with_add_args(self) -> None: model = BasicModel_MultiLayer(inplace=True) model.eval() inputs = torch.tensor([[1.0, -20.0, 10.0]]) add_args = torch.ones(1, 3) baselines = torch.randn(30, 3) expected = [[-13.9510, 0.0]] self._assert_attributions(model, model.linear2, inputs, baselines, 0, expected, add_args=add_args)
def test_basic_multilayer_compare_w_inp_features(self) -> None: model = BasicModel_MultiLayer() model.eval() inputs = torch.tensor([[10.0, 20.0, 10.0]]) baselines = torch.randn(30, 3) gs = GradientShap(model) expected, delta = gs.attribute(inputs, baselines, target=0, return_convergence_delta=True) self.setUp() self._assert_attributions( model, model.linear0, inputs, baselines, 0, (expected, ), expected_delta=delta, attribute_to_layer_input=True, )