class_docstr: Cropping layer for 3D data (e.g. spatial or spatio-temporal).
  
  Examples:
  
  >>> input_shape = (2, 28, 28, 10, 3)
  >>> x = np.arange(np.prod(input_shape)).reshape(input_shape)
  >>> y = keras.layers.Cropping3D(cropping=(2, 4, 2))(x)
  >>> y.shape
  (2, 24, 20, 6, 3)
  
  Args:
      cropping: Int, or tuple of 3 ints, or tuple of 3 tuples of 2 ints.
          - If int: the same symmetric cropping is applied to depth, height,
            and width.
          - If tuple of 3 ints: interpreted as three different symmetric
            cropping values for depth, height, and width:
            `(symmetric_dim1_crop, symmetric_dim2_crop, symmetric_dim3_crop)`.
          - If tuple of 3 tuples of 2 ints: interpreted as
            `((left_dim1_crop, right_dim1_crop), (left_dim2_crop,
            right_dim2_crop), (left_dim3_crop, right_dim3_crop))`.
      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_size, spatial_dim1, spatial_dim2, spatial_dim3, channels)`
          while `"channels_first"` corresponds to inputs with shape
          `(batch_size, channels, spatial_dim1, spatial_dim2, spatial_dim3)`.
          When unspecified, uses `image_data_format` value found in your Keras
          config file at `~/.keras/keras.json` (if exists). Defaults to
          `"channels_last"`.
  
  Input shape:
      5D tensor with shape:
      - If `data_format` is `"channels_last"`:
        `(batch_size, first_axis_to_crop, second_axis_to_crop,
        third_axis_to_crop, channels)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, channels, first_axis_to_crop, second_axis_to_crop,
        third_axis_to_crop)`
  
  Output shape:
      5D tensor with shape:
      - If `data_format` is `"channels_last"`:
        `(batch_size, first_cropped_axis, second_cropped_axis,
        third_cropped_axis, channels)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, channels, first_cropped_axis, second_cropped_axis,
        third_cropped_axis)`
code: def call(self, inputs):
      if self.data_format == "channels_first":
          spatial_dims = list(inputs.shape[2:5])
      else:
          spatial_dims = list(inputs.shape[1:4])
  
      for index in range(0, 3):
          if spatial_dims[index] is None:
              continue
          spatial_dims[index] -= sum(self.cropping[index])
          if spatial_dims[index] <= 0:
              raise ValueError(
                  "Values in `cropping` argument should be smaller than the "
                  "corresponding spatial dimension of the input. Received: "
                  f"inputs.shape={inputs.shape}, cropping={self.cropping}"
              )
  
      if self.data_format == "channels_first":
          if (
              self.cropping[0][1]
              == self.cropping[1][1]
              == self.cropping[2][1]
              == 0
          ):
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] :,
                  self.cropping[2][0] :,
              ]
          elif self.cropping[0][1] == self.cropping[1][1] == 0:
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] :,
                  self.cropping[2][0] : -self.cropping[2][1],
              ]
          elif self.cropping[1][1] == self.cropping[2][1] == 0:
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] : -self.cropping[0][1],
                  self.cropping[1][0] :,
                  self.cropping[2][0] :,
              ]
          elif self.cropping[0][1] == self.cropping[2][1] == 0:
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] : -self.cropping[1][1],
                  self.cropping[2][0] :,
              ]
          elif self.cropping[0][1] == 0:
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] : -self.cropping[1][1],
                  self.cropping[2][0] : -self.cropping[2][1],
              ]
          elif self.cropping[1][1] == 0:
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] : -self.cropping[0][1],
                  self.cropping[1][0] :,
                  self.cropping[2][0] : -self.cropping[2][1],
              ]
          elif self.cropping[2][1] == 0:
              return inputs[
                  :,
                  :,
                  self.cropping[0][0] : -self.cropping[0][1],
                  self.cropping[1][0] : -self.cropping[1][1],
                  self.cropping[2][0] :,
              ]
          return inputs[
              :,
              :,
              self.cropping[0][0] : -self.cropping[0][1],
              self.cropping[1][0] : -self.cropping[1][1],
              self.cropping[2][0] : -self.cropping[2][1],
          ]
      else:
          if (
              self.cropping[0][1]
              == self.cropping[1][1]
              == self.cropping[2][1]
              == 0
          ):
              return inputs[
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] :,
                  self.cropping[2][0] :,
                  :,
              ]
          elif self.cropping[0][1] == self.cropping[1][1] == 0:
              return inputs[
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] :,
                  self.cropping[2][0] : -self.cropping[2][1],
                  :,
              ]
          elif self.cropping[1][1] == self.cropping[2][1] == 0:
              return inputs[
                  :,
                  self.cropping[0][0] : -self.cropping[0][1],
                  self.cropping[1][0] :,
                  self.cropping[2][0] :,
                  :,
              ]
          elif self.cropping[0][1] == self.cropping[2][1] == 0:
              return inputs[
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] : -self.cropping[1][1],
                  self.cropping[2][0] :,
                  :,
              ]
          elif self.cropping[0][1] == 0:
              return inputs[
                  :,
                  self.cropping[0][0] :,
                  self.cropping[1][0] : -self.cropping[1][1],
                  self.cropping[2][0] : -self.cropping[2][1],
                  :,
              ]
          elif self.cropping[1][1] == 0:
              return inputs[
                  :,
                  self.cropping[0][0] : -self.cropping[0][1],
                  self.cropping[1][0] :,
                  self.cropping[2][0] : -self.cropping[2][1],
                  :,
              ]
          elif self.cropping[2][1] == 0:
              return inputs[
                  :,
                  self.cropping[0][0] : -self.cropping[0][1],
                  self.cropping[1][0] : -self.cropping[1][1],
                  self.cropping[2][0] :,
                  :,
              ]
          return inputs[
              :,
              self.cropping[0][0] : -self.cropping[0][1],
              self.cropping[1][0] : -self.cropping[1][1],
              self.cropping[2][0] : -self.cropping[2][1],
              :,
          ]
  
file_path: keras/keras/layers/reshaping/cropping3d.py
imports: from keras import backend
  from keras.api_export import keras_export
  from keras.layers.input_spec import InputSpec
  from keras.layers.layer import Layer
  from keras.utils import argument_validation
label_desc: Use image node_id 3 for calling the Cropping3D obj's underlying member method code with example usage: obj.call(inputs) and returns: inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs, inputs