o
    ?e0[                     @   s&  d Z ddlZddl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 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 ddlmZ ddlmZ ddlmZ  ddl!m"Z" dZ#G dd dej$Z%dd Z&dd Z'dd Z(dd Z)dS ) zHome of the `Sequential` model.    N)tf2)ops)tensor_util)layers)
base_layer)
functional)input_layer)training_utils)model_serialization)generic_utils)layer_utils)
tf_inspect)tf_utils)module)	np_arrays)
tf_logging)base)nestzuAll layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.c                       s   e Zd ZdZejd( fdd	Ze fddZejdd Z	ejd	d
 Z
ej	d)ddZejd) fdd	Zd( fdd	Zdd Zdd Zd*ddZd*ddZ fddZed)ddZedd  Zejd!d  Zed"d# Zd$d% Z fd&d'Z  ZS )+
Sequentiala  `Sequential` groups a linear stack of layers into a `tf.keras.Model`.

  `Sequential` provides training and inference features on this model.

  Examples:

  >>> # Optionally, the first layer can receive an `input_shape` argument:
  >>> model = tf.keras.Sequential()
  >>> model.add(tf.keras.layers.Dense(8, input_shape=(16,)))
  >>> # Afterwards, we do automatic shape inference:
  >>> model.add(tf.keras.layers.Dense(4))

  >>> # This is identical to the following:
  >>> model = tf.keras.Sequential()
  >>> model.add(tf.keras.Input(shape=(16,)))
  >>> model.add(tf.keras.layers.Dense(8))

  >>> # Note that you can also omit the `input_shape` argument.
  >>> # In that case the model doesn't have any weights until the first call
  >>> # to a training/evaluation method (since it isn't yet built):
  >>> model = tf.keras.Sequential()
  >>> model.add(tf.keras.layers.Dense(8))
  >>> model.add(tf.keras.layers.Dense(4))
  >>> # model.weights not created yet

  >>> # Whereas if you specify the input shape, the model gets built
  >>> # continuously as you are adding layers:
  >>> model = tf.keras.Sequential()
  >>> model.add(tf.keras.layers.Dense(8, input_shape=(16,)))
  >>> model.add(tf.keras.layers.Dense(4))
  >>> len(model.weights)
  4

  >>> # When using the delayed-build pattern (no input shape specified), you can
  >>> # choose to manually build your model by calling
  >>> # `build(batch_input_shape)`:
  >>> model = tf.keras.Sequential()
  >>> model.add(tf.keras.layers.Dense(8))
  >>> model.add(tf.keras.layers.Dense(4))
  >>> model.build((None, 16))
  >>> len(model.weights)
  4

  ```python
  # Note that when using the delayed-build pattern (no input shape specified),
  # the model gets built the first time you call `fit`, `eval`, or `predict`,
  # or the first time you call the model on some input data.
  model = tf.keras.Sequential()
  model.add(tf.keras.layers.Dense(8))
  model.add(tf.keras.layers.Dense(1))
  model.compile(optimizer='sgd', loss='mse')
  # This builds the model for the first time:
  model.fit(x, y, batch_size=32, epochs=10)
  ```
  Nc                    s   t tj| j|dd d| _d| _d| _d| _d| _d| _	i | _
t | _d| _d| _|r@t|ttfs6|g}|D ]	}| | q8dS dS )zCreates a `Sequential` model instance.

    Args:
      layers: Optional list of layers to add to the model.
      name: Optional name for the model.
    F)nameZautocastTN)superr   
Functional__init__Zsupports_maskingZ _compute_output_and_mask_jointlyZ_auto_track_sub_layers_inferred_input_shape_has_explicit_input_shapeZ_input_dtype_layer_call_argspecsset_created_nodes_graph_initialized_use_legacy_deferred_behavior
isinstancelisttupleadd)selfr   r   layer	__class__ j/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/keras/engine/sequential.pyr   g   s(   	zSequential.__init__c                    s8   t t| j}|rt|d tjr|dd  S |d d  S )Nr      )r   r   r   r    r   
InputLayer)r$   r   r&   r(   r)   r      s   zSequential.layersc           	      C   s  t |dr|jd }t|tjr|}td t|tjr)t|t	j
s(t|}ntdt| t|g | |sDtd|jf d| _d}| dg  | jst|tjr[d}nt|\}}|rutj|||jd	 d
}|| d}|rt|jd j}t|dkrtt|| _t !| jd | _"d| _d| _#n| jr|| jd }tt|dkrtt|g| _d| _|s| j$r| %| j"| j d| _$n| j&| | '|g t()|j*| j+|< dS )a  Adds a layer instance on top of the layer stack.

    Args:
        layer: layer instance.

    Raises:
        TypeError: If `layer` is not a layer instance.
        ValueError: In case the `layer` argument does not
            know its input shape.
        ValueError: In case the `layer` argument has
            multiple output tensors, or is already connected
            somewhere else (forbidden in `Sequential` models).
    _keras_historyr   zPlease add `keras.layers.InputLayer` instead of `keras.Input` to Sequential model. `keras.Input` is intended to be used by Functional model.z;The added layer must be an instance of class Layer. Found: zAll layers added to a Sequential model should have unique names. Name "%s" is already the name of a layer in this model. Update the `name` argument to pass a unique name.F_self_tracked_trackablesT_inputbatch_shapedtyper   r*   N),hasattrr,   r    r   r+   loggingwarningr   Moduler   ZLayerr   ZModuleWrapper	TypeErrorstrr   Zassert_no_legacy_layers_is_layer_name_unique
