
    &Vf3                         d dl 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  eddg           G d de                      ZdS )    N)tree)keras_export)global_state)
InputLayer)Layer)saving_utils)serialization)
Functional)Model)serialization_libzkeras.Sequentialzkeras.models.Sequentialc                       e Zd ZdZ fdZd fd	ZddZddZd Zd	 Z	d
 Z
ddZddZed             ZddZed             Zed             Zed             Zed             Ze fd            Zd Z fdZedd            Z xZS )
SequentialaL  `Sequential` groups a linear stack of layers into a `Model`.

    Examples:

    ```python
    model = keras.Sequential()
    model.add(keras.Input(shape=(16,)))
    model.add(keras.layers.Dense(8))

    # Note that you can also omit the initial `Input`.
    # 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 = keras.Sequential()
    model.add(keras.layers.Dense(8))
    model.add(keras.layers.Dense(4))
    # model.weights not created yet

    # Whereas if you specify an `Input`, the model gets built
    # continuously as you are adding layers:
    model = keras.Sequential()
    model.add(keras.Input(shape=(16,)))
    model.add(keras.layers.Dense(8))
    len(model.weights)  # Returns "2"

    # 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 = keras.Sequential()
    model.add(keras.layers.Dense(8))
    model.add(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 = keras.Sequential()
    model.add(keras.layers.Dense(8))
    model.add(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)
    ```
    c                 v    t          j        t          t                                          |                     S N)typingcastr   super__new__)clsargskwargs	__class__s      X/var/www/html/software/conda/lib/python3.11/site-packages/keras/src/models/sequential.pyr   zSequential.__new__@   s%    {:uwws';';<<<    NTc                     t                                          ||           d | _        g | _        |r2|D ]}|                     |d           |                                  d S d S )N)	trainablenameF)rebuild)r   __init___functional_layersadd_maybe_rebuild)selflayersr   r   layerr   s        r   r   zSequential.__init__C   s    94888 	" / /....!!!!!	" 	"r   c                    | j         s9t          |dd          (|                     t          |j                             t          |d          r$|j        d         }t          |t                    r|}t          |t                    s#t          d| dt          |           d          |                     |          st          d	|j         d
          t          |t                    rR| j         rKt          | j         d         t                    r+t          d| j         d| j         d         j         d          | j                             |           |r|                                  dS d| _        d| _        dS )zkAdds a layer instance on top of the layer stack.

        Args:
            layer: layer instance.
        _input_shape_argN)shape_keras_historyr   zNOnly instances of `keras.Layer` can be added to a Sequential model. Received: 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.Sequential model '1' has already been configured to use input shape z/. You cannot add a different Input layer to it.F)r!   getattrr"   r   r(   hasattrr*   
