diff --git a/python/paddle/fluid/dygraph/layers.py b/python/paddle/fluid/dygraph/layers.py index 65920297531629b0f589d44fea51d61e61446cbc..20bfa2aea38d51df08ed1b0960eeffc23c2a194a 100644 --- a/python/paddle/fluid/dygraph/layers.py +++ b/python/paddle/fluid/dygraph/layers.py @@ -173,6 +173,30 @@ class Layer(core.Layer): return ret def clear_gradients(self): + """ + Clear the gradients of all parameters for this layer. + + Returns: + None + + Examples: + .. code-block:: python + + import paddle.fluid as fluid + import numpy as np + + with fluid.dygraph.guard(): + value = np.arange(26).reshape(2, 13).astype("float32") + a = fluid.dygraph.to_variable(value) + linear = fluid.Linear(13, 5, dtype="float32") + adam = fluid.optimizer.Adam(learning_rate=0.01, + parameter_list=linear.parameters()) + out = linear(a) + out.backward() + adam.minimize(out) + linear.clear_gradients() + + """ for p in self.parameters(): if p.trainable: p.clear_gradient() diff --git a/python/paddle/fluid/optimizer.py b/python/paddle/fluid/optimizer.py index caa665759a27ed85f126faf805edd6d8718e63a9..376985d257b649722f2a3976d91f8d50a48c0206 100644 --- a/python/paddle/fluid/optimizer.py +++ b/python/paddle/fluid/optimizer.py @@ -662,6 +662,37 @@ class Optimizer(object): return no_grad_set + @framework.dygraph_only + def clear_gradients(self): + """ + Clear the gradients of all optimized parameters for model. + + Returns: + None + + Examples: + .. code-block:: python + + import paddle.fluid as fluid + import numpy as np + + with fluid.dygraph.guard(): + value = np.arange(26).reshape(2, 13).astype("float32") + a = fluid.dygraph.to_variable(value) + linear = fluid.Linear(13, 5, dtype="float32") + # This can be any optimizer supported by dygraph. + adam = fluid.optimizer.Adam(learning_rate = 0.01, + parameter_list = linear.parameters()) + out = linear(a) + out.backward() + adam.minimize(out) + adam.clear_gradients() + + """ + for p in self._parameter_list: + if p.trainable: + p.clear_gradient() + @imperative_base.no_grad def minimize(self, loss, diff --git a/python/paddle/fluid/tests/unittests/test_imperative_lod_tensor_to_selected_rows.py b/python/paddle/fluid/tests/unittests/test_imperative_lod_tensor_to_selected_rows.py index c7a9e202e1fc3d3435f531f583c598478f43cad2..477b3be76f35ff98c36db0a01d00a518c90905bc 100644 --- a/python/paddle/fluid/tests/unittests/test_imperative_lod_tensor_to_selected_rows.py +++ b/python/paddle/fluid/tests/unittests/test_imperative_lod_tensor_to_selected_rows.py @@ -131,7 +131,7 @@ class TestDygraphSimpleNet(unittest.TestCase): dy_param_init[param.name] = param.numpy() dy_loss.backward(backward_strategy) sgd.minimize(dy_loss) - simple_net.clear_gradients() + sgd.clear_gradients() if i == batch_num - 1: for param in simple_net.parameters(): dy_param_updated[param.name] = param.numpy() diff --git a/python/paddle/fluid/tests/unittests/test_imperative_selected_rows_to_lod_tensor.py b/python/paddle/fluid/tests/unittests/test_imperative_selected_rows_to_lod_tensor.py index 3db655b788e85a7935d3a67a8bbdab80dff0e1ff..a42a62019ba54a771d26ad853e39fcf8ca991180 100644 --- a/python/paddle/fluid/tests/unittests/test_imperative_selected_rows_to_lod_tensor.py +++ b/python/paddle/fluid/tests/unittests/test_imperative_selected_rows_to_lod_tensor.py @@ -137,7 +137,7 @@ class TestDygraphSimpleNet(unittest.TestCase): dy_param_init[param.name] = param.numpy() dy_loss.backward(backward_strategy) sgd.minimize(dy_loss) - simple_net.clear_gradients() + sgd.clear_gradients() if i == batch_num - 1: for param in simple_net.parameters(): dy_param_updated[param.name] = param.numpy()