a
    SicZ                     @   s   d 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 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edd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)layers)
base_layer)
functional)input_layer)training_utils)model_serialization)generic_utils)layer_utils)
tf_inspect)tf_utils)traceback_utils)
tf_logging)keras_exportzuAll layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.zkeras.Sequentialzkeras.models.Sequentialc                       s  e Zd ZdZejjjej	d" fdd	Z
e fddZejjjej	dd Zejjjej	d	d
 Zejjjd#ddZejd$ fdd	Zd% fdd	Zdd Zdd Z fddZed&ddZe f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:

    ```python
    # 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)
    # Returns "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)
    # Returns "4"

    # 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 tjdd d| _d| _	d| _
d| _d| _d| _i | _t | _d| _d| _|rt|ttfs~|g}|D ]}| | qdS )zCreates a `Sequential` model instance.

        Args:
          layers: Optional list of layers to add to the model.
          name: Optional name for the model.
        F)nameautocastr   TN)superr   
Functional__init__r   keras_api_gaugeget_cellsetsupports_masking _compute_output_and_mask_jointly_auto_track_sub_layers_inferred_input_shape_has_explicit_input_shape_input_dtype_layer_call_argspecs_created_nodes_graph_initialized_use_legacy_deferred_behavior
isinstancelisttupleadd)selfr   r   layer	__class__ S/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/engine/sequential.pyr   g   s"    zSequential.__init__c                    s4   t  j}|r(t|d tjr(|dd  S |d d  S )Nr      )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|tjrHt|tjsbt	
|}ntd| dt| dt|g | |std|j dd| _d}| d	g  | jsDt|tjrd
}n4t|\}}|rtj|||jd d}|| d
}|rtj|jd j}t|dkrtt|| _t| jd | _ d
| _d
| _!nB| jr|| jd }ttj|dkrxt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   zDThe added layer must be an instance of class Layer. Received: layer=z	 of type .zGAll layers added to a Sequential model should have unique names. Name "za" 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-   tfModuler   Layerr   ModuleWrapper	TypeErrortyper   assert_no_legacy_layers_is_layer_name_unique
ValueErrorr   built_maybe_create_attributer0   r   get_input_shape_and_dtypeInputnestflatten_inbound_nodesoutputslenSINGLE_LAYER_OUTPUT_ERROR_MSGr	   get_source_inputsinputsr   r    _init_graph_networkappend#_handle_deferred_layer_dependenciesr
   getfullargspeccallr   )	r&   r'   origin_layer
set_inputsr3   r4   xrG   output_tensorr*   r*   r+   r%      st    


zSequential.addc                 C   s   | j std| j }| j| | j sPd| _d| _d| _d| _d| _	d| _
n8| j
rg | j d _| j d jg| _| | j| j d| _dS )zzRemoves the last layer in the model.

        Raises:
            TypeError: if there are no layers in the model.
        z!There are no layers in the model.NFr5   T)r   r;   r0   popr   rG   rK   r@   r   r   r    _outbound_nodesoutputrL   )r&   r'   r*   r*   r+   rU      s     
zSequential.popc           
      C   sz  |d u s| j sd S tjj r*tjj s.d S | jsv| j	svt
|}| jd u rV|}nt| j|}|d urv|| jkrvt  tj||| j d jd d}|}t }| j D ]p}t|| j z||}W n"   d| _	Y  W d    d S 0 ttj|dkrttt|| |}|}	q|| _z| ||	 d| _W n   d| _	Y n0 W d    n1 sf0    Y  || _d S )Nr   r1   r2   Tr,   )r   r7   __internal__tf2enabledcompatv1#executing_eagerly_outside_functionsr   r!   r$   r   relax_input_shape
init_scoper   rC   r   r   clear_previously_created_nodesr   rH   rD   rE   r?   rI    track_nodes_created_by_last_callrL   r    )
r&   input_shapeinput_dtype	new_shaperK   layer_inputcreated_nodesr'   layer_outputrG   r*   r*   r+   '_build_graph_network_for_inferred_shape  sd    






	
,z2Sequential._build_graph_network_for_inferred_shapec                    s\   | j r| | j| j n:|d u r(td| | | jsRt|}|| _t	 
| d| _d S )Nz+You must provide an `input_shape` argument.T)r    rL   rK   rG   r?   rh   r@   r$   _build_input_shaper   build)r&   rb   r(   r*   r+   rj   r  s    
zSequential.buildc                    s  | j sbt|sRt|tjsRd| _tjt|| _	tj
j rbtd| d n| |j|j | jr| js~| | j| j t j|||dS |}| jD ]p}i }| j| j}d|v r||d< d|v r||d< ||fi |}ttj|dkrtt|}t |dd }q|S )	NTzVLayers in a Sequential model should only have a single input tensor. Received: inputs=z8. Consider rewriting this model with the Functional API.)trainingmaskrl   rk   r,   _keras_mask)!r   r7   	is_tensorr"   Tensorr!   rD   map_structure_get_shape_tupleri   rX   rY   rZ   loggingwarningrh   shaper4   r    r@   rL   rK   rG   r   rP   r   r   argsrH   rE   r?   rI   getattr)r&   rK   rk   rl   rG   r'   kwargsargspecr(   r*   r+   rP     sB    
zSequential.callc                 C   s   |}| j D ]}||}q
|S N)r   compute_output_shape)r&   rb   rt   r'   r*   r*   r+   rz     s    
zSequential.compute_output_shapec                 C   s   | j ||d}t|dd S )N)rl   rm   )rP   rv   )r&   rK   rl   rG   r*   r*   r+   compute_mask  s    zSequential.compute_maskc                    sR   g }t  jD ]}|t| q| jt|d}| jsN| j	d urN| j	|d< |S )N)r   r   build_input_shape)
r   r   rM   r   serialize_keras_objectr   copydeepcopy_is_graph_networkri   )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   r|   r   )r   )custom_objects)	getlayer_moduledeserializer%   rK   r"   r$   r#   rj   )	clsr   r   r   r|   r   modellayer_configr'   r*   r*   r+   from_config  s*    



zSequential.from_configc                    s"   t | dr| jS | jrt jS d S )N_manual_input_spec)r6   r   r   r   
input_specr&   r(   r*   r+   r     s
    
zSequential.input_specc                 C   s
   || _ d S ry   )r   )r&   valuer*   r*   r+   r     s    c                 C   s
   t | S ry   )r   SequentialSavedModelSaverr   r*   r*   r+   _trackable_saved_model_saver  s    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'   	ref_layerr*   r*   r+   r>     s    
z Sequential._is_layer_name_uniquec                    s   | j r
d S ttj|   d S ry   )r    r   r   r   _assert_weights_createdr   r(   r*   r+   r     s    z"Sequential._assert_weights_created)NN)N)N)NN)N)__name__
__module____qualname____doc__r7   rX   tracking no_automatic_dependency_trackingr   filter_tracebackr   propertyr   r%   rU   rh   r   defaultrj   rP   rz   r{   r   classmethodr   r   setterr   r>   r   __classcell__r*   r*   r(   r+   r   -   s>   8%] ^2

r   c                 C   s<   t | dr8| j}t|tr|S |jd ur4t| S d S d S )Nrt   )r6   rt   r"   r$   rankas_list)trt   r*   r*   r+   rq     s    


rq   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 ry   r*   ).0d1d2r*   r*   r+   	<genexpr>      z$relax_input_shape.<locals>.<genexpr>)rH   r$   zip)shape_1shape_2r*   r*   r+   r^     s
    r^   c                    sT   | j D ]2}|j}tj|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                    s   g | ]}| vr|qS r*   r*   r   nrf   r*   r+   
<listcomp>  s   z2clear_previously_created_nodes.<locals>.<listcomp>c                    s   g | ]}| vr|qS r*   r*   r   r   r*   r+   r     s   N)rF   inbound_layersr7   rD   rE   rV   )r'   rf   nodeprev_layers
prev_layerr*   r   r+   r`     s    


r`   c                 C   sR   | j s
dS || j d  | j d j}tj|D ]}|jr2||jd  q2dS )zFAdds to `created_nodes` the nodes created by the last call to `layer`.Nr5   )rF   r%   r   r7   rD   rE   rV   )r'   rf   r   r   r*   r*   r+   ra   "  s    ra   )"r   r~   Ztensorflow.compat.v2r[   v2r7   kerasr   r   keras.enginer   r   r   r   keras.saving.saved_modelr   keras.utilsr   r	   r
   r   r   tensorflow.python.platformr   rr    tensorflow.python.util.tf_exportr   rI   r   r   rq   r^   r`   ra   r*   r*   r*   r+   <module>   s4      W