o
    N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)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`.
        ZWideDeepTN )super__init__r   Zkeras_premade_model_gaugeZget_cellsetlinear_model	dnn_modelr   get
activation)selfr   r   r   kwargs	__class__r   ND:\Projects\ConvertPro\env\Lib\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 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   Z_expects_training_argr   Zlearning_phasetfnestZ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 }| |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   )Z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   Zunpack_x_y_sample_weightr$   ZGradientTapeZcompiled_lossZlossesZcompiled_metricsZupdate_stater    	optimizerr"   r!   r   trainable_variablesr   ZgradientZapply_gradientszipmetrics)r   datar   r   Zsample_weightZtapeZy_predlossZlinear_varsZdnn_varsZlinear_gradsZ	dnn_gradslinear_optimizerdnn_optimizerr1   Z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 )	NZtrain_functionr   r)   r   )paramsr5   c                 S   s   g | ]
}t |d r|jqS )_call_result)hasattrr:   r,   r   r   r   
<listcomp>   s    z6WideDeepModel._make_train_function.<locals>.<listcomp>)updatesr*   )Z,_recompile_weights_loss_and_weighted_metricsZ$_check_trainable_weights_consistencygetattrZ_get_trainable_stateZ_set_trainable_stateZ_compiled_trainable_stateZ_feed_inputsZ_feed_targetsZ_feed_sample_weightsr    r   Zsymbolic_learning_phaseintr0   r"   r!   Z	get_graphZ
as_defaultZ
name_scopeZget_updatesr   Ztrainable_weightsZ
total_lossr   Zget_updates_forr&   Z_get_training_eval_metricsfunctionZ_function_kwargssetattr)r   Zhas_recompiledZcurrent_trainable_stater&   r6   r7   r=   Zlinear_updatesZdnn_updatesr3   Z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	   Zserialize_keras_objectr   r   r   	serializer   r   ZLayer
get_configdictr"   items)r   linear_config
dnn_configconfigZbase_configr   r   r   rF      s   
zWideDeepModel.get_configc                 C   sX   | d}t||}| d}t||}tj| dd |d}| d|||d|S )Nr   r   r   )custom_objectsrD   r   )poplayer_moduleZdeserializer   )clsrK   rL   rI   r   rJ   r   r   r   r   r   from_config   s   

zWideDeepModel.from_configr   )__name__
__module____qualname____doc__r   r(   r8   rC   rF   classmethodrP   __classcell__r   r   r   r   r       s    )
Cr   )rT   Ztensorflow.compat.v2compatv2r$   Zkerasr   r   r   rN   Zkeras.enginer   r   r   Zkeras_trainingZkeras.saving.legacyr	   Ztensorflow.python.utilr
   Z tensorflow.python.util.tf_exportr   Zdeprecated_endpointsZModelr   r   r   r   r   <module>   s"   