def _compute_attribution_batch_helper_evaluate( self, model: Module, inputs: TensorOrTupleOfTensorsGeneric, baselines: Union[None, Tensor, Tuple[Tensor, ...]] = None, target: Union[None, int] = None, additional_forward_args: Any = None, approximation_method: str = "gausslegendre", ) -> None: ig = IntegratedGradients(model) if not isinstance(inputs, tuple): inputs = (inputs, ) # type: ignore inputs: Tuple[Tensor, ...] if baselines is not None and not isinstance(baselines, tuple): baselines = (baselines, ) if baselines is None: baselines = _tensorize_baseline(inputs, _zeros(inputs)) for internal_batch_size in [None, 10, 20]: attributions, delta = ig.attribute( inputs, baselines, additional_forward_args=additional_forward_args, method=approximation_method, n_steps=100, target=target, internal_batch_size=internal_batch_size, return_convergence_delta=True, ) total_delta = 0.0 for i in range(inputs[0].shape[0]): attributions_indiv, delta_indiv = ig.attribute( tuple(input[i:i + 1] for input in inputs), tuple(baseline[i:i + 1] for baseline in baselines), additional_forward_args=additional_forward_args, method=approximation_method, n_steps=100, target=target, internal_batch_size=internal_batch_size, return_convergence_delta=True, ) total_delta += abs(delta_indiv).sum().item() for j in range(len(attributions)): assertTensorAlmostEqual( self, attributions[j][i:i + 1].squeeze(0), attributions_indiv[j].squeeze(0), delta=0.05, mode="max", ) self.assertAlmostEqual(abs(delta).sum().item(), total_delta, delta=0.005)
def _compute_attribution_and_evaluate( self, model: Module, inputs: TensorOrTupleOfTensorsGeneric, baselines: BaselineType = None, target: Union[None, int] = None, additional_forward_args: Any = None, type: str = "vanilla", approximation_method: str = "gausslegendre", multiply_by_inputs=True, ) -> Tuple[Tensor, ...]: r""" attrib_type: 'vanilla', 'smoothgrad', 'smoothgrad_sq', 'vargrad' """ ig = IntegratedGradients(model, multiply_by_inputs=multiply_by_inputs) self.assertEquals(ig.multiplies_by_inputs, multiply_by_inputs) if not isinstance(inputs, tuple): inputs = (inputs,) # type: ignore inputs: Tuple[Tensor, ...] if baselines is not None and not isinstance(baselines, tuple): baselines = (baselines,) if baselines is None: baselines = _tensorize_baseline(inputs, _zeros(inputs)) if type == "vanilla": attributions, delta = ig.attribute( inputs, baselines, additional_forward_args=additional_forward_args, method=approximation_method, n_steps=500, target=target, return_convergence_delta=True, ) model.zero_grad() attributions_without_delta, delta = ig.attribute( inputs, baselines, additional_forward_args=additional_forward_args, method=approximation_method, n_steps=500, target=target, return_convergence_delta=True, ) model.zero_grad() self.assertEqual([inputs[0].shape[0]], list(delta.shape)) delta_external = ig.compute_convergence_delta( attributions, baselines, inputs, target=target, additional_forward_args=additional_forward_args, ) assertArraysAlmostEqual(delta, delta_external, 0.0) else: nt = NoiseTunnel(ig) n_samples = 5 attributions, delta = nt.attribute( inputs, nt_type=type, nt_samples=n_samples, stdevs=0.00000002, baselines=baselines, target=target, additional_forward_args=additional_forward_args, method=approximation_method, n_steps=500, return_convergence_delta=True, ) with self.assertWarns(DeprecationWarning): attributions_without_delta = nt.attribute( inputs, nt_type=type, n_samples=n_samples, stdevs=0.00000002, baselines=baselines, target=target, additional_forward_args=additional_forward_args, method=approximation_method, n_steps=500, ) self.assertEquals(nt.multiplies_by_inputs, multiply_by_inputs) self.assertEqual([inputs[0].shape[0] * n_samples], list(delta.shape)) for input, attribution in zip(inputs, attributions): self.assertEqual(attribution.shape, input.shape) if multiply_by_inputs: self.assertTrue(all(abs(delta.numpy().flatten()) < 0.07)) # compare attributions retrieved with and without # `return_convergence_delta` flag for attribution, attribution_without_delta in zip( attributions, attributions_without_delta ): assertTensorAlmostEqual( self, attribution, attribution_without_delta, delta=0.05 ) return cast(Tuple[Tensor, ...], attributions)