cropping layer for 1d input e g temporal sequence it crops along the time dimension axis 1 examples inputshape 2 3 2 x np arangenp prodinputshape reshapeinputshape x 0 1 2 3 4 5 6 7 8 9 10 11 y keras layers cropping1dcropping1x y 2 3 8 9 args cropping int or tuple of int length 2 or dictionary if int how many units should be trimmed off at the beginning and end of the cropping dimension axis 1 if tuple of 2 ints how many units should be trimmed off at the beginning and end of the cropping dimension leftcrop rightcrop input shape 3d tensor with shape batchsize axistocrop features output shape 3d tensor with shape batchsize croppedaxis features cropping layer for 1d input e g temporal sequence it crops along the time dimension axis 1 examples input_shape 2 3 2 x np arange np prod input_shape reshape input_shape x 0 1 2 3 4 5 6 7 8 9 10 11 y keras layers cropping1d cropping 1 x y 2 3 8 9 args cropping int or tuple of int length 2 or dictionary if int how many units should be trimmed off at the beginning and end of the cropping dimension axis 1 if tuple of 2 ints how many units should be trimmed off at the beginning and end of the cropping dimension left_crop right_crop input shape 3d tensor with shape batch_size axis_to_crop features output shape 3d tensor with shape batch_size cropped_axis features
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


@keras_export("keras.layers.Cropping1D")
class Cropping1D(Layer):
    

    def __init__(self, cropping=(1, 1), **kwargs):
        super().__init__(**kwargs)
        self.cropping = argument_validation.standardize_tuple(
            cropping, 2, "cropping", allow_zero=True
        )
        self.input_spec = InputSpec(ndim=3)

    def compute_output_shape(self, input_shape):
        if input_shape[1] is not None:
            length = input_shape[1] - self.cropping[0] - self.cropping[1]
            if length <= 0:
                raise ValueError(
                    "`cropping` parameter of `Cropping1D` layer must be "
                    "greater than the input length. Received: input_shape="
                    f"{input_shape}, cropping={self.cropping}"
                )
        else:
            length = None
        return (input_shape[0], length, input_shape[2])

    def call(self, inputs):
        if (
            inputs.shape[1] is not None
            and sum(self.cropping) >= inputs.shape[1]
        ):
            raise ValueError(
                "`cropping` parameter of `Cropping1D` layer must be "
                "greater than the input length. Received: inputs.shape="
                f"{inputs.shape}, cropping={self.cropping}"
            )
        if self.cropping[1] == 0:
            return inputs[:, self.cropping[0] :, :]
        else:
            return inputs[:, self.cropping[0] : -self.cropping[1], :]

    def get_config(self):
        config = {"cropping": self.cropping}
        base_config = super().get_config()
        return {**base_config, **config}