o
    2h                     @   sT   d dl Zd dlm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)backend)keras_export)Callback)io_utilsz%keras.callbacks.LearningRateSchedulerc                       s6   e Zd ZdZd
 fdd	ZdddZddd	Z  ZS )LearningRateSchedulera#  Learning rate scheduler.

    At the beginning of every epoch, this callback gets the updated learning
    rate value from `schedule` function provided at `__init__`, with the current
    epoch and current learning rate, and applies the updated learning rate on
    the optimizer.

    Args:
        schedule: A function that takes an epoch index (integer, indexed from 0)
            and current learning rate (float) as inputs and returns a new
            learning rate as output (float).
        verbose: Integer. 0: quiet, 1: log update messages.

    Example:

    >>> # This function keeps the initial learning rate for the first ten epochs
    >>> # and decreases it exponentially after that.
    >>> def scheduler(epoch, lr):
    ...     if epoch < 10:
    ...         return lr
    ...     else:
    ...         return lr * ops.exp(-0.1)
    >>>
    >>> model = keras.models.Sequential([keras.layers.Dense(10)])
    >>> model.compile(keras.optimizers.SGD(), loss='mse')
    >>> round(model.optimizer.learning_rate, 5)
    0.01

    >>> callback = keras.callbacks.LearningRateScheduler(scheduler)
    >>> history = model.fit(np.arange(100).reshape(5, 20), np.zeros(5),
    ...                     epochs=15, callbacks=[callback], verbose=0)
    >>> round(model.optimizer.learning_rate, 5)
    0.00607

    r   c                    s   t    || _|| _d S N)super__init__scheduleverbose)selfr
   r   	__class__ f/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/callbacks/learning_rate_scheduler.pyr	   /   s   

zLearningRateScheduler.__init__Nc                 C   s   t | jjdstdztt| jjj}| ||}W n t	y+   | |}Y nw t
|ttjtjfs=td| || jj_| jdkrWtd|d  d| d d S d S )	Nlearning_ratez0Optimizer must have a "learning_rate" attribute.z>The output of the `schedule` function should be a float. Got: r   z
Epoch    z1: LearningRateScheduler setting learning rate to .)hasattrmodel	optimizer
ValueErrorfloatr   convert_to_numpyr   r
   	TypeError
isinstancenpfloat32float64r   r   	print_msg)r   epochlogsr   r   r   r   on_epoch_begin4   s0   

z$LearningRateScheduler.on_epoch_beginc                 C   s$   |pi }t t| jjj|d< d S )Nr   )r   r   r   r   r   r   )r   r    r!   r   r   r   on_epoch_endM   s   z"LearningRateScheduler.on_epoch_end)r   r   )__name__
__module____qualname____doc__r	   r"   r#   __classcell__r   r   r   r   r   	   s
    $
r   )numpyr   	keras.srcr   keras.src.api_exportr   keras.src.callbacks.callbackr   keras.src.utilsr   r   r   r   r   r   <module>   s    