ValueErrorr   builtZ_maybe_create_attributer-   r	   Zget_input_shape_and_dtypeInputr   flatten_inbound_nodesoutputslenSINGLE_LAYER_OUTPUT_ERROR_MSGr   Zget_source_inputsinputsr   r   _init_graph_networkappendZ#_handle_deferred_layer_dependenciesr   getfullargspeccallr   )	r$   r%   Zorigin_layerZ
set_inputsr0   r1   xr?   Zoutput_tensorr(   r(   r)   r#      sj   




zSequential.addc                 C   s   | j std| j }| j| | j s)d| _d| _d| _d| _d| _	d| _
dS | j
rGg | j d _| j d jg| _| | j| j d| _dS dS )znRemoves the last layer in the model.

    Raises:
        TypeError: if there are no layers in the model.
    z!There are no layers in the model.NFr2   T)r   r7   r-   popr   r?   rB   r;   r   r   r   _outbound_nodesoutputrC   )r$   r%   r(   r(   r)   rH      s"   


zSequential.popc           
      C   sn  |d u s| j s	d S t rt sd S | js| jst|}| jd u r%|}nt	| j|}|d ur|| jkrt
 j tj||| j d jd d}|}t }| j D ]5}t|| j z||}W n   d| _Y  W d    d S tt|dkr{ttt|| |}|}	qO|| _z| ||	 d| _W n   d| _Y W d    n1 sw   Y  || _d S d S d S d S d S )Nr   r.   r/   Tr*   )r   r   enabledr   Z#executing_eagerly_outside_functionsr   r   r"   r   relax_input_shapeZ
init_scoper   r<   r   r   clear_previously_created_nodesr   r@   r   r=   r:   rA    track_nodes_created_by_last_callrC   r   )
r$   input_shapeZinput_dtypeZ	new_shaperB   Zlayer_inputcreated_nodesr%   Zlayer_outputr?   r(   r(   r)   '_build_graph_network_for_inferred_shape	  sX   


	#


6	z2Sequential._build_graph_network_for_inferred_shapec                    s`   | j r| | j| j n|d u rtd| | | js+t|}|| _t	t
| | d| _d S )Nz+You must provide an `input_shape` argument.T)r   rC   rB   r?   r:   rQ   r;   r"   _build_input_shaper   r   build)r$   rO   r&   r(   r)   rS   V  s   

zSequential.buildc                    s  | j s0t|s(t|tjs(d| _tt	|| _
t r'tdt||f  n| |j|j | jrI| js>| | j| j tt| j|||dS |}| jD ]7}i }| j| j}d|v r`||d< d|v rh||d< ||fi |}tt|dkr}t t!|}t"|dd }qN|S )NTzLayers in a Sequential model should only have a single input tensor, but we receive a %s input: %s
Consider rewriting this model with the Functional API.)trainingmaskrU   rT   r*   _keras_mask)#r   r   Z
is_tf_typer    r   Zndarrayr   r   Zmap_structure_get_shape_tuplerR   r   rK   r4   r5   typerQ   shaper1   r   r;   rC   rB   r?   r   r   rF   r   r   argsr@   r=   r:   rA   getattr)r$   rB   rT   rU   r?   r%   kwargsZargspecr&   r(   r)   rF   d  s<   

zSequential.callc                 C   s   |}| j D ]}||}q|S N)r   compute_output_shape)r$   rO   rY   r%   r(   r(   r)   r^     s   
zSequential.compute_output_shapec                 C   s   | j ||d}t|dd S )N)rU   rV   )rF   r[   )r$   rB   rU   r?   r(   r(   r)   compute_mask  s   zSequential.compute_mask    r   c                 C   s>   t d | |||}| dk s| dkrtd |S )ay  Generates class probability predictions for the input samples.

    The input samples are processed batch by batch.

    Args:
        x: input data, as a Numpy array or list of Numpy arrays
            (if the model has multiple inputs).
        batch_size: integer.
        verbose: verbosity mode, 0 or 1.

    Returns:
        A Numpy array of probability predictions.
    zq`model.predict_proba()` is deprecated and will be removed after 2021-01-01. Please use `model.predict()` instead.g        g      ?zNetwork returning invalid probability values. The last layer might not normalize predictions into probabilities (like softmax or sigmoid would).)warningswarnpredictminmaxr4   r5   )r$   rG   
