o
    2h                     @   sH   d dl Z d dlmZ d dlmZ d dlmZ edG dd deZdS )    N)keras_export)MonitorCallback)io_utilszkeras.callbacks.EarlyStoppingc                       sX   e Zd ZdZ								d fdd	Zdd	d
ZdddZdddZdd Z  Z	S )EarlyStoppingax  Stop training when a monitored metric has stopped improving.

    Assuming the goal of a training is to minimize the loss. With this, the
    metric to be monitored would be `'loss'`, and mode would be `'min'`. A
    `model.fit()` training loop will check at end of every epoch whether
    the loss is no longer decreasing, considering the `min_delta` and
    `patience` if applicable. Once it's found no longer decreasing,
    `model.stop_training` is marked True and the training terminates.

    The quantity to be monitored needs to be available in `logs` dict.
    To make it so, pass the loss or metrics at `model.compile()`.

    Args:
        monitor: Quantity to be monitored. Defaults to `"val_loss"`.
        min_delta: Minimum change in the monitored quantity to qualify as an
            improvement, i.e. an absolute change of less than min_delta, will
            count as no improvement. Defaults to `0`.
        patience: Number of epochs with no improvement after which training will
            be stopped. Defaults to `0`.
        verbose: Verbosity mode, 0 or 1. Mode 0 is silent, and mode 1 displays
            messages when the callback takes an action. Defaults to `0`.
        mode: One of `{"auto", "min", "max"}`. In `min` mode, training will stop
            when the quantity monitored has stopped decreasing; in `"max"` mode
            it will stop when the quantity monitored has stopped increasing; in
            `"auto"` mode, the direction is automatically inferred from the name
            of the monitored quantity. Defaults to `"auto"`.
        baseline: Baseline value for the monitored quantity. If not `None`,
            training will stop if the model doesn't show improvement over the
            baseline. Defaults to `None`.
        restore_best_weights: Whether to restore model weights from the epoch
            with the best value of the monitored quantity. If `False`, the model
            weights obtained at the last step of training are used. An epoch
            will be restored regardless of the performance relative to the
            `baseline`. If no epoch improves on `baseline`, training will run
            for `patience` epochs and restore weights from the best epoch in
            that set. Defaults to `False`.
        start_from_epoch: Number of epochs to wait before starting to monitor
            improvement. This allows for a warm-up period in which no
            improvement is expected and thus training will not be stopped.
            Defaults to `0`.

    Example:

    >>> callback = keras.callbacks.EarlyStopping(monitor='loss',
    ...                                               patience=3)
    >>> # This callback will stop the training when there is no improvement in
    >>> # the loss for three consecutive epochs.
    >>> model = keras.models.Sequential([keras.layers.Dense(10)])
    >>> model.compile(keras.optimizers.SGD(), loss='mse')
    >>> history = model.fit(np.arange(100).reshape(5, 20), np.zeros(5),
    ...                     epochs=10, batch_size=1, callbacks=[callback],
    ...                     verbose=0)
    >>> len(history.history['loss'])  # Only 4 epochs are run.
    4
    val_lossr   autoNFc	           	         sF   t  j|||d || _|| _|| _d| _d| _|| _d | _|| _	d S )N)	min_deltar   )
super__init__patienceverbosebaselinewaitstopped_epochrestore_best_weightsbest_weightsstart_from_epoch)	selfmonitorr   r   r   moder   r   r   	__class__ ]/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/callbacks/early_stopping.pyr
   B   s   
zEarlyStopping.__init__c                 C   s   d| _ d| _d | _d| _d S )Nr   )r   r   r   
best_epochr   logsr   r   r   on_train_beginW   s   
zEarlyStopping.on_train_beginc                 C   s   | j d u r	|   | |}|d u s|| jk rd S | jr*| jd u r*| j | _|| _|  j	d7  _	| 
|| jrX|| _|| _| jrG| j | _| jd u sS| 
|| jrVd| _	d S | j	| jkrk|dkrm|| _d| j_d S d S d S )N   r   T)
monitor_op_set_monitor_opget_monitor_valuer   r   r   modelget_weightsr   r   _is_improvementbestr   r   r   stop_training)r   epochr   currentr   r   r   on_epoch_end^   s.   

zEarlyStopping.on_epoch_endc                 C   sx   | j dkr| jdkrtd| j d  d | jr8| jd ur:| jdkr/td| jd  d | j| j d S d S d S )Nr   zEpoch r   z: early stoppingz8Restoring model weights from the end of the best epoch: .)	r   r   r   	print_msgr   r   r   r"   set_weightsr   r   r   r   on_train_end   s   
zEarlyStopping.on_train_endc              	   C   sJ   |pi }| | j}|d u r#tjd| j ddt|  dd |S )Nz&Early stopping conditioned on metric `z1` which is not available. Available metrics are: ,   )
stacklevel)getr   warningswarnjoinlistkeys)r   r   monitor_valuer   r   r   r!      s   
zEarlyStopping.get_monitor_value)r   r   r   r   r   NFr   )N)
__name__
__module____qualname____doc__r
   r   r)   r-   r!   __classcell__r   r   r   r   r      s    :


"r   )r2   keras.src.api_exportr   $keras.src.callbacks.monitor_callbackr   keras.src.utilsr   r   r   r   r   r   <module>   s    