code: def _FGSM_assert(
      self,
      model: Callable,
      inputs: TensorOrTupleOfTensorsGeneric,
      target: Any,
      epsilon: float,
      answer: Union[TensorLikeList, Tuple[TensorLikeList, ...]],
      targeted=False,
      additional_inputs: Any = None,
      lower_bound: float = float("-inf"),
      upper_bound: float = float("inf"),
      mask: Optional[TensorOrTupleOfTensorsGeneric] = None,
  ) -> None:
      adv = FGSM(
          model, lower_bound=lower_bound, upper_bound=upper_bound
      )
      perturbed_input = adv.perturb(
          inputs, epsilon, target, additional_inputs, targeted, mask
      )
      if isinstance(perturbed_input, Tensor):
          assertTensorAlmostEqual(
              self, perturbed_input, answer, delta=0.01, mode="max"
          )
      else:
          for i in range(len(perturbed_input)):
              assertTensorAlmostEqual(
                  self,
                  perturbed_input[i],
                  answer[i],
                  delta=0.01,
                  mode="max",
              )
  
imports: from typing import Any, Callable, List, Optional, Tuple, Union
  import torch
  from captum._utils.typing import TensorLikeList, TensorOrTupleOfTensorsGeneric
  from captum.robust import FGSM
  from tests.helpers.basic import assertTensorAlmostEqual, BaseTest
  from tests.helpers.basic_models import BasicModel, BasicModel2, BasicModel_MultiLayer
  from torch import Tensor
  from torch.nn import CrossEntropyLoss
label_desc: Use image node_id 15 for calling the Test obj's underlying member method code with example usage: obj._FGSM_assert(model, inputs, target, epsilon, answer, targeted, additional_inputs, lower_bound, upper_bound, mask) without return types