code: # -*- coding: utf-8 -*-
  """
  Created on 2019/8/4 上午9:45
  
  @author: mick.yi
  
  """
  import torch
  from torch import nn
  import numpy as np
  
  
  class GuidedBackPropagation(object):
  
      def __init__(self, net):
          self.net = net
          for (name, module) in self.net.named_modules():
              if isinstance(module, nn.ReLU):
                  module.register_backward_hook(self.backward_hook)
          self.net.eval()
  
      @classmethod
      def backward_hook(cls, module, grad_in, grad_out):
          """
  
          :param module:
          :param grad_in: tuple,长度为1
          :param grad_out: tuple,长度为1
          :return: tuple(new_grad_in,)
          """
          return torch.clamp(grad_in[0], min=0.0),
  
      def __call__(self, inputs, index=None):
          """
  
          :param inputs: [1,3,H,W]
          :param index: class_id
          :return:
          """
          self.net.zero_grad()
          output = self.net(inputs)  # [1,num_classes]
          if index is None:
              index = np.argmax(output.cpu().data.numpy())
          target = output[0][index]
  
          target.backward()
  
          return inputs.grad[0]  # [3,H,W]
  
apis: torch.clamp