a
    Sic"                     @   s   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	 ddl
mZ ddlmZ dd	lmZ ed
dG dd deZeZdS )z)Keras depthwise separable 2D convolution.    N)activations)constraints)initializers)regularizers)SeparableConv)
conv_utils)keras_exportzkeras.layers.SeparableConv2Dz#keras.layers.SeparableConvolution2Dc                       s*   e Zd ZdZd fd	d
	Zdd Z  ZS )SeparableConv2Da  Depthwise separable 2D convolution.

    Separable convolutions consist of first performing
    a depthwise spatial convolution
    (which acts on each input channel separately)
    followed by a pointwise convolution which mixes the resulting
    output channels. The `depth_multiplier` argument controls how many
    output channels are generated per input channel in the depthwise step.

    Intuitively, separable convolutions can be understood as
    a way to factorize a convolution kernel into two smaller kernels,
    or as an extreme version of an Inception block.

    Args:
      filters: Integer, the dimensionality of the output space
        (i.e. the number of output filters in the convolution).
      kernel_size: An integer or tuple/list of 2 integers, specifying the
        height and width of the 2D convolution window.
        Can be a single integer to specify the same value for
        all spatial dimensions.
      strides: An integer or tuple/list of 2 integers,
        specifying the strides of the convolution along the height and width.
        Can be a single integer to specify the same value for
        all spatial dimensions. Current implementation only supports equal
        length strides in the row and column dimensions.
        Specifying any stride value != 1 is incompatible with specifying
        any `dilation_rate` value != 1.
      padding: one of `"valid"` or `"same"` (case-insensitive).
        `"valid"` means no padding. `"same"` results in padding with zeros
        evenly to the left/right or up/down of the input such that output has
        the same height/width dimension as the input.
      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)`.
        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".
      dilation_rate: An integer or tuple/list of 2 integers, specifying
        the dilation rate to use for dilated convolution.
      depth_multiplier: The number of depthwise convolution output channels
        for each input channel.
        The total number of depthwise convolution output
        channels will be equal to `filters_in * depth_multiplier`.
      activation: Activation function to use.
        If you don't specify anything, no activation is applied
        (see `keras.activations`).
      use_bias: Boolean, whether the layer uses a bias vector.
      depthwise_initializer: An initializer for the depthwise convolution kernel
        (see `keras.initializers`). If None, then the default initializer
        ('glorot_uniform') will be used.
      pointwise_initializer: An initializer for the pointwise convolution kernel
        (see `keras.initializers`). If None, then the default initializer
        ('glorot_uniform') will be used.
      bias_initializer: An initializer for the bias vector. If None, the default
        initializer ('zeros') will be used (see `keras.initializers`).
      depthwise_regularizer: Regularizer function applied to
        the depthwise kernel matrix (see `keras.regularizers`).
      pointwise_regularizer: Regularizer function applied to
        the pointwise kernel matrix (see `keras.regularizers`).
      bias_regularizer: Regularizer function applied to the bias vector
        (see `keras.regularizers`).
      activity_regularizer: Regularizer function applied to
        the output of the layer (its "activation")
        (see `keras.regularizers`).
      depthwise_constraint: Constraint function applied to
        the depthwise kernel matrix
        (see `keras.constraints`).
      pointwise_constraint: Constraint function applied to
        the pointwise kernel matrix
        (see `keras.constraints`).
      bias_constraint: Constraint function applied to the bias vector
        (see `keras.constraints`).

    Input shape:
      4D tensor with shape:
      `(batch_size, channels, rows, cols)` if data_format='channels_first'
      or 4D tensor with shape:
      `(batch_size, rows, cols, channels)` if data_format='channels_last'.

    Output shape:
      4D tensor with shape:
      `(batch_size, filters, new_rows, new_cols)` if
      data_format='channels_first'
      or 4D tensor with shape:
      `(batch_size, new_rows, new_cols, filters)` if
      data_format='channels_last'.  `rows` and `cols` values might have changed
      due to padding.

    Returns:
      A tensor of rank 4 representing
      `activation(separableconv2d(inputs, kernel) + bias)`.

    Raises:
      ValueError: if `padding` is "causal".
       r   validNr   Tglorot_uniformzerosc                    s   t  jf d|||||||t||	t|
t|t|t|t|t|t|t|t|t|d| d S )N   )rankfilterskernel_sizestridespaddingdata_formatdilation_ratedepth_multiplier
activationuse_biasdepthwise_initializerpointwise_initializerbias_initializerdepthwise_regularizerpointwise_regularizerbias_regularizeractivity_regularizerdepthwise_constraintpointwise_constraintbias_constraint)super__init__r   getr   r   r   )selfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   kwargs	__class__ g/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/layers/convolutional/separable_conv2d.pyr%      s0    zSeparableConv2D.__init__c                 C   s   | j dkrd| j d }n
d| j }tjjjj|| j| j|| j	
 | jtj| j ddd}| jrtjj|| jtj| j ddd}| jd ur| |S |S )Nchannels_last)r   r
      )ndim)r   r   rater   )r   )r   r   tfcompatv1nnseparable_conv2ddepthwise_kernelpointwise_kernelr   upperr   r   convert_data_formatr   bias_addbiasr   )r'   inputsr   outputsr+   r+   r,   call   s2    




zSeparableConv2D.call)r
   r   Nr
   r   NTr   r   r   NNNNNNN)__name__
__module____qualname____doc__r%   r>   __classcell__r+   r+   r)   r,   r	      s(   h                 /r	   )rB   tensorflow.compat.v2r2   v2r1   kerasr   r   r   r   .keras.layers.convolutional.base_separable_convr   keras.utilsr    tensorflow.python.util.tf_exportr   r	   SeparableConvolution2Dr+   r+   r+   r,   <module>   s    7