isinstancer   
ValueErrortype_is_layer_name_uniquer   batch_shapeappendr#   builtr    )r$   r&   r   origin_layers       r   r"   zSequential.addL   s    | 	Cu0$77C%*@AAABBB 5*++ 	% /2L,
33 %$%'' 	+:?+ + KK+ + +  
 ))%00 	)38:) ) )   uj))				 4<?J77		
 6TY 6 6&*l1o&A6 6 6   	E""" 	$!!!!!DJ#Dr   c                     | j                                         }d| _        d| _        |r|                                  |S )z$Removes the last layer in the model.FN)r!   popr6   r    r#   )r$   r   r&   s      r   r9   zSequential.pop}   sC      ""
 	"!!!r   c                     d| _         d | _        t          | j        d         t                    rAt          | j                  dk    r+| j        d         j        }|                     |           d S d S d S )NFr      )r6   r    r0   r!   r   lenr4   build)r$   input_shapes     r   r#   zSequential._maybe_rebuild   ss    
dl1oz22 	$s4<7H7H17L7L,q/5KJJ{#####	$ 	$7L7Lr   c                     d S r    r$   s    r   _lock_statezSequential._lock_state   s    r   c                     dS )Nr   r@   rA   s    r   	_obj_typezSequential._obj_type   s    |r   c                    t          |t          t          f          sd S |r%t          |d         t                    s
|d         d S | j        st          d| j         d          t          | j        d         t                    rD| j        d         j        |k    r-t          d| j         d| j        d         j         d|           n1| j        d         j	        }t          ||          g| j        z   | _        | j        d         j
        }|}| j        dd          D ]}	  ||          }# t          $ r Y  d S t          $ ru}t          j        |j                  }d	 |j                                        D             }t%          |          dk    rt          d
|j        j         d|           |d }~ww xY w|}	t+          ||	          | _        d| _        d S )Nr   zSequential model zC cannot be built because it has no layers. Call `model.add(layer)`.r,   r-   z'. You cannot build it with input_shape )r4   dtyper;   c                 F    g | ]}|j         t          j        j        k    |S r@   )defaultinspect	Parameterempty).0params     r   
<listcomp>z$Sequential.build.<locals>.<listcomp>   s5     # # #}(9(??? ???r   zgLayers added to a Sequential model can only have a single positional argument, the input tensor. Layer z$ has multiple positional arguments: )inputsoutputsT)r0   tuplelistintr!   r1   r   r   r4   compute_dtypeoutputNotImplementedError	TypeErrorrI   	signaturecall
parametersvaluesr<   r   __name__r
   r    r6   )
r$   r>   rF   rO   xr&   erX   positional_argsrP   s
             r   r=   zSequential.build   sq   +t}55 	 F 	{1~s++	/:1~/E F| 	6DI 6 6 6   dl1oz22 	|A*k99 6 6 6|A26 6 )46 6   : LO1E{%@@@DL
 a'\!""% 	 	EE!HH&       #-ej99	# #!*!5!<!<!>!># # #
 ''1,,$P38?3KP P ?NP P    %VWEEE


s    D,,
F8:	F8A0F33F8c                     | j         r| j                             |||          S | j        D ]A}i }|j        r||d<   |j        r|||d<    ||fi |}|}d }t          j        ||          }B|S )Ntrainingmaskrc   rb   c                 $    t          | dd           S )N_keras_mask)r.   )kts    r   _get_mask_from_keras_tensorz4Sequential.call.<locals>._get_mask_from_keras_tensor   s    r=$777r   )r    rY   r%   _call_has_mask_arg_call_has_training_argr   map_structure)r$   rO   rb   rc   r&   r   rP   rg   s           r   rY   zSequential.call   s     	O#((((NNN [ 	L 	LE
 F' &!%v+ .0D%-z"eF--f--GF8 8 8 %&A7KKDDr   c                 r    | j         }|r%t          |d         t                    r
|dd          S |d d          S )Nr   r;   )r!   r0   r   )r$   r%   s     r   r%   zSequential.layers   sD    
  	jJ77 	!"":aaayr   c                     | j         r| j                             |||          S | j        D ]}|                    ||          }|}|S )Nra   )rb   )r    compute_output_specr%   )r$   rO   rb   rc   r&   rP   s         r   rm   zSequential.compute_output_spec   st     	#77 8    [ 	 	E// 0  G FFr   c                 X    | j         r| j         j        S t          d| j         d          )Nr,   z!' has no defined input shape yet.)r    r>   r1   r   rA   s    r   r>   zSequential.input_shape   s;     	0#//MMMM
 
 	
r   c                 X    | j         r| j         j        S t          d| j         d          )Nr,   z"' has no defined output shape yet.)r    output_shaper1   r   rA   s    r   rp   zSequential.output_shape  s;     	1#00NNNN
 
 	
r   c                 X    | j         r| j         j        S t          d| j         d          )Nr,   z' has no defined inputs yet.)r    rO   r1   r   rA   s    r   rO   zSequential.inputs  s;     	+#**HHHH
 
 	
r   c                 X    | j         r| j         j        S t          d| j         d          )Nr,   z' has no defined outputs yet.)r    rP   r1   r   rA   s    r   rP   zSequential.outputs  s;     	,#++IIII
 
 	
r   c                     | j         }|r(t          |d         t                    r|d         j        S t	                      j        S )Nr   )r!   r0   r   rF   r   input_dtype)r$   r%   r   s     r   rt   zSequential.input_dtype  sB      	#jJ77 	#!9?"ww""r   c                 H    | j         D ]}|j        |j        k    r||ur dS dS )NFT)r!   r   )r$   r&   	ref_layers      r   r3   z Sequential._is_layer_name_unique(  s9     	 	IzY^++	0F0Fuutr   c                 p   t           j        }t          j        dd          rt          j        }g }t                      j        D ] }|                     ||                     !t          j	        |           }| j
        |d<   t          j        |          |d<   | j        | j        d         j        |d<   |S )Nuse_legacy_configFr   r%   r   build_input_shape)r   serialize_keras_objectr   get_global_attributelegacy_serializationr   r%   r5   r   
get_configr   copydeepcopyr    r!   r4   )r$   serialize_fnlayer_configsr&   configr   s        r   r}   zSequential.get_config.  s    (?,-@%HH 	G/FLWW^ 	6 	6E   e!4!45555!$''v=77x'*.,q/*EF&'r   c                    d|v r&|d         }|                     d          }|d         }nd }|} | |          }|D ]H}d|vrt          j        ||          }nt          j        ||          }|                    |           I|j        s3|r1t          |t          t          f          r|
                    |           |S )Nr   ry   r%   )r   module)custom_objects)getr   model_from_configr   deserialize_keras_objectr"   r    r0   rQ   rR   r=   )	r   r   r   r   ry   r   modellayer_configr&   s	            r   from_configzSequential.from_config?  s   V&>D &

+> ? ?"8,MMD"M) 	 	L|++ %6 #1  
 *B #1   IIe!	+!	+ ,udm<<	+
 KK)***r   )NTN)Tr   )NN)r\   
__module____qualname____doc__r   r   r"   r9   r#   rB   rD   r=   rY   propertyr%   rm   r>   rp   rO   rP   rt   r3   r}   classmethodr   __classcell__)r   s   @r   r   r      s       + +Z= = = = =" " " " " "/$ /$ /$ /$b   $ $ $    9 9 9 9v   2   X    
 
 X
 
 
 X
 
 
 X
 
 
 X
 # # # # X#      "    [    r   r   )r~   rI   r   	keras.srcr   keras.src.api_exportr   keras.src.backend.commonr   !keras.src.layers.core.input_layerr   keras.src.layers.layerr   keras.src.legacy.savingr   r	   r|   keras.src.models.functionalr
   keras.src.models.modelr   keras.src.savingr   r   r@   r   r   <module>r      s0            - - - - - - 1 1 1 1 1 1 8 8 8 8 8 8 ( ( ( ( ( ( 0 0 0 0 0 0 I I I I I I 2 2 2 2 2 2 ( ( ( ( ( ( . . . . . . !#<=>>K K K K K K K ?>K K Kr   