class_docstr: Max pooling operation for spatial data.
  Arguments:
      pool_size: integer or tuple of 2 integers,
          factors by which to downscale (vertical, horizontal).
          (2, 2) will halve the input in both spatial dimension.
          If only one integer is specified, the same window length
          will be used for both dimensions.
      strides: Integer, tuple of 2 integers, or None.
          Strides values.
          If None, it will default to `pool_size`.
      padding: One of `"valid"` or `"same"` (case-insensitive).
      data_format: A string,
          one of `channels_last` (default) or `channels_first`.
          The ordering of the dimensions in the inputs.
          `channels_last` corresponds to inputs with shape
          `(batch, height, width, channels)` while `channels_first`
          corresponds to inputs with shape
          `(batch, channels, height, width)`.
  Input shape:
      - If `data_format='channels_last'`:
          4D tensor with shape:
          `(batch_size, rows, cols, channels)`
      - If `data_format='channels_first'`:
          4D tensor with shape:
          `(batch_size, channels, rows, cols)`
  Output shape:
      - If `data_format='channels_last'`:
          4D tensor with shape:
          `(batch_size, pooled_rows, pooled_cols, channels)`
      - If `data_format='channels_first'`:
          4D tensor with shape:
          `(batch_size, channels, pooled_rows, pooled_cols)`
class_docstr_tok: ["Max","pooling","operation","for","spatial","data",".","Arguments",":","pool_size",":","integer","or","tuple","of","2","integers",",","factors","by","which","to","downscale","(","vertical",",","horizontal",")",".","(","2",",","2",")","will","halve","the","input","in","both","spatial","dimension",".","If","only","one","integer","is","specified",",","the","same","window","length","will","be","used","for","both","dimensions",".","strides",":","Integer",",","tuple","of","2","integers",",","or","None",".","Strides","values",".","If","None",",","it","will","default","to","`","pool_size","`",".","padding",":","One","of","`","``","valid","''","`","or","`","``","same","''","`","(","case-insensitive",")",".","data_format",":","A","string",",","one","of","`","channels_last","`","(","default",")","or","`","channels_first","`",".","The","ordering","of","the","dimensions","in","the","inputs",".","`","channels_last","`","corresponds","to","inputs","with","shape","`","(","batch",",","height",",","width",",","channels",")","`","while","`","channels_first","`","corresponds","to","inputs","with","shape","`","(","batch",",","channels",",","height",",","width",")","`",".","Input","shape",":","-","If","`","data_format='channels_last","'","`",":","4D","tensor","with","shape",":","`","(","batch_size",",","rows",",","cols",",","channels",")","`","-","If","`","data_format='channels_first","'","`",":","4D","tensor","with","shape",":","`","(","batch_size",",","channels",",","rows",",","cols",")","`","Output","shape",":","-","If","`","data_format='channels_last","'","`",":","4D","tensor","with","shape",":","`","(","batch_size",",","pooled_rows",",","pooled_cols",",","channels",")","`","-","If","`","data_format='channels_first","'","`",":","4D","tensor","with","shape",":","`","(","batch_size",",","channels",",","pooled_rows",",","pooled_cols",")","`"]
code: def backward(self, d_y):
      x = self._layer_input
      y, y_arg = self._layer_output
  
      if self.data_format != "channels_first":
          d_y = tfe.transpose(d_y, perm=[0, 3, 1, 2])
          y_arg = tfe.transpose(y_arg, perm=[0, 3, 1, 2, 4])
          h_x, w_x = (x.shape[1], x.shape[2])
      else:
          h_x, w_x = (x.shape[2], x.shape[3])
  
      batch, channels, h_y, w_y, pool_len = y_arg.shape
  
      _d_y = tfe.tile(
          tfe.expand_dims(d_y, axis=4), [1, 1, 1, 1, pool_len]
      )
      _d_y = _d_y * y_arg
      _d_y = tfe.reshape(_d_y, [batch * channels, h_y, w_y, pool_len])
  
      d_x = tfe.patches2im(
          _d_y,
          self.pool_size,
          strides=self.strides,
          padding=self.padding,
          img_size=(h_x, w_x),
          consolidation="SUM",
          data_format="NHWC",
      )
      d_x = tfe.reshape(d_x, [batch, channels, h_x, w_x])
  
      if self.data_format != "channels_first":
          d_x = tfe.transpose(d_x, perm=[0, 2, 3, 1])
  
      return [], d_x
  
imports: import math
  from abc import abstractmethod
  from tensorflow.python.keras.utils import conv_utils
  import tf_encrypted
  from tf_encrypted.keras.engine import Layer
label_desc: Use image node_id 3 for calling the MaxPooling2D obj's underlying member method code with example usage: obj.backward(d_y) and returns: list,  d_x