a
    Sic.                     @   sb   d Z ddlm  mZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ edG dd	 d	eZdS )
z"Keras cropping layer for 3D input.    N)Layer)	InputSpec)
conv_utils)keras_exportzkeras.layers.Cropping3Dc                       s>   e Zd ZdZd fdd	Zdd Zdd	 Z fd
dZ  ZS )
Cropping3Dac  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 = tf.keras.layers.Cropping3D(cropping=(2, 4, 2))(x)
    >>> print(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 two 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)`.
        It defaults to the `image_data_format` value found in your
        Keras config file at `~/.keras/keras.json`.
        If you never set it, then it will be "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, depth)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, depth, 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, depth)`
      - If `data_format` is `"channels_first"`:
        `(batch_size, depth, first_cropped_axis, second_cropped_axis,
          third_cropped_axis)`
       r	   r   r   Nc                    s   t  jf i | t|| _t|trB||f||f||ff| _nt|drt	|dkrht
d| dtj|d dddd	}tj|d
 dddd	}tj|d dddd	}|||f| _nt
d| dtdd| _d S )N__len__   z-`cropping` should have 3 elements. Received: .r      z1st entry of croppingT)
allow_zeror	   z2nd entry of croppingz3rd entry of croppinga  `cropping` should be either an int, a tuple of 3 ints (symmetric_dim1_crop, symmetric_dim2_crop, symmetric_dim3_crop), or a tuple of 3 tuples of 2 ints ((left_dim1_crop, right_dim1_crop), (left_dim2_crop, right_dim2_crop), (left_dim3_crop, right_dim2_crop)). Received:    )ndim)super__init__r   normalize_data_formatdata_format
isinstanceintcroppinghasattrlen
ValueErrornormalize_tupler   
input_spec)selfr   r   kwargsdim1_croppingdim2_croppingdim3_cropping	__class__ ]/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/layers/reshaping/cropping3d.pyr   P   s<    

zCropping3D.__init__c                 C   s  t | }| jdkr|d d urJ|d | jd d  | jd d  }nd }|d d ur|d | jd d  | jd d  }nd }|d d ur|d | jd d  | jd d  }nd }t |d |d |||gS | jdkr|d d ur|d | jd d  | jd d  }nd }|d d urN|d | jd d  | jd d  }nd }|d d ur|d | jd d  | jd d  }nd }t |d ||||d gS d S )Nchannels_firstr   r   r	   r      channels_last)tfTensorShapeas_listr   r   )r   input_shapedim1dim2dim3r$   r$   r%   compute_output_shapey   sB    
""""""zCropping3D.compute_output_shapec                 C   s  | j dkr| jd d | jd d   krH| jd d   krHdkrn nD|d d d d | jd d d | jd d d | jd d d f S | jd d | jd d   krdkrn nP|d d d d | jd d d | jd d d | jd d | jd d  f S | jd d | jd d   kr:dkrn nP|d d d d | jd d | jd d  | jd d d | jd d d f S | jd d | jd d   krdkrn nP|d d d d | jd d d | jd d | jd d  | jd d d f S | jd d dkr~|d d d d | jd d d | jd d | jd d  | jd d | jd d  f S | jd d dkr|d d d d | jd d | jd d  | jd d d | jd d | jd d  f S | jd d dkr^|d d d d | jd d | jd d  | jd d | jd d  | jd d d f S |d d d d | jd d | jd d  | jd d | jd d  | jd d | jd d  f S | jd d | jd d   kr| jd d   krdkrPn nD|d d | jd d d | jd d d | jd d d d d f S | jd d | jd d   kr|dkrn nP|d d | jd d d | jd d d | jd d | jd d  d d f S | jd d | jd d   krdkrPn nP|d d | jd d | jd d  | jd d d | jd d d d d f S | jd d | jd d   kr|dkrn nP|d d | jd d d | jd d | jd d  | jd d d d d f S | jd d dkr@|d d | jd d d | jd d | jd d  | jd d | jd d  d d f S | jd d dkr|d d | jd d | jd d  | jd d d | jd d | jd d  d d f S | jd d dkr |d d | jd d | jd d  | jd d | jd d  | jd d d d d f S |d d | jd d | jd d  | jd d | jd d  | jd d | jd d  d d f S d S )Nr&   r   r	   r   )r   r   )r   inputsr$   r$   r%   call   s6   
.00	

000zCropping3D.callc                    s4   | j | jd}t  }tt| t|  S )N)r   r   )r   r   r   
get_configdictlistitems)r   configbase_configr"   r$   r%   r3   6  s    
zCropping3D.get_config)r   N)	__name__
__module____qualname____doc__r   r0   r2   r3   __classcell__r$   r$   r"   r%   r      s   3 )0 r   )r<   tensorflow.compat.v2compatv2r)   keras.engine.base_layerr   keras.engine.input_specr   keras.utilsr    tensorflow.python.util.tf_exportr   r   r$   r$   r$   r%   <module>   s   