File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -218,6 +218,8 @@ def __init__(
218218 weight_decay : float | WeightDecayRegularizer | None = None ,
219219 grad_clip : GradientClipBase | None = None ,
220220 name : str | None = None ,
221+ * ,
222+ differentiable : bool = False ,
221223 ) -> None :
222224 if parameters is not None :
223225 # paddle.Tensor is also iterable, so here we don't check whether
@@ -331,6 +333,13 @@ def __init__(
331333 self ._fuse_buffer_version = 0
332334 self .merged_model_params = None
333335
336+ grad_decorator = (
337+ imperative_base .enable_grad ()
338+ if differentiable
339+ else imperative_base .no_grad ()
340+ )
341+ self .step = grad_decorator (self .step )
342+
334343 def _create_master_grad_states (self ):
335344 # master gradients states
336345 if in_pir_mode ():
@@ -2040,7 +2049,6 @@ def _declarative_step(self):
20402049 params_grads = [(param , param .grad ) for param in parameters ]
20412050 optimize_ops = self .apply_gradients (params_grads )
20422051
2043- @imperative_base .no_grad ()
20442052 @framework .non_static_only
20452053 def step (
20462054 self , closure : Callable [[], Tensor ] | None = None
Original file line number Diff line number Diff line change @@ -98,6 +98,8 @@ def __init__(
9898 grad_clip : GradientClipBase | None = None ,
9999 multi_precision : bool = False ,
100100 name : str | None = None ,
101+ * ,
102+ differentiable : bool = False ,
101103 ) -> None :
102104 if learning_rate is None :
103105 raise ValueError ("learning_rate is not set" )
@@ -107,6 +109,7 @@ def __init__(
107109 weight_decay = weight_decay ,
108110 grad_clip = grad_clip ,
109111 name = name ,
112+ differentiable = differentiable ,
110113 )
111114 self .type = "sgd"
112115 self ._multi_precision = multi_precision
Original file line number Diff line number Diff line change @@ -182,6 +182,24 @@ def test_weight_decay_int(self):
182182 adam .step ()
183183 adam .zero_grad (False )
184184
185+ def test_differentiable (self ):
186+ paddle .seed (100 )
187+ numpy .random .seed (100 )
188+ paddle .disable_static ()
189+ x = paddle .arange (26 , dtype = "float32" ).reshape ([2 , 13 ])
190+ x .stop_gradient = False
191+ linear = paddle .nn .Linear (13 , 5 )
192+ optimizer = paddle .optimizer .SGD (
193+ learning_rate = 0.01 ,
194+ parameters = linear .parameters (),
195+ differentiable = True ,
196+ )
197+ optimizer .zero_grad ()
198+ output = linear (x )
199+ loss = paddle .mean (output )
200+ loss .backward ()
201+ optimizer .step ()
202+
185203 def test_step_without_closure (self ):
186204 paddle .seed (100 )
187205 numpy .random .seed (100 )
You can’t perform that action at this time.
0 commit comments