class_docstr: Two-dimensional pooling layer.
  
  Parameters
  ----------
  input_size : tuple
      the size of the input.
  output_size : tuple
      the size of the output.
  strides : matrix-like
      stride of the kernel.
  pool_func : str
      name of function used to pool values in a kernel to a single value.
  transpose : bool
      True iff input matrix is accepted in transposed (i.e. column-major)
      form.
  activation : str or None
      activation function name
  input_index_mapper : IndexMapper or None
      map indexes from this layer index to the input layer index size
code: def __init__(
      self,
      input_size,
      output_size,
      strides,
      pool_func_name,
      kernel_shape,
      kernel_depth,
      *,
      activation=None,
      input_index_mapper=None,
  ):
      super().__init__(
          input_size,
          output_size,
          strides,
          activation=activation,
          input_index_mapper=input_index_mapper,
      )
      if pool_func_name not in PoolingLayer2D._POOL_FUNCTIONS:
          raise ValueError(
              f"Allowable pool functions are {PoolingLayer2D._POOL_FUNCTIONS}, {pool_func_name} was provided."
          )
      self._pool_func_name = pool_func_name
      self._kernel_shape = kernel_shape
      self._kernel_depth = kernel_depth
  
imports: import itertools
  import numpy
label_desc: Use image node_id 1 to create a new PoolingLayer2D object from inherited base classes: Layer2D with example: obj = PoolingLayer2D(input_size, output_size, strides, pool_func_name, kernel_shape, kernel_depth)