Skip to content

Commit 0b32e61

Browse files
committed
add support for sgd and add test
1 parent 9deb3bb commit 0b32e61

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

python/paddle/optimizer/sgd.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class SGD(Optimizer):
6767
to set this property. For more information, please refer to
6868
:ref:`api_guide_Name` .
6969
70+
Keyword Args:
71+
maximize (bool, optional): Maximize the objective with respect to the params, instead of minimizing. The default value is False.
72+
7073
Examples:
7174
.. code-block:: pycon
7275
@@ -98,6 +101,8 @@ def __init__(
98101
grad_clip: GradientClipBase | None = None,
99102
multi_precision: bool = False,
100103
name: str | None = None,
104+
*,
105+
maximize: bool = False,
101106
) -> None:
102107
if learning_rate is None:
103108
raise ValueError("learning_rate is not set")
@@ -107,6 +112,7 @@ def __init__(
107112
weight_decay=weight_decay,
108113
grad_clip=grad_clip,
109114
name=name,
115+
maximize=maximize,
110116
)
111117
self.type = "sgd"
112118
self._multi_precision = multi_precision

test/legacy_test/test_optimizer.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import tempfile
1616
import unittest
1717

18-
import numpy
1918
import numpy as np
2019
from op_test import is_custom_device
2120

@@ -81,7 +80,7 @@ def tearDown(self):
8180

8281
def check_with_opt_state_dict(self, use_save_load=True):
8382
paddle.seed(100)
84-
numpy.random.seed(100)
83+
np.random.seed(100)
8584

8685
class SimpleNet(paddle.nn.Layer):
8786
def __init__(self, input_size, output_size):
@@ -108,8 +107,8 @@ def __init__(self, num_samples):
108107
self.num_samples = num_samples
109108

110109
def __getitem__(self, idx):
111-
data = numpy.random.random([input_size]).astype('float16')
112-
label = numpy.random.random([output_size]).astype('float16')
110+
data = np.random.random([input_size]).astype('float16')
111+
label = np.random.random([output_size]).astype('float16')
113112
return data, label
114113

115114
def __len__(self):
@@ -184,7 +183,7 @@ def test_weight_decay_int(self):
184183

185184
def test_step_without_closure(self):
186185
paddle.seed(100)
187-
numpy.random.seed(100)
186+
np.random.seed(100)
188187
paddle.disable_static()
189188
x = paddle.arange(26, dtype="float32").reshape([2, 13])
190189
linear = paddle.nn.Linear(13, 5)
@@ -211,7 +210,7 @@ def test_step_without_closure(self):
211210

212211
def test_step_with_closure(self):
213212
paddle.seed(100)
214-
numpy.random.seed(100)
213+
np.random.seed(100)
215214
paddle.disable_static()
216215
x = paddle.arange(26, dtype="float32").reshape([2, 13])
217216
linear = paddle.nn.Linear(13, 5)
@@ -240,6 +239,25 @@ def closure():
240239

241240
loss = optimizer.step(closure)
242241

242+
def test_maximize_dygraph(self):
243+
paddle.seed(100)
244+
np.random.seed(100)
245+
paddle.disable_static()
246+
x = paddle.tensor([0.0, 0.0], dtype="float32")
247+
x.stop_gradient = False
248+
optimizer = paddle.optimizer.SGD(
249+
learning_rate=0.5,
250+
parameters=[x],
251+
maximize=True,
252+
)
253+
for epoch in range(5):
254+
optimizer.clear_grad()
255+
y = -((x[0] - 1) ** 2) - (x[1] - 4) ** 2
256+
loss = paddle.sum(y)
257+
loss.backward()
258+
optimizer.step()
259+
np.testing.assert_allclose(x.numpy(), [1.0, 4.0], atol=1e-5)
260+
243261

244262
if __name__ == '__main__':
245263
paddle.enable_static()

0 commit comments

Comments
 (0)