class_docstr: A class for modifying a neural nework using many of the operations above. 
class_docstr_tok: ["A","class","for","modifying","a","neural","nework","using","many","of","the","operations","above","."]
docstr: Takes a list of neural network nns and applies the library of changes to it to
  produce a list of modifications.
  num_steps_probs is a list of probabilities that indicate with what probability
  we want to use a certain number of steps.
docstr_tok: ["Takes","a","list","of","neural","network","nns","and","applies","the","library","of","changes","to","it","to","produce","a","list","of","modifications",".","num_steps_probs","is","a","list","of","probabilities","that","indicate","with","what","probability","we","want","to","use","a","certain","number","of","steps","."]
code: def __call__(
      self,
      list_of_nns,
      num_modifications,
      num_steps_probs,
      max_num_steps=None,
      **kwargs,
  ):
      """Takes a list of neural network nns and applies the library of changes to it to
      produce a list of modifications.
      num_steps_probs is a list of probabilities that indicate with what probability
      we want to use a certain number of steps.
      """
      # Preprocessing
      if not hasattr(list_of_nns, "__iter__"):
          list_of_nns = [list_of_nns]
      # determine num_steps_probs
      if num_steps_probs is None and isinstance(
          max_num_steps, (int, float)
      ):
          num_steps_probs = np.ones((max_num_steps,)) / float(
              max_num_steps
          )
      elif isinstance(num_steps_probs, (int, float)):
          num_steps_probs = np.zeros((num_steps_probs,))
          num_steps_probs[-1] = 1.0
      # Determine how many modifications per nn
      nn_idxs = list(range(len(list_of_nns)))
      if hasattr(num_modifications, "__iter__"):
          num_modifs_for_each_nn = num_modifications
      else:
          nn_choices_for_modif = np.random.choice(
              nn_idxs, num_modifications, replace=True
          )
          num_modifs_for_each_nn = [
              np.sum(nn_choices_for_modif == i) for i in nn_idxs
          ]
      # Create a list
      ret = []
      for idx in nn_idxs:
          ret.extend(
              self.get_modifications_for_a_single_nn(
                  list_of_nns[idx],
                  num_modifs_for_each_nn[idx],
                  num_steps_probs,
                  **kwargs,
              )
          )
      return ret
  
imports: from argparse import Namespace
  from copy import deepcopy
  import numpy
  from .neural_network import ConvNeuralNetwork, MultiLayerPerceptron, MLP_RECTIFIERS, MLP_SIGMOIDS, is_a_pooling_layer_label, is_a_conv_layer_label, CNNImageSizeMismatchException, CNNNoConvAfterIPException
  from ..utils.general_utils import reorder_list_or_array, reorder_rows_and_cols_in_matrix
  from ..utils.option_handler import get_option_specs, load_options
  from ..utils.reporters import get_reporter
label_desc: Use image node_id 2 for calling the NNModifier obj's underlying member method code with example usage: obj.__call__(list_of_nns, num_modifications, num_steps_probs, max_num_steps) and returns: ret