code: def main() -> None:
      # instantiate a model (could also be a TensorFlow or JAX model)
      model = tf.keras.applications.ResNet50(weights="imagenet")
      pre = dict(flip_axis=-1, mean=[104.0, 116.0, 123.0])  # RGB to BGR
      fmodel: Model = TensorFlowModel(
          model, bounds=(0, 255), preprocessing=pre
      )
      fmodel = fmodel.transform_bounds((0, 1))
  
      # get data and test the model
      # wrapping the tensors with ep.astensors is optional, but it allows
      # us to work with EagerPy tensors in the following
      images, labels = ep.astensors(
          *samples(fmodel, dataset="imagenet", batchsize=16)
      )
      clean_acc = accuracy(fmodel, images, labels)
      print(f"clean accuracy:  {clean_acc * 100:.1f} %")
  
      # apply the attack
      attack = LinfPGD()
      epsilons = [
          0.0,
          0.0002,
          0.0005,
          0.0008,
          0.001,
          0.0015,
          0.002,
          0.003,
          0.01,
          0.1,
          0.3,
          0.5,
          1.0,
      ]
      raw_advs, clipped_advs, success = attack(
          fmodel, images, labels, epsilons=epsilons
      )
  
      # calculate and report the robust accuracy (the accuracy of the model when
      # it is attacked)
      robust_accuracy = 1 - success.float32().mean(axis=-1)
      print("robust accuracy for perturbations with")
      for eps, acc in zip(epsilons, robust_accuracy):
          print(f"  Linf norm ≤ {eps:<6}: {acc.item() * 100:4.1f} %")
  
      # we can also manually check this
      # we will use the clipped advs instead of the raw advs, otherwise
      # we would need to check if the perturbation sizes are actually
      # within the specified epsilon bound
      print()
      print("we can also manually check this:")
      print()
      print("robust accuracy for perturbations with")
      for eps, advs_ in zip(epsilons, clipped_advs):
          acc2 = accuracy(fmodel, advs_, labels)
          print(f"  Linf norm ≤ {eps:<6}: {acc2 * 100:4.1f} %")
          print("    perturbation sizes:")
          perturbation_sizes = (
              (advs_ - images).norms.linf(axis=(1, 2, 3)).numpy()
          )
          print(
              "    ",
              str(perturbation_sizes).replace("\n", "\n" + "    "),
          )
          if acc2 == 0:
              break
  
imports: import tensorflow
  import eagerpy
  from foolbox import TensorFlowModel, accuracy, samples, Model
  from foolbox.attacks import LinfPGD
label_desc: Use image node_id 1 for calling a global function with example usage: main() without return types