docs: def make_step(
      net,
      step_size = 1.5,
      end       = "inception_4c/output", 
      jitter    = 32,
      clip      = True,
      objective = objective_L2
      ):
      '''
      basic gradient ascent step
      '''
  
      src = net.blobs["data"]
      dst = net.blobs[end]
  
      ox, oy = np.random.randint(- jitter, jitter + 1, 2)
      # Apply jitter shift.
      src.data[0] = np.roll(np.roll(src.data[0], ox, -1), oy, -2)
  
      # Specify the optimisation objective.
      net.forward(end = end)
      objective(dst)
      net.backward(start = end)
      g = src.diff[0]
      # Apply normalised ascent step to the input image.
      src.data[:] += step_size / np.abs(g).mean() * g
      # Unshift the image.
      src.data[0] = np.roll(np.roll(src.data[0], - ox, - 1), -oy, -2)
              
      if clip:
          bias = net.transformer.mean["data"]
          src.data[:] = np.clip(src.data, -bias, 255-bias)