B
    ӻd[                 @   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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)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)nest)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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| _|rt|ttfsl|g}x|D ]}| | qrW 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__ [/var/www/html/venv/lib/python3.7/site-packages/tensorflow/python/keras/engine/sequential.pyr   i   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rRt|t	j
sbt|}ntdt| t|g | |std|jf d| _d}| dg  | js@t|tjrd}n4t|\}}|rtj|||jd	 d
}|| d}|rt|jd j}t|dkrtt|| _t !| jd | _"d| _d| _#n@| jr|| jd }tt|dkrrt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_inputsr/   r0   xr>   Zoutput_tensorr(   r(   r)   r$      s^    


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 )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.NFr1   T)r   r6   r-   popr   r>   rA   r:   r   r   r   _outbound_nodesoutputrB   )r%   r&   r(   r(   r)   rG      s     
zSequential.popc       
   	   C   sJ  |d ks| j sd S t r"t s&d S | jsF| jsFt|}| jd krN|}nt	| j|}|d k	rF|| jkrFt
  tj||| j d jd d}|}t }xd| j D ]Z}t|| j y||}W n   d| _d S tt|dkrttt|| |}|}	qW || _y| ||	 d| _W n   d| _Y nX W d Q R X || _d S )Nr   r.   )r/   r0   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<   r9   r@    track_nodes_created_by_last_callrB   r   )
r%   input_shapeZinput_dtypeZ	new_shaperA   Zlayer_inputcreated_nodesr&   Zlayer_outputr>   r(   r(   r)   '_build_graph_network_for_inferred_shape  sJ    

	

z2Sequential._build_graph_network_for_inferred_shapec                s`   | j r| | j| j n>|d kr(td| | | jsVt|}|| _t	t
| | d| _d S )Nz+You must provide an `input_shape` argument.T)r   rB   rA   r>   r9   rP   r:   r#   _build_input_shaper   r   build)r%   rN   )r'   r(   r)   rR   X  s    
zSequential.buildc                s  | j s`t|sPt|tjsPd| _tt	|| _
t r`tdt||f  n| |j|j | jr| js|| | j| j tt| j|||dS |}xt| jD ]j}i }| j| j}d|kr||d< d|kr||d< ||f|}tt|dkrt t!|}t"|dd }qW |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maskrT   rS   r*   _keras_mask)#r   r   Z
is_tf_typer!   r   Zndarrayr    r   Zmap_structure_get_shape_tuplerQ   r   rJ   r3   r4   typerP   shaper0   r   r:   rB   rA   r>   r   r   rE   r   r   argsr?   r<   r9   r@   getattr)r%   rA   rS   rT   r>   r&   kwargsZargspec)r'   r(   r)   rE   f  s6    
zSequential.callc             C   s"   |}x| j D ]}||}qW |S )N)r   compute_output_shape)r%   rN   rX   r&   r(   r(   r)   r\     s    zSequential.compute_output_shapec             C   s   | j ||d}t|dd S )N)rT   rU   )rE   rZ   )r%   rA   rT   r>   r(   r(   r)   compute_mask  s    zSequential.compute_mask    r   c             C   s>   t d | |||}| dk s0| 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maxr3   r4   )r%   rF   
batch_sizeverbosepredsr(   r(   r)   predict_proba  s
    

zSequential.predict_probac             C   sF   t d | j|||d}|jd dkr4|jddS |dkdS 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).)rd   re   r1   r*   )Zaxisg      ?Zint32N)r_   r`   ra   rX   ZargmaxZastype)r%   rF   rd   re   Zprobar(   r(   r)   predict_classes  s
    
	zSequential.predict_classesc                sZ   g }x$t t| jD ]}|t| qW | jt|d}| j	sV| j
d k	rV| j
|d< |S )N)r   r   build_input_shape)r   r   r   rC   r   Zserialize_keras_objectr   copydeepcopyZ_is_graph_networkrQ   )r%   layer_configsr&   config)r'   r(   r)   
get_config  s    
zSequential.get_configc       	      C   s   d|kr$|d }| d}|d }nd }d }|}| |d}x$|D ]}tj||d}|| q@W |js|rt|ttfr|| |S )Nr   ri   r   )r   )custom_objects)	getlayer_moduleZdeserializer$   rA   r!   r#   r"   rR   )	clsrm   ro   r   ri   rl   modelZlayer_configr&   r(   r(   r)   from_config  s     





zSequential.from_configc             C   s6   t | dr| jS | jr2t | jd dr2| jd jS d S )N_manual_input_specr   
input_spec)r2   ru   r   rv   )r%   r(   r(   r)   rv     s
    
zSequential.input_specc             C   s
   || _ d S )N)ru   )r%   valuer(   r(   r)   rv      s    c             C   s
   t | S )N)r
   ZSequentialSavedModelSaver)r%   r(   r(   r)   _trackable_saved_model_saver  s    z'Sequential._trackable_saved_model_saverc             C   s,   x&| j D ]}|j|jkr||k	rdS qW dS )NFT)r   r   )r%   r&   Z	ref_layerr(   r(   r)   r8     s    z Sequential._is_layer_name_uniquec                s   | j r
d S ttj|   d S )N)r   r   r   r   _assert_weights_created)r%   )r'   r(   r)   ry     s    z"Sequential._assert_weights_created)NN)N)N)NN)r^   r   )r^   r   )N)__name__
__module____qualname____doc__	trackableZ no_automatic_dependency_trackingr   propertyr   r$   rG   rP   r   defaultrR   rE   r\   r]   rg   rh   rn   classmethodrt   rv   setterrx   r8   ry   __classcell__r(   r(   )r'   r)   r   /   s.   8$XJ,

r   c             C   s<   t | dr8| j}t|tr|S |jd k	r4t| S d S d S )NrX   )r2   rX   r!   r#   Zrankas_list)trX   r(   r(   r)   rV     s    


rV   c             C   s@   | d ks|d k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 )Nr(   ).0Zd1Zd2r(   r(   r)   	<genexpr>&  s    z$relax_input_shape.<locals>.<genexpr>)r?   r#   zip)Zshape_1Zshape_2r(   r(   r)   rK   !  s
    rK   c                sZ   x>| j D ]4}|j}x(t|D ]} fdd|jD |_qW qW  fdd| j D | _ dS )zARemove nodes from `created_nodes` from the layer's inbound_nodes.c                s   g | ]}| kr|qS r(   r(   )r   n)rO   r(   r)   
<listcomp>/  s    z2clear_previously_created_nodes.<locals>.<listcomp>c                s   g | ]}| kr|qS r(   r(   )r   r   )rO   r(   r)   r   2  s    N)r=   inbound_layersr   r<   rH   )r&   rO   nodeprev_layers
prev_layerr(   )rO   r)   rL   )  s
    rL   c             C   sT   | j s
dS || j d  | j d j}x(t|D ]}|jr2||jd  q2W dS )zFAdds to `created_nodes` the nodes created by the last call to `layer`.Nr1   )r=   r$   r   r   r<   rH   )r&   rO   r   r   r(   r(   r)   rM   5  s    rM   ),r}   rj   r_   Ztensorflow.pythonr   Ztensorflow.python.frameworkr   r   Ztensorflow.python.kerasr   rq   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   r3   Ztensorflow.python.trackabler   r~   Ztensorflow.python.utilr   Z tensorflow.python.util.tf_exportr   r@   r   r   rV   rK   rL   rM   r(   r(   r(   r)   <module>   s>   
   i