.. _cn_api_fluid_dygraph_StepDecay:

StepDecay
-------------------------------


.. py:class:: paddle.fluid.dygraph.StepDecay(learning_rate, step_size, decay_rate=0.1)

:api_attr: 命令式编程模式（动态图)


该接口提供 ``step_size`` 衰减学习率的功能，每经过 ``step_size`` 个 ``epoch`` 时会通过 ``decay_rate`` 衰减一次学习率。

算法可以描述为：

.. code-block:: text

    learning_rate = 0.5
    step_size = 30
    decay_rate = 0.1
    learning_rate = 0.5     if epoch < 30
    learning_rate = 0.05    if 30 <= epoch < 60
    learning_rate = 0.005   if 60 <= epoch < 90
    ...

参数：
    - **learning_rate** (float|int) - 初始化的学习率。可以是Python的float或int。
    - **step_size** (int) - 学习率每衰减一次的间隔。
    - **decay_rate** (float, optional) - 学习率的衰减率。 ``new_lr = origin_lr * decay_rate`` 。其值应该小于1.0。默认：0.1。

返回： 无

**代码示例**：

    .. code-block:: python
            
        import paddle.fluid as fluid
        import numpy as np
        with fluid.dygraph.guard():
            x = np.random.uniform(-1, 1, [10, 10]).astype("float32")
            linear = fluid.dygraph.Linear(10, 10)
            input = fluid.dygraph.to_variable(x)
            scheduler = fluid.dygraph.StepDecay(0.5, step_size=3)
            adam = fluid.optimizer.Adam(learning_rate = scheduler, parameter_list = linear.parameters())
            for epoch in range(9):
                for batch_id in range(5):
                    out = linear(input)
                    loss = fluid.layers.reduce_mean(out)
                    adam.minimize(loss)  
                scheduler.epoch()
                print("epoch:{}, current lr is {}" .format(epoch, adam.current_step_lr()))
                # epoch:0, current lr is 0.5
                # epoch:1, current lr is 0.5
                # epoch:2, current lr is 0.5
                # epoch:3, current lr is 0.05
                # epoch:4, current lr is 0.05
                # epoch:5, current lr is 0.05
                # epoch:6, current lr is 0.005
                # epoch:7, current lr is 0.005
                # epoch:8, current lr is 0.005

.. py:method:: epoch(epoch=None)
通过当前的 epoch 调整学习率，调整后的学习率将会在下一次调用 ``optimizer.minimize`` 时生效。

参数：
  - **epoch** (int|float，可选) - 类型：int或float。指定当前的epoch数。默认：无，此时将会自动累计epoch数。

返回：
    无

**代码示例**:

    参照上述示例代码。
