class_docstr: L2 Projected Gradient Descent with Adam optimizer
  
  Args:
      rel_stepsize: Stepsize relative to epsilon
      abs_stepsize: If given, it takes precedence over rel_stepsize.
      steps : Number of update steps to perform.
      random_start : Whether the perturbation is initialized randomly or starts at zero.
      adam_beta1 : beta_1 parameter of Adam optimizer
      adam_beta2 : beta_2 parameter of Adam optimizer
      adam_epsilon : epsilon parameter of Adam optimizer responsible for numerical stability
class_docstr_tok: ["L2","Projected","Gradient","Descent","with","Adam","optimizer","Args",":","rel_stepsize",":","Stepsize","relative","to","epsilon","abs_stepsize",":","If","given",",","it","takes","precedence","over","rel_stepsize",".","steps",":","Number","of","update","steps","to","perform",".","random_start",":","Whether","the","perturbation","is","initialized","randomly","or","starts","at","zero",".","adam_beta1",":","beta_1","parameter","of","Adam","optimizer","adam_beta2",":","beta_2","parameter","of","Adam","optimizer","adam_epsilon",":","epsilon","parameter","of","Adam","optimizer","responsible","for","numerical","stability"]
code: def get_optimizer(self, x: ep.Tensor, stepsize: float) -> Optimizer:
      return AdamOptimizer(
          x,
          stepsize,
          self.adam_beta1,
          self.adam_beta2,
          self.adam_epsilon,
      )
  
imports: from typing import Optional
  from .gradient_descent_base import L1BaseGradientDescent, AdamOptimizer, Optimizer
  from .gradient_descent_base import L2BaseGradientDescent
  from .gradient_descent_base import LinfBaseGradientDescent
  import eagerpy
label_desc: Use image node_id 2 for calling the L2AdamProjectedGradientDescentAttack obj's underlying member method code with example usage: obj.get_optimizer(x, stepsize) and returns: AdamOptimizer