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 e
 eddg d	G d
d dejZej deje_ dS )z!Adagrad optimizer implementation.    N)initializers)	optimizer)register_keras_serializable)keras_exportz%keras.optimizers.experimental.Adagradzkeras.optimizers.Adagrad)v1c                       sZ   e Zd ZdZ												 d fd	d
	Z fddZdd Z fddZ  ZS )Adagrada6  Optimizer that implements the Adagrad algorithm.

    Adagrad is an optimizer with parameter-specific learning rates,
    which are adapted relative to how frequently a parameter gets
    updated during training. The more updates a parameter receives,
    the smaller the updates.

    Args:
      learning_rate: Initial value for the learning rate:
        either a floating point value,
        or a `tf.keras.optimizers.schedules.LearningRateSchedule` instance.
        Defaults to 0.001.
        Note that `Adagrad` tends to benefit from higher initial learning rate
        values compared to other optimizers.
        To match the exact form in the original paper, use 1.0.
      initial_accumulator_value: Floating point value.
        Starting value for the accumulators (per-parameter momentum values).
        Must be non-negative.
      epsilon: Small floating point value used to maintain numerical stability.
      {{base_optimizer_keyword_args}}

    Reference:
      - [Duchi et al., 2011](
        http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf).
    MbP?皙?Hz>NFGz?Tc                    sB   t  jd||||||	|
||d	| | || _|| _|| _d S )N)	weight_decayclipnorm	clipvalueglobal_clipnormuse_emaema_momentumema_overwrite_frequencyjit_compilename )super__init__Z_build_learning_rate_learning_rateinitial_accumulator_valueepsilon)selflearning_rater   r   r   r   r   r   r   r   r   r   r   kwargs	__class__r   _D:\Projects\ConvertPro\env\Lib\site-packages\keras/optimizers/optimizer_experimental/adagrad.pyr   :   s    

zAdagrad.__init__c              
      sj   t  | t| dr| jrd S d| _g | _t| j}|D ]}| j| j	|d||j
|jdd qd S )N_builtTaccumulator)shapedtype)initial_value)r   buildhasattrr!   _accumulatorsr   Constantr   appendZadd_variable_from_referencer#   r$   )r   Zvar_listZinitializervarr   r   r    r&   Z   s   zAdagrad.buildc                 C   s   t | j|j}| |}| j| j|  }t|t jrK|	t |j
|j
 |j t j||jd}t || j }|	t | |j
 | |j dS |||  ||| t || j   dS )z=Update step given gradient and the associated model variable.)indicesN)tfcastr   r$   Z_var_keyr(   Z_index_dict
isinstanceZIndexedSlicesZscatter_addvaluesr,   gathersqrtr   Z
assign_addZ
assign_sub)r   ZgradvariablelrZvar_keyr"   Zsparse_accumulatorZsparse_denominatorr   r   r    update_stepj   s    
"zAdagrad.update_stepc                    s,   t   }|| | j| j| jd |S )N)r   r   r   )r   
get_configupdateZ_serialize_hyperparameterr   r   r   )r   configr   r   r    r6      s   
	zAdagrad.get_config)r   r	   r
   NNNNFr   NTr   )	__name__
__module____qualname____doc__r   r&   r5   r6   __classcell__r   r   r   r    r      s$     r   z{{base_optimizer_keyword_args}})r<   Ztensorflow.compat.v2compatv2r-   Zkerasr   Z'keras.optimizers.optimizer_experimentalr   Z keras.saving.object_registrationr   Z tensorflow.python.util.tf_exportr   Z	Optimizerr   replaceZbase_optimizer_keyword_argsr   r   r   r    <module>   s   r
