@ -7,6 +7,7 @@ from paddle.v2.framework.backward import append_backward_ops
class TestOptimizer ( unittest . TestCase ) :
class TestOptimizer ( unittest . TestCase ) :
def test_sgd_optimizer ( self ) :
def test_sgd_optimizer ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -22,12 +23,13 @@ class TestOptimizer(unittest.TestCase):
outputs = { " Out " : mul_out } ,
outputs = { " Out " : mul_out } ,
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
sgd_optimizer = optimizer . SGDOptimizer ( learning_rate = 0.01 )
sgd_optimizer = optimizer . SGDOptimizer ( learning_rate = 0.01 )
opts = sgd_optimizer . minimize ( mul_out )
opts = sgd_optimizer . minimize ( mul_out , init_program )
self . assertEqual ( len ( opts ) , 1 )
self . assertEqual ( len ( opts ) , 1 )
sgd_op = opts [ 0 ]
sgd_op = opts [ 0 ]
self . assertEqual ( sgd_op . type , " sgd " )
self . assertEqual ( sgd_op . type , " sgd " )
def test_sgd_optimizer_with_global_step ( self ) :
def test_sgd_optimizer_with_global_step ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -44,15 +46,22 @@ class TestOptimizer(unittest.TestCase):
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
global_step = block . create_var (
global_step = block . create_var (
dtype = " float32 " , shape = [ 1 ] , lod_level = 0 , name = " step " )
dtype = " float32 " , shape = [ 1 ] , lod_level = 0 , name = " step " )
learning_rate = 0.01
sgd_optimizer = optimizer . SGDOptimizer (
sgd_optimizer = optimizer . SGDOptimizer (
learning_rate = 0.01 , global_step = global_step )
learning_rate = learning_rate , global_step = global_step )
opts = sgd_optimizer . minimize ( mul_out )
opts = sgd_optimizer . minimize ( mul_out , init_program )
self . assertEqual ( len ( opts ) , 2 )
self . assertEqual ( len ( opts ) , 2 )
sgd_op = opts [ 0 ]
sgd_op = opts [ 0 ]
self . assertEqual ( sgd_op . type , " sgd " )
self . assertEqual ( sgd_op . type , " sgd " )
increment_op = opts [ 1 ]
increment_op = opts [ 1 ]
self . assertEqual ( increment_op . type , " increment " )
self . assertEqual ( increment_op . type , " increment " )
# Check init_program
init_ops = init_program . global_block ( ) . ops
self . assertEqual ( len ( init_ops ) , 1 )
self . assertEqual ( init_ops [ 0 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 0 ] . attr ( ' value ' ) , learning_rate )
class TestMomentumOptimizer ( unittest . TestCase ) :
class TestMomentumOptimizer ( unittest . TestCase ) :
class MockMomentum ( optimizer . MomentumOptimizer ) :
class MockMomentum ( optimizer . MomentumOptimizer ) :
@ -63,6 +72,7 @@ class TestMomentumOptimizer(unittest.TestCase):
return self . _velocity_acc_str
return self . _velocity_acc_str
def test_vanilla_momentum_optimizer ( self ) :
def test_vanilla_momentum_optimizer ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -77,12 +87,14 @@ class TestMomentumOptimizer(unittest.TestCase):
" Y " : mul_y } ,
" Y " : mul_y } ,
outputs = { " Out " : mul_out } ,
outputs = { " Out " : mul_out } ,
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
momentum_optimizer = self . MockMomentum ( learning_rate = 0.01 , momentum = 0.2 )
learning_rate = 0.01
momentum_optimizer = self . MockMomentum (
learning_rate = learning_rate , momentum = 0.2 )
params_grads = append_backward_ops ( mul_out )
params_grads = append_backward_ops ( mul_out )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( momentum_optimizer . get_accumulators ( ) ) , 0 )
self . assertEqual ( len ( momentum_optimizer . get_accumulators ( ) ) , 0 )
opts = momentum_optimizer . create_optimization_pass ( params_grads ,
opts = momentum_optimizer . create_optimization_pass (
mul_out )
params_grads , mul_out , init_program )
self . assertEqual ( len ( opts ) , 1 )
self . assertEqual ( len ( opts ) , 1 )
sgd_op = opts [ 0 ]
sgd_op = opts [ 0 ]
self . assertEqual ( sgd_op . type , " momentum " )
self . assertEqual ( sgd_op . type , " momentum " )
@ -96,7 +108,16 @@ class TestMomentumOptimizer(unittest.TestCase):
self . assertEqual ( len ( velocity_acc ) , 1 )
self . assertEqual ( len ( velocity_acc ) , 1 )
self . assertTrue ( mul_x . name in velocity_acc )
self . assertTrue ( mul_x . name in velocity_acc )
# Check init_program
init_ops = init_program . global_block ( ) . ops
self . assertEqual ( len ( init_ops ) , 2 )
self . assertEqual ( init_ops [ 0 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 0 ] . attr ( ' value ' ) , learning_rate )
self . assertEqual ( init_ops [ 1 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 1 ] . attr ( ' value ' ) , 0.0 )
def test_nesterov_momentum_optimizer ( self ) :
def test_nesterov_momentum_optimizer ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -111,13 +132,14 @@ class TestMomentumOptimizer(unittest.TestCase):
" Y " : mul_y } ,
" Y " : mul_y } ,
outputs = { " Out " : mul_out } ,
outputs = { " Out " : mul_out } ,
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
learning_rate = 0.01
momentum_optimizer = self . MockMomentum (
momentum_optimizer = self . MockMomentum (
learning_rate = 0.01 , momentum = 0.2 , use_nesterov = True )
learning_rate = learning_rate , momentum = 0.2 , use_nesterov = True )
params_grads = append_backward_ops ( mul_out )
params_grads = append_backward_ops ( mul_out )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( momentum_optimizer . get_accumulators ( ) ) , 0 )
self . assertEqual ( len ( momentum_optimizer . get_accumulators ( ) ) , 0 )
opts = momentum_optimizer . create_optimization_pass ( params_grads ,
opts = momentum_optimizer . create_optimization_pass (
mul_out )
params_grads , mul_out , init_program )
self . assertEqual ( len ( opts ) , 1 )
self . assertEqual ( len ( opts ) , 1 )
sgd_op = opts [ 0 ]
sgd_op = opts [ 0 ]
self . assertEqual ( sgd_op . type , " momentum " )
self . assertEqual ( sgd_op . type , " momentum " )
@ -131,6 +153,14 @@ class TestMomentumOptimizer(unittest.TestCase):
self . assertEqual ( len ( velocity_acc ) , 1 )
self . assertEqual ( len ( velocity_acc ) , 1 )
self . assertTrue ( mul_x . name in velocity_acc )
self . assertTrue ( mul_x . name in velocity_acc )
# Check init_program
init_ops = init_program . global_block ( ) . ops
self . assertEqual ( len ( init_ops ) , 2 )
self . assertEqual ( init_ops [ 0 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 0 ] . attr ( ' value ' ) , learning_rate )
self . assertEqual ( init_ops [ 1 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 1 ] . attr ( ' value ' ) , 0.0 )
class TestAdagradOptimizer ( unittest . TestCase ) :
class TestAdagradOptimizer ( unittest . TestCase ) :
class MockAdagrad ( optimizer . AdagradOptimizer ) :
class MockAdagrad ( optimizer . AdagradOptimizer ) :
@ -141,6 +171,7 @@ class TestAdagradOptimizer(unittest.TestCase):
return self . _moment_acc_str
return self . _moment_acc_str
def test_adagrad_optimizer ( self ) :
def test_adagrad_optimizer ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -155,11 +186,14 @@ class TestAdagradOptimizer(unittest.TestCase):
" Y " : mul_y } ,
" Y " : mul_y } ,
outputs = { " Out " : mul_out } ,
outputs = { " Out " : mul_out } ,
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
adagrad_optimizer = self . MockAdagrad ( learning_rate = 0.01 , epsilon = 1.0e-6 )
learning_rate = 0.01
adagrad_optimizer = self . MockAdagrad (
learning_rate = learning_rate , epsilon = 1.0e-6 )
params_grads = append_backward_ops ( mul_out )
params_grads = append_backward_ops ( mul_out )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( adagrad_optimizer . get_accumulators ( ) ) , 0 )
self . assertEqual ( len ( adagrad_optimizer . get_accumulators ( ) ) , 0 )
opts = adagrad_optimizer . create_optimization_pass ( params_grads , mul_out )
opts = adagrad_optimizer . create_optimization_pass ( params_grads , mul_out ,
init_program )
self . assertEqual ( len ( opts ) , 1 )
self . assertEqual ( len ( opts ) , 1 )
adagrad_op = opts [ 0 ]
adagrad_op = opts [ 0 ]
self . assertEqual ( adagrad_op . type , " adagrad " )
self . assertEqual ( adagrad_op . type , " adagrad " )
@ -172,6 +206,14 @@ class TestAdagradOptimizer(unittest.TestCase):
self . assertEqual ( len ( moment_acc ) , 1 )
self . assertEqual ( len ( moment_acc ) , 1 )
self . assertTrue ( mul_x . name in moment_acc )
self . assertTrue ( mul_x . name in moment_acc )
# Check init_program
init_ops = init_program . global_block ( ) . ops
self . assertEqual ( len ( init_ops ) , 2 )
self . assertEqual ( init_ops [ 0 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 0 ] . attr ( ' value ' ) , learning_rate )
self . assertEqual ( init_ops [ 1 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 1 ] . attr ( ' value ' ) , 0.0 )
class TestAdamOptimizer ( unittest . TestCase ) :
class TestAdamOptimizer ( unittest . TestCase ) :
class MockAdam ( optimizer . AdamOptimizer ) :
class MockAdam ( optimizer . AdamOptimizer ) :
@ -185,6 +227,7 @@ class TestAdamOptimizer(unittest.TestCase):
return self . _moment2_acc_str
return self . _moment2_acc_str
def test_adam_optimizer ( self ) :
def test_adam_optimizer ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -199,12 +242,14 @@ class TestAdamOptimizer(unittest.TestCase):
" Y " : mul_y } ,
" Y " : mul_y } ,
outputs = { " Out " : mul_out } ,
outputs = { " Out " : mul_out } ,
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
learning_rate = 0.01
adam_optimizer = self . MockAdam (
adam_optimizer = self . MockAdam (
learning_rate = 0.01 , beta1 = 0.9 , beta2 = 0.999 )
learning_rate = learning_rate , beta1 = 0.9 , beta2 = 0.999 )
params_grads = append_backward_ops ( mul_out )
params_grads = append_backward_ops ( mul_out )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( adam_optimizer . get_accumulators ( ) ) , 0 )
self . assertEqual ( len ( adam_optimizer . get_accumulators ( ) ) , 0 )
opts = adam_optimizer . create_optimization_pass ( params_grads , mul_out )
opts = adam_optimizer . create_optimization_pass ( params_grads , mul_out ,
init_program )
self . assertEqual ( len ( opts ) , 3 )
self . assertEqual ( len ( opts ) , 3 )
adam_op = opts [ 0 ]
adam_op = opts [ 0 ]
self . assertEqual ( adam_op . type , " adam " )
self . assertEqual ( adam_op . type , " adam " )
@ -221,6 +266,12 @@ class TestAdamOptimizer(unittest.TestCase):
self . assertTrue ( mul_x . name in moment1_acc )
self . assertTrue ( mul_x . name in moment1_acc )
self . assertTrue ( mul_x . name in moment2_acc )
self . assertTrue ( mul_x . name in moment2_acc )
# Check init_program
init_ops = init_program . global_block ( ) . ops
self . assertEqual ( len ( init_ops ) , 5 )
self . assertEqual ( init_ops [ 0 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 0 ] . attr ( ' value ' ) , learning_rate )
class TestAdamaxOptimizer ( unittest . TestCase ) :
class TestAdamaxOptimizer ( unittest . TestCase ) :
class MockAdamax ( optimizer . AdamaxOptimizer ) :
class MockAdamax ( optimizer . AdamaxOptimizer ) :
@ -234,6 +285,7 @@ class TestAdamaxOptimizer(unittest.TestCase):
return self . _inf_norm_acc_str
return self . _inf_norm_acc_str
def test_adamax_optimizer ( self ) :
def test_adamax_optimizer ( self ) :
init_program = framework . Program ( )
program = framework . Program ( )
program = framework . Program ( )
block = program . global_block ( )
block = program . global_block ( )
mul_x = block . create_parameter (
mul_x = block . create_parameter (
@ -248,12 +300,14 @@ class TestAdamaxOptimizer(unittest.TestCase):
" Y " : mul_y } ,
" Y " : mul_y } ,
outputs = { " Out " : mul_out } ,
outputs = { " Out " : mul_out } ,
attrs = { " x_num_col_dims " : 1 } )
attrs = { " x_num_col_dims " : 1 } )
learning_rate = 0.01
adamax_optimizer = self . MockAdamax (
adamax_optimizer = self . MockAdamax (
learning_rate = 0.01 , beta1 = 0.9 , beta2 = 0.999 )
learning_rate = learning_rate , beta1 = 0.9 , beta2 = 0.999 )
params_grads = append_backward_ops ( mul_out )
params_grads = append_backward_ops ( mul_out )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( params_grads ) , 1 )
self . assertEqual ( len ( adamax_optimizer . get_accumulators ( ) ) , 0 )
self . assertEqual ( len ( adamax_optimizer . get_accumulators ( ) ) , 0 )
opts = adamax_optimizer . create_optimization_pass ( params_grads , mul_out )
opts = adamax_optimizer . create_optimization_pass ( params_grads , mul_out ,
init_program )
self . assertEqual ( len ( opts ) , 2 )
self . assertEqual ( len ( opts ) , 2 )
adam_op = opts [ 0 ]
adam_op = opts [ 0 ]
self . assertEqual ( adam_op . type , " adamax " )
self . assertEqual ( adam_op . type , " adamax " )
@ -270,6 +324,12 @@ class TestAdamaxOptimizer(unittest.TestCase):
self . assertTrue ( mul_x . name in moment_acc )
self . assertTrue ( mul_x . name in moment_acc )
self . assertTrue ( mul_x . name in inf_norm_acc )
self . assertTrue ( mul_x . name in inf_norm_acc )
# Check init_program
init_ops = init_program . global_block ( ) . ops
self . assertEqual ( len ( init_ops ) , 4 )
self . assertEqual ( init_ops [ 0 ] . type , " fill_constant " )
self . assertAlmostEqual ( init_ops [ 0 ] . attr ( ' value ' ) , learning_rate )
if __name__ == ' __main__ ' :
if __name__ == ' __main__ ' :
unittest . main ( )
unittest . main ( )