a
    Sic                     @   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, ...)`.
        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".

    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f 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__ Z/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/layers/reshaping/flatten.pyr   ?   s    zFlatten.__init__c           	      C   s  | j rH|jj}|rH|dkrHdg}|td| |d tj||d}t rpt	|jd dg}t
||S |j}|j}|dkrtj|ddS tj|d }|dd  }| rtttj|}t	d|g}n.|d urt	t|dg}nt|d dg}t
||S d 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   callE   s2    
zFlatten.callc                 C   sn   t | }|s t dg}n
|d g}t|dd  rZ|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_shapej   s    

zFlatten.compute_output_shapec                    s   t   }|d| ji |S )Nr   )r
   
get_configupdater   )r   configr   r   r   r=   v   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.engine.base_layerr   keras.engine.input_specr   keras.utilsr    tensorflow.python.util.tf_exportr   r   r   r   r   r   <module>   s   