Source code for secml.explanation.c_explainer_gradient_input
"""
.. module:: CExplainerGradientInput
:synopsis: Explanation of predictions via gradient*input vector.
.. moduleauthor:: Marco Melis <marco.melis@unica.it>
"""
from secml.array import CArray
from secml.explanation import CExplainerGradient
[docs]class CExplainerGradientInput(CExplainerGradient):
"""Explanation of predictions via gradient*input vector.
The relevance `rv` of each features is given by:
.. math::
rv_i(x) = \\left(x_i * \\frac{\\partial F(x)}{\\partial x_i}\\right)
- A. Shrikumar, P. Greenside, A. Shcherbina, A. Kundaje,
"Not just a blackbox: Learning important features through propagating
activation differences", 2016 arXiv:1605.01713.
- M. Melis, D. Maiorca, B. Biggio, G. Giacinto and F. Roli,
"Explaining Black-box Android Malware Detection,"
2018 26th European Signal Processing Conference (EUSIPCO),
Rome, 2018, pp. 524-528.
Parameters
----------
clf : CClassifier
Instance of the classifier to explain. Must be differentiable.
Attributes
----------
class_type : 'gradient-input'
"""
__class_type = 'gradient-input'
[docs] def explain(self, x, y, return_grad=False):
"""Computes the explanation for input sample.
Parameters
----------
x : CArray
Input sample.
y : int
Class wrt compute the classifier gradient.
return_grad : bool, optional
If True, also return the clf gradient computed on x. Default False.
Returns
-------
relevance : CArray
Relevance vector for input sample.
"""
grad = self.clf.grad_f_x(x, y=y)
rv = x * grad # Directional derivative
self.logger.debug(
"Relevance Vector:\n{:}".format(rv))
return (rv, grad) if return_grad is True else rv