
    6bi"                         S r SSKJs  Jr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SS	KJr  \" S
S5       " S S\5      5       r\rg)z)Keras depthwise separable 2D convolution.    N)activations)constraints)initializers)regularizers)SeparableConv)
conv_utils)keras_exportzkeras.layers.SeparableConv2Dz#keras.layers.SeparableConvolution2Dc                   X   ^  \ rS rSrSr                 SU 4S jjrS rSrU =r$ )SeparableConv2D   a  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)`.
    When unspecified, uses `image_data_format` value found in your Keras
    config file at `~/.keras/keras.json` (if exists) else 'channels_last'.
    Defaults to '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".
c                 V  > [         TU ]  " S0 SS_SU_SU_SU_SU_SU_SU_S	U_S
[        R                  " U5      _SU	_S[        R                  " U
5      _S[        R                  " U5      _S[        R                  " U5      _S[
        R                  " U5      _S[
        R                  " U5      _S[
        R                  " U5      _S[
        R                  " U5      _S[        R                  " U5      _S[        R                  " U5      _S[        R                  " U5      _UD6  g )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__s                        l/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/layers/convolutional/separable_conv2d.pyr%   SeparableConv2D.__init__   sS   . 	 	
	
	
 $	
 		

 	
 $	
 (	
 .	
 #z2	
 	
 #/"2"23H"I	
 #/"2"23H"I	
 *--.>?	
 #/"2"23H"I	
 #/"2"23H"I	
  *--.>?!	
" ".!1!12F!G#	
$ "-1E!F%	
& "-1E!F'	
( (OOO<+	
    c                 @   U R                   S:X  a  SU R                  -   S-   nOSU R                  -   n[        R                  R	                  UU R
                  U R                  UU R                  R                  5       U R                  [        R                  " U R                   SS9S9nU R                  (       aF  [        R                  R                  UU R                  [        R                  " U R                   SS9S9nU R                  b  U R                  U5      $ U$ )Nchannels_last)   r/   r/      )ndim)r   r   	dilationsr   )r   )r   r   tfnnseparable_conv2ddepthwise_kernelpointwise_kernelr   upperr   r   convert_data_formatr   bias_addbiasr   )r'   inputsr   outputss       r*   callSeparableConv2D.call   s    .T\\)D0Gt||+G%%((!!!!LL&&((("66  q ) 

 ==eenn		&::$$1 % G ??&??7++r,   r#   )r0   validNr0   r/   NTglorot_uniformrB   zerosNNNNNNN)	__name__
__module____qualname____firstlineno____doc__r%   r?   __static_attributes____classcell__)r)   s   @r*   r   r      sO    bP .. ""!!!)-
^ r,   r   )rH   tensorflow.compat.v2compatv2r4   tf_keras.srcr   r   r   r   5tf_keras.src.layers.convolutional.base_separable_convr   tf_keras.src.utilsr    tensorflow.python.util.tf_exportr	   r   SeparableConvolution2Dr#   r,   r*   <module>rS      s[    0 " ! $ $ % % O ) : "$Iqm qql ) r,   