o
    i e&                     @   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)serialization_lib)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d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`.
        WideDeepTN )super__init__r   keras_premade_model_gaugeget_cellsetlinear_model	dnn_modelr   get
activation)selfr   r   r   kwargs	__class__r   Q/var/www/myenv/lib/python3.10/site-packages/keras/src/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 r't }| j||d}n| |}t	j
dd ||}| jrIt	j
| j|S |S )N   r   c                 S   s   | | S Nr   )xyr   r   r   <lambda>p   s    z$WideDeepModel.call.<locals>.<lambda>)
isinstancetuplelistlenr   r   _expects_training_argr   learning_phasetfnestmap_structurer   )r   inputsr   linear_inputs
dnn_inputslinear_output
dnn_outputoutputr   r   r   callb   s   



zWideDeepModel.callc                 C   s  t |\}}}t }| |dd}| j|||| jd}W d    n1 s'w   Y  | j||| t| j	t
tfri| 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>   s    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losslinear_varsdnn_varslinear_grads	dnn_gradslinear_optimizerdnn_optimizerrB   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s3|t
 g7 }t	| jttfrF| jd }| jd }n| j}| j}t
  U t
d5 g }|j| jj| jd}||7 }|j| jj| jd}||7 }|| d 7 }|| | j7 }W d    n1 sw   Y  |  }	dd |	D }
W d    n1 sw   Y  t
d  t
j|| jg|
 f|dd| j}t| d| W d    n1 sw   Y  | | d S d S )	Ntrain_functionr   r4   r   )paramsrK   c                 S   s   g | ]
}t |d r|jqS )_call_result)hasattrrV   r7   r   r   r   
<listcomp>   s    z6WideDeepModel._make_train_function.<locals>.<listcomp>)updatesr5   ),_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intrA   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,   rP   rQ   rY   linear_updatesdnn_updatesrF   metrics_tensorsfnr   r   r   _make_train_function   sj   

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   r{      s   
zWideDeepModel.get_configc                 C   sX   | d}t||}| d}t||}tj| dd |d}| d|||d|S )Nr   r   r   )custom_objectsrw   r   )poplayer_moduledeserializer   )clsr   r   r~   r   r   r   r   r   r   r   from_config   s   

zWideDeepModel.from_configr   )__name__
__module____qualname____doc__r   r2   rS   rv   r{   classmethodr   __classcell__r   r   r   r   r       s    )
Cr   )r   tensorflow.compat.v2compatv2r)   	keras.srcr   r   r   r   keras.src.enginer   r   r   keras_trainingkeras.src.savingr	   tensorflow.python.utilr
    tensorflow.python.util.tf_exportr   deprecated_endpointsModelr   r   r   r   r   <module>   s"   