Skip to content

Commit e4ce479

Browse files
author
chengduo
authored
Merge pull request #8874 from jacquesqiao/optimize-optimizer
a little optimize of optimizer
2 parents 685f037 + 73db6ee commit e4ce479

File tree

2 files changed

+67
-28
lines changed

2 files changed

+67
-28
lines changed

python/paddle/fluid/optimizer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ def _create_param_lr(self, param_and_grad):
9292
# create learning rate variable for every parameter
9393
param = param_and_grad[0]
9494
param_lr = param.optimize_attr['learning_rate']
95-
return self.global_learning_rate() * param_lr
95+
if param_lr == 1.0:
96+
return self.global_learning_rate()
97+
else:
98+
return self.global_learning_rate() * param_lr
9699

97100
def _create_accumulators(self, block, parameters):
98101
"""Create all accumulators needed by the parameters

python/paddle/fluid/tests/unittests/test_optimizer.py

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,43 @@
2121

2222
class TestOptimizer(unittest.TestCase):
2323
def test_sgd_optimizer(self):
24-
init_program = framework.Program()
25-
program = framework.Program()
26-
block = program.global_block()
27-
mul_x = block.create_parameter(
28-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
29-
mul_y = block.create_var(
30-
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
31-
mul_out = block.create_var(
32-
dtype="float32", shape=[5, 8], lod_level=0, name="mul.out")
33-
mean_out = block.create_var(
34-
dtype="float32", shape=[1], lod_level=0, name="mean.out")
35-
block.append_op(
36-
type="mul",
37-
inputs={"X": mul_x,
38-
"Y": mul_y},
39-
outputs={"Out": mul_out},
40-
attrs={"x_num_col_dims": 1})
41-
block.append_op(
42-
type="mean", inputs={"X": mul_out}, outputs={"Out": mean_out})
43-
sgd_optimizer = optimizer.SGDOptimizer(learning_rate=0.01)
44-
opts, _ = sgd_optimizer.minimize(mean_out, init_program)
24+
def check_sgd_optimizer(optimizer_attr):
25+
init_program = framework.Program()
26+
program = framework.Program()
27+
block = program.global_block()
28+
mul_x = block.create_parameter(
29+
dtype="float32",
30+
shape=[5, 10],
31+
lod_level=0,
32+
name="mul.x",
33+
optimize_attr=optimizer_attr)
34+
mul_y = block.create_var(
35+
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
36+
mul_out = block.create_var(
37+
dtype="float32", shape=[5, 8], lod_level=0, name="mul.out")
38+
mean_out = block.create_var(
39+
dtype="float32", shape=[1], lod_level=0, name="mean.out")
40+
block.append_op(
41+
type="mul",
42+
inputs={"X": mul_x,
43+
"Y": mul_y},
44+
outputs={"Out": mul_out},
45+
attrs={"x_num_col_dims": 1})
46+
block.append_op(
47+
type="mean", inputs={"X": mul_out}, outputs={"Out": mean_out})
48+
sgd_optimizer = optimizer.SGDOptimizer(learning_rate=0.01)
49+
opts, _ = sgd_optimizer.minimize(mean_out, init_program)
50+
return opts
51+
52+
opts = check_sgd_optimizer({'learning_rate': 1.1})
4553
self.assertEqual(len(opts), 3)
4654
self.assertEqual([op.type for op in opts],
4755
["fill_constant", "elementwise_mul", "sgd"])
4856

57+
opts = check_sgd_optimizer({'learning_rate': 1.0})
58+
self.assertEqual(len(opts), 1)
59+
self.assertEqual([op.type for op in opts], ["sgd"])
60+
4961

5062
class TestMomentumOptimizer(unittest.TestCase):
5163
class MockMomentum(optimizer.MomentumOptimizer):
@@ -60,7 +72,11 @@ def test_vanilla_momentum_optimizer(self):
6072
program = framework.Program()
6173
block = program.global_block()
6274
mul_x = block.create_parameter(
63-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
75+
dtype="float32",
76+
shape=[5, 10],
77+
lod_level=0,
78+
name="mul.x",
79+
optimize_attr={'learning_rate': 1.1})
6480
mul_y = block.create_var(
6581
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
6682
mul_out = block.create_var(
@@ -110,7 +126,11 @@ def test_nesterov_momentum_optimizer(self):
110126
program = framework.Program()
111127
block = program.global_block()
112128
mul_x = block.create_parameter(
113-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
129+
dtype="float32",
130+
shape=[5, 10],
131+
lod_level=0,
132+
name="mul.x",
133+
optimize_attr={'learning_rate': 1.1})
114134
mul_y = block.create_var(
115135
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
116136
mul_out = block.create_var(
@@ -169,7 +189,11 @@ def test_adagrad_optimizer(self):
169189
program = framework.Program()
170190
block = program.global_block()
171191
mul_x = block.create_parameter(
172-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
192+
dtype="float32",
193+
shape=[5, 10],
194+
lod_level=0,
195+
name="mul.x",
196+
optimize_attr={'learning_rate': 1.1})
173197
mul_y = block.create_var(
174198
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
175199
mul_out = block.create_var(
@@ -229,7 +253,11 @@ def test_adam_optimizer(self):
229253
program = framework.Program()
230254
block = program.global_block()
231255
mul_x = block.create_parameter(
232-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
256+
dtype="float32",
257+
shape=[5, 10],
258+
lod_level=0,
259+
name="mul.x",
260+
optimize_attr={'learning_rate': 1.1})
233261
mul_y = block.create_var(
234262
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
235263
mul_out = block.create_var(
@@ -292,7 +320,11 @@ def test_adamax_optimizer(self):
292320
program = framework.Program()
293321
block = program.global_block()
294322
mul_x = block.create_parameter(
295-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
323+
dtype="float32",
324+
shape=[5, 10],
325+
lod_level=0,
326+
name="mul.x",
327+
optimize_attr={'learning_rate': 1.1})
296328
mul_y = block.create_var(
297329
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
298330
mul_out = block.create_var(
@@ -352,7 +384,11 @@ def test_decayed_adagrad_optimizer(self):
352384
program = framework.Program()
353385
block = program.global_block()
354386
mul_x = block.create_parameter(
355-
dtype="float32", shape=[5, 10], lod_level=0, name="mul.x")
387+
dtype="float32",
388+
shape=[5, 10],
389+
lod_level=0,
390+
name="mul.x",
391+
optimize_attr={'learning_rate': 1.1})
356392
mul_y = block.create_var(
357393
dtype="float32", shape=[10, 8], lod_level=0, name="mul.y")
358394
mul_out = block.create_var(

0 commit comments

Comments
 (0)