code: def __init__(self, model, data):
      # try and import pytorch
      global torch
      if torch is None:
          import torch
  
          if version.parse(torch.__version__) < version.parse("0.4"):
              warnings.warn(
                  "Your PyTorch version is older than 0.4 and not supported."
              )
  
      # check if we have multiple inputs
      self.multi_input = False
      if isinstance(data, list):
          self.multi_input = True
      if not isinstance(data, list):
          data = [data]
      self.data = data
      self.layer = None
      self.input_handle = None
      self.interim = False
      self.interim_inputs_shape = None
      self.expected_value = None  # to keep the DeepExplainer base happy
      if type(model) == tuple:
          self.interim = True
          model, layer = model
          model = model.eval()
          self.layer = layer
          self.add_target_handle(self.layer)
  
          # if we are taking an interim layer, the 'data' is going to be the input
          # of the interim layer; we will capture this using a forward hook
          with torch.no_grad():
              _ = model(*data)
              interim_inputs = self.layer.target_input
              if type(interim_inputs) is tuple:
                  # this should always be true, but just to be safe
                  self.interim_inputs_shape = [
                      i.shape for i in interim_inputs
                  ]
              else:
                  self.interim_inputs_shape = [interim_inputs.shape]
          self.target_handle.remove()
          del self.layer.target_input
      self.model = model.eval()
  
      self.multi_output = False
      self.num_outputs = 1
      with torch.no_grad():
          outputs = model(*data)
  
          # also get the device everything is running on
          self.device = outputs.device
          if outputs.shape[1] > 1:
              self.multi_output = True
              self.num_outputs = outputs.shape[1]
          self.expected_value = outputs.mean(0).cpu().numpy()
  
file_path: shap/shap/explainers/_deep/deep_pytorch.py
imports: import warnings
  import numpy
  from packaging import version
  from .._explainer import Explainer
  from .deep_utils import _check_additivity
label_desc: Use image node_id 1 to create a new PyTorchDeep object from inherited base classes: Explainer with example: obj = PyTorchDeep(model, data)