o
    i e                     @   sz   d Z ddlZddlZddl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Contains the flatten layer.    N)Layer)	InputSpec)
conv_utils)keras_exportzkeras.layers.Flattenc                       s>   e Zd ZdZd fdd	Zdd Zdd Z fd	d
Z  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 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)

    Nc                    s:   t  jdi | t|| _tdd| _| jdk| _d S )N   )min_ndimchannels_first )super__init__r   normalize_data_formatdata_formatr   
input_spec_channels_first)selfr   kwargs	__class__r
   Q/var/www/myenv/lib/python3.10/site-packages/keras/src/layers/reshaping/flatten.pyr   @   s   zFlatten.__init__c           	      C   s  | j r$|jj}|r$|dkr$dg}|td| |d tj||d}t r8t	|jd dg}t
||S |j}|j}|dkrItj|ddS tj|d }|dd  }| rltttj|}t	d|g}n|d urzt	t|dg}n	t|d dg}t
||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_dimr
   r
   r   callF   s2   
zFlatten.callc                 C   sn   t | }|st dg}n|d g}t|dd  r-|tj|dd  tdg7 }n|d g7 }t |S )Nr   r   )dtype)r   TensorShapeas_listnpallprodr(   )r   r0   output_shaper
   r
   r   compute_output_shapek   s   


zFlatten.compute_output_shapec                    s   t   }|d| ji |S )Nr   )r   
get_configupdater   )r   configr   r
   r   r=   w   s   
zFlatten.get_config)N)	__name__
__module____qualname____doc__r   r4   r<   r=   __classcell__r
   r
   r   r   r       s    %r   )rC   r)   r+   numpyr8   tensorflow.compat.v2r%   v2r   keras.src.engine.base_layerr   keras.src.engine.input_specr   keras.src.utilsr    tensorflow.python.util.tf_exportr   r   r
   r
   r
   r   <module>   s   