batch_sizeverbosepredsr(   r(   r)   predict_proba  s
   

zSequential.predict_probac                 C   sB   t d | j|||d}|jd dkr|jddS |dkdS )af  Generate class predictions for the input samples.

    The input samples are processed batch by batch.

    Args:
        x: input data, as a Numpy array or list of Numpy arrays
            (if the model has multiple inputs).
        batch_size: integer.
        verbose: verbosity mode, 0 or 1.

    Returns:
        A numpy array of class predictions.
    a  `model.predict_classes()` is deprecated and will be removed after 2021-01-01. Please use instead:* `np.argmax(model.predict(x), axis=-1)`,   if your model does multi-class classification   (e.g. if it uses a `softmax` last-layer activation).* `(model.predict(x) > 0.5).astype("int32")`,   if your model does binary classification   (e.g. if it uses a `sigmoid` last-layer activation).)rf   rg   r2   r*   )Zaxisg      ?Zint32)ra   rb   rc   rY   ZargmaxZastype)r$   rG   rf   rg   Zprobar(   r(   r)   predict_classes  s
   
	zSequential.predict_classesc                    sV   g }t t| jD ]
}|t| q| jt|d}| j	s)| j
d ur)| j
|d< |S )N)r   r   build_input_shape)r   r   r   rD   r   Zserialize_keras_objectr   copydeepcopyZ_is_graph_networkrR   )r$   layer_configsr%   configr&   r(   r)   
get_config  s   
zSequential.get_configc           	      C   s   d|v r|d }| d}|d }nd }d }|}| |d}|D ]}tj||d}|| q|js?|r?t|ttfr?|| |S )Nr   rk   r   )r   )custom_objects)	getlayer_moduleZdeserializer#   rB   r    r"   r!   rS   )	clsro   rq   r   rk   rn   modelZlayer_configr%   r(   r(   r)   from_config  s$   




zSequential.from_configc                 C   s6   t | dr| jS | jrt | jd dr| jd jS d S )N_manual_input_specr   
input_spec)r3   rw   r   rx   r$   r(   r(   r)   rx     s
   
zSequential.input_specc                 C   s
   || _ d S r]   )rw   )r$   valuer(   r(   r)   rx        
c                 C   s
   t | S r]   )r
   ZSequentialSavedModelSaverry   r(   r(   r)   _trackable_saved_model_saver  r{   z'Sequential._trackable_saved_model_saverc                 C   s*   | j D ]}|j|jkr||ur dS qdS )NFT)r   r   )r$   r%   Z	ref_layerr(   r(   r)   r9     s
   
z Sequential._is_layer_name_uniquec                    s   | j rd S ttj|   d S r]   )r   r   r   r   _assert_weights_createdry   r&   r(   r)   r}     s   z"Sequential._assert_weights_created)NNr]   )r`   r   )__name__
__module____qualname____doc__	trackableZ no_automatic_dependency_trackingr   propertyr   r#   rH   rQ   r   defaultrS   rF   r^   r_   ri   rj   rp   classmethodrv   rx   setterr|   r9   r}   __classcell__r(   r(   r&   r)   r   .   s>    8$
W
L,




r   c                 C   s<   t | dr| j}t|tr|S |jd urt| S d S d S )NrY   )r3   rY   r    r"   Zrankas_list)trY   r(   r(   r)   rW     s   


rW   c                 C   s@   | d u s|d u r
d S t | t |krd S tdd t| |D S )Nc                 s   s$    | ]\}}||krd n|V  qd S r]   r(   ).0Zd1Zd2r(   r(   r)   	<genexpr>$  s   " z$relax_input_shape.<locals>.<genexpr>)r@   r"   zip)Zshape_1Zshape_2r(   r(   r)   rL     s
   rL   c                    sR   | j D ]}|j}t|D ]} fdd|jD |_qq fdd| j D | _ dS )zARemove nodes from `created_nodes` from the layer's inbound_nodes.c                       g | ]}| vr|qS r(   r(   r   nrP   r(   r)   
<listcomp>,  s    z2clear_previously_created_nodes.<locals>.<listcomp>c                    r   r(   r(   r   r   r(   r)   r   /  s
    N)r>   inbound_layersr   r=   rI   )r%   rP   nodeprev_layers
prev_layerr(   r   r)   rM   '  s   



rM   c                 C   sP   | j sdS || j d  | j d j}t|D ]}|jr%||jd  qdS )zFAdds to `created_nodes` the nodes created by the last call to `layer`.Nr2   )r>   r#   r   r   r=   rI   )r%   rP   r   r   r(   r(   r)   rN   3  s   rN   )*r   rl   ra   Ztensorflow.pythonr   Ztensorflow.python.frameworkr   r   Ztensorflow.python.kerasr   rs   Ztensorflow.python.keras.enginer   r   r   r	   Z*tensorflow.python.keras.saving.saved_modelr
   Ztensorflow.python.keras.utilsr   r   r   r   Ztensorflow.python.moduler   Ztensorflow.python.ops.numpy_opsr   Ztensorflow.python.platformr   r4   Ztensorflow.python.trackabler   r   Ztensorflow.python.utilr   rA   r   r   rW   rL   rM   rN   r(   r(   r(   r)   <module>   s<      i