class_docstr: L1 Projected Gradient Descent
  
  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.
class_docstr_tok: ["L1","Projected","Gradient","Descent","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","."]
code: def __init__(
      self,
      *,
      rel_stepsize: float = 0.025,
      abs_stepsize: Optional[float] = None,
      steps: int = 50,
      random_start: bool = True,
  ):
      super().__init__(
          rel_stepsize=rel_stepsize,
          abs_stepsize=abs_stepsize,
          steps=steps,
          random_start=random_start,
      )
  
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 1 to create a new L1ProjectedGradientDescentAttack object from inherited base classes: L1BaseGradientDescent with example: obj = L1ProjectedGradientDescentAttack()