o
    2h&                     @   sd   d dl mZ d dl 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 )    )backend)ops)keras_export)	InputSpec)Layer)argument_validationzkeras.layers.ZeroPadding2Dc                       s>   e Zd ZdZd fdd	Zdd Zdd	 Z fd
dZ  ZS )ZeroPadding2DaA  Zero-padding layer for 2D input (e.g. picture).

    This layer can add rows and columns of zeros at the top, bottom, left and
    right side of an image tensor.

    Example:

    >>> input_shape = (1, 1, 2, 2)
    >>> x = np.arange(np.prod(input_shape)).reshape(input_shape)
    >>> x
    [[[[0 1]
       [2 3]]]]
    >>> y = keras.layers.ZeroPadding2D(padding=1)(x)
    >>> y
    [[[[0 0]
       [0 0]
       [0 0]
       [0 0]]
      [[0 0]
       [0 1]
       [2 3]
       [0 0]]
      [[0 0]
       [0 0]
       [0 0]
       [0 0]]]]

    Args:
        padding: Int, or tuple of 2 ints, or tuple of 2 tuples of 2 ints.
            - If int: the same symmetric padding is applied to height and width.
            - If tuple of 2 ints: interpreted as two different symmetric padding
              values for height and width:
              `(symmetric_height_pad, symmetric_width_pad)`.
            - If tuple of 2 tuples of 2 ints: interpreted as
             `((top_pad, bottom_pad), (left_pad, right_pad))`.
        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, height, width, channels)` while `"channels_first"`
            corresponds to inputs with shape
            `(batch_size, channels, height, width)`.
            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:
        4D tensor with shape:
        - If `data_format` is `"channels_last"`:
          `(batch_size, height, width, channels)`
        - If `data_format` is `"channels_first"`:
          `(batch_size, channels, height, width)`

    Output shape:
        4D tensor with shape:
        - If `data_format` is `"channels_last"`:
          `(batch_size, padded_height, padded_width, channels)`
        - If `data_format` is `"channels_first"`:
          `(batch_size, channels, padded_height, padded_width)`
       r
   Nc                    s   t  jdi | t|| _t|tr||f||ff| _n7t|drMt	|dkr1t
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__   z6`padding` should have two elements. Received: padding=.r   z1st entry of paddingT)
allow_zeror
   z2nd entry of paddingz`padding` should be either an int, a tuple of 2 ints (symmetric_height_crop, symmetric_width_crop), or a tuple of 2 tuples of 2 ints ((top_crop, bottom_crop), (left_crop, right_crop)). Received: padding=   )ndim )super__init__r   standardize_data_formatdata_format
isinstanceintpaddinghasattrlen
ValueErrorr   standardize_tupler   
input_spec)selfr   r   kwargsheight_paddingwidth_padding	__class__r   d/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/layers/reshaping/zero_padding2d.pyr   G   s0   

zZeroPadding2D.__init__c                 C   sn   t |}| jdkrdnd}tddD ] }|||  d ur2|||   | j| d | j| d  7  < qt|S )Nchannels_firstr   r
   r   )listr   ranger   tuple)r   input_shapeoutput_shapespatial_dims_offsetindexr   r   r$   compute_output_shapec   s   z"ZeroPadding2D.compute_output_shapec                 C   s:   | j dkrddg| jR }n	dg| jdR }t||S )Nr%   )r   r   )r   r   r   pad)r   inputsall_dims_paddingr   r   r$   callm   s   
zZeroPadding2D.callc                    s$   | j | jd}t  }i ||S )N)r   r   )r   r   r   
get_config)r   configbase_configr"   r   r$   r2   t   s   
zZeroPadding2D.get_config)r	   N)	__name__
__module____qualname____doc__r   r-   r1   r2   __classcell__r   r   r"   r$   r   	   s    <
r   N)	keras.srcr   r   keras.src.api_exportr   keras.src.layers.input_specr   keras.src.layers.layerr   keras.src.utilsr   r   r   r   r   r$   <module>   s    