
    0h                         d Z ddlZddlZddlZddlmc 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	e
             Zy)
zContains the flatten layer.    N)Layer)	InputSpec)
conv_utils)keras_exportzkeras.layers.Flattenc                   :     e Zd ZdZd fd	Zd Zd Z fdZ xZS )Flattena  Flattens the input. Does not affect the batch size.

    Note: If inputs are shaped `(batch,)` without a feature axis, then
    flattening adds an extra channel dimension and output shape is `(batch, 1)`.

    Args:
      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, ..., channels)` while `channels_first` corresponds to
        inputs with shape `(batch, channels, ...)`.
        When unspecified, uses
        `image_data_format` value found in your TF-Keras config file at
         `~/.keras/keras.json` (if exists) else 'channels_last'.
        Defaults to 'channels_last'.

    Example:

    >>> model = tf.keras.Sequential()
    >>> model.add(tf.keras.layers.Conv2D(64, 3, 3, input_shape=(3, 32, 32)))
    >>> model.output_shape
    (None, 1, 10, 64)

    >>> model.add(Flatten())
    >>> model.output_shape
    (None, 640)

    c                     t        |   di | t        j                  |      | _        t        d      | _        | j                  dk(  | _        y )N   )min_ndimchannels_first )super__init__r   normalize_data_formatdata_formatr   
input_spec_channels_first)selfr   kwargs	__class__s      _/var/www/html/engine/venv/lib/python3.12/site-packages/tf_keras/src/layers/reshaping/flatten.pyr   zFlatten.__init__@   sF    "6"%;;KH#Q/#//3CC    c                    | j                   rc|j                  j                  }|rK|dkD  rFdg}|j                  t	        d|             |j                  d       t        j                  ||      }t        j                         r:t        j                  |j                  d   dg      }t        j                  ||      S |j                  }|j                  }|dk(  rt        j                  |d      S t        j                  j                  |d         }|dd  }|j                         rEt        t!        j"                  t$        j&                  |            }t        j                  d|g      }n=|!t        j                  t        |      dg      }nt        j                  |      d   dg}t        j                  ||      S )Nr
   r      )perm)axis)r   shaperankextendrangeappendtf	transposeexecuting_eagerlyconstantreshapeexpand_dimscompatdimension_valueis_fully_definedint	functoolsreduceoperatormul)	r   inputsr   permutationflattened_shapeinput_shape	batch_dimnon_batch_dimslast_dims	            r   callzFlatten.callF   sk   <<$$Dq c""5D>2""1%f;?! !kk6<<?B*?@O::fo66 ,,K##Dqy~~f155II55k!nE	!,QR "224"!((~F H ')kk2x.&AO*&(kk3y>22F&GO')xx'7':B&?Ozz&/::r   c                 2   t        j                  |      j                         }|st        j                  dg      }n|d   g}t        j                  |dd        r#|t        j
                  |dd  t              gz  }n|d gz  }t        j                  |      S )Nr
   r   )dtype)r#   TensorShapeas_listnpallprodr,   )r   r4   output_shapes      r   compute_output_shapezFlatten.compute_output_shapek   s    nn[199;>>1#.L'N+L66+ab/"RWW[_C@AALTF"L~~l++r   c                 ^    t         |          }|j                  d| j                  i       |S )Nr   )r   
get_configupdater   )r   configr   s     r   rC   zFlatten.get_configw   s,    #%}d&6&678r   )N)	__name__
__module____qualname____doc__r   r8   rA   rC   __classcell__)r   s   @r   r   r       s#    <D#;J
, r   r   )rI   r-   r/   numpyr=   tensorflow.compat.v2r)   v2r#   tf_keras.src.engine.base_layerr   tf_keras.src.engine.input_specr   tf_keras.src.utilsr    tensorflow.python.util.tf_exportr   r   r   r   r   <module>rR      sM    "    ! ! 0 4 ) : $%Ye Y &Yr   