a
    Sic&                     @   s   d 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 edddgdedG dd dejZdS )z!Built-in WideNDeep model classes.    N)activations)backend)layers)
base_layer)data_adaptertraining)generic_utils)deprecation)keras_exportz keras.experimental.WideDeepModelzkeras.models.WideDeepModel)v1c                       sR   e Zd ZdZd fdd	ZdddZdd Zd	d
 Zdd Ze	dddZ
  ZS )WideDeepModela,  Wide & Deep Model for regression and classification problems.

    This model jointly train a linear and a dnn model.

    Example:

    ```python
    linear_model = LinearModel()
    dnn_model = keras.Sequential([keras.layers.Dense(units=64),
                                 keras.layers.Dense(units=1)])
    combined_model = WideDeepModel(linear_model, dnn_model)
    combined_model.compile(optimizer=['sgd', 'adam'],
                           loss='mse', metrics=['mse'])
    # define dnn_inputs and linear_inputs as separate numpy arrays or
    # a single numpy array if dnn_inputs is same as linear_inputs.
    combined_model.fit([linear_inputs, dnn_inputs], y, epochs)
    # or define a single `tf.data.Dataset` that contains a single tensor or
    # separate tensors for dnn_inputs and linear_inputs.
    dataset = tf.data.Dataset.from_tensors(([linear_inputs, dnn_inputs], y))
    combined_model.fit(dataset, epochs)
    ```

    Both linear and dnn model can be pre-compiled and trained separately
    before jointly training:

    Example:
    ```python
    linear_model = LinearModel()
    linear_model.compile('adagrad', 'mse')
    linear_model.fit(linear_inputs, y, epochs)
    dnn_model = keras.Sequential([keras.layers.Dense(units=1)])
    dnn_model.compile('rmsprop', 'mse')
    dnn_model.fit(dnn_inputs, y, epochs)
    combined_model = WideDeepModel(linear_model, dnn_model)
    combined_model.compile(optimizer=['sgd', 'adam'],
                           loss='mse', metrics=['mse'])
    combined_model.fit([linear_inputs, dnn_inputs], y, epochs)
    ```

    Nc                    s@   t  jf i | tjdd || _|| _t	|| _
dS )a  Create a Wide & Deep Model.

        Args:
          linear_model: a premade LinearModel, its output must match the output
            of the dnn model.
          dnn_model: a `tf.keras.Model`, its output must match the output of the
            linear model.
          activation: Activation function. Set it to None to maintain a linear
            activation.
          **kwargs: The keyword arguments that are passed on to
            BaseLayer.__init__. Allowed keyword arguments include `name`.
        ZWideDeepTN)super__init__r   keras_premade_model_gaugeget_cellsetlinear_model	dnn_modelr   get
activation)selfr   r   r   kwargs	__class__ Z/var/www/html/django/DPS/env/lib/python3.9/site-packages/keras/premade_models/wide_deep.pyr   O   s
    zWideDeepModel.__init__c                 C   s   t |ttfrt|dkr$| }}n|\}}| |}| jjr^|d u rNt }| j||d}n
| |}t	j
dd ||}| jrt	j
| j|S |S )N   r   c                 S   s   | | S )Nr   )xyr   r   r   <lambda>p       z$WideDeepModel.call.<locals>.<lambda>)
isinstancetuplelistlenr   r   _expects_training_argr   learning_phasetfnestmap_structurer   )r   inputsr   Zlinear_inputsZ
dnn_inputsZlinear_outputZ
dnn_outputoutputr   r   r   callb   s    



zWideDeepModel.callc                 C   s  t |\}}}t 0}| |dd}| j|||| jd}W d    n1 sN0    Y  | j||| t| j	t
tfr| jj}| jj}	||||	f\}
}| j	d }| j	d }|t|
| |t||	 n$| j}|||}| j	t|| dd | jD S )NTr   )regularization_lossesr      c                 S   s   i | ]}|j | qS r   )nameresult.0mr   r   r   
<dictcomp>   r!   z,WideDeepModel.train_step.<locals>.<dictcomp>)r   unpack_x_y_sample_weightr(   GradientTapecompiled_losslossescompiled_metricsupdate_stater"   	optimizerr$   r#   r   trainable_variablesr   gradientapply_gradientszipmetrics)r   datar   r   sample_weighttapey_predlossZlinear_varsZdnn_varsZlinear_gradsZ	dnn_gradslinear_optimizerdnn_optimizerr=   gradsr   r   r   
train_stepw   s*    

$

zWideDeepModel.train_stepc              	   C   s  |   }|   t| dd d u s&|r|  }| | j | j| j | j }t	t
 tsh|t
 g7 }t	| jttfr| jd }| jd }n| j}| j}t
   t
dj g }|j| jj| jd}||7 }|j| jj| jd}||7 }|| d 7 }|| | j7 }W d    n1 s$0    Y  |  }	dd |	D }
W d    n1 sZ0    Y  t
d@ t
j|| jg|
 f|dd| j}t| d| W d    n1 s0    Y  | | d S )	Ntrain_functionr   r/   r   )paramsrF   c                 S   s   g | ]}t |d r|jqS )_call_result)hasattrrM   r2   r   r   r   
<listcomp>   s   
z6WideDeepModel._make_train_function.<locals>.<listcomp>)updatesr0   ),_recompile_weights_loss_and_weighted_metrics$_check_trainable_weights_consistencygetattr_get_trainable_state_set_trainable_state_compiled_trainable_state_feed_inputs_feed_targets_feed_sample_weightsr"   r   symbolic_learning_phaseintr<   r$   r#   	get_graph
as_default
name_scopeget_updatesr   trainable_weights
total_lossr   get_updates_forr+   _get_training_eval_metricsfunction_function_kwargssetattr)r   has_recompiledcurrent_trainable_stater+   rG   rH   rP   Zlinear_updatesZdnn_updatesrA   metrics_tensorsfnr   r   r   _make_train_function   sb    
0&
,z"WideDeepModel._make_train_functionc                 C   sT   t | j}t | j}||t| jd}tj	| }t
t| t|  S )Nr   r   r   )r	   serialize_keras_objectr   r   r   	serializer   r   Layer
get_configdictr$   items)r   linear_config
dnn_configconfigbase_configr   r   r   rp      s    
zWideDeepModel.get_configc                 C   sX   | d}t||}| d}t||}tj| dd |d}| f |||d|S )Nr   r   r   )custom_objectsrl   )poplayer_moduledeserializer   )clsru   rw   rs   r   rt   r   r   r   r   r   from_config   s    

zWideDeepModel.from_config)N)N)N)__name__
__module____qualname____doc__r   r-   rJ   rk   rp   classmethodr|   __classcell__r   r   r   r   r       s   )
Cr   )r   Ztensorflow.compat.v2compatv2r(   kerasr   r   r   ry   keras.enginer   r   r   Zkeras_trainingkeras.utilsr	   tensorflow.python.utilr
    tensorflow.python.util.tf_exportr   deprecated_endpointsModelr   r   r   r   r   <module>   s    