1919import six
2020from test_imperative_resnet import ResNet , BottleneckBlock , ConvBNLayer , train_parameters , optimizer_setting
2121
22+ if fluid .core .is_compiled_with_cuda ():
23+ fluid .set_flags ({"FLAGS_cudnn_deterministic" : True })
24+
2225
2326class SimpleConv (fluid .dygraph .Layer ):
2427 def __init__ (self ,
@@ -373,8 +376,6 @@ def train_resnet(self,
373376 return dy_out , dy_param_value , dy_grad_value
374377
375378 def test_with_state_dict (self ):
376- if fluid .core .is_compiled_with_cuda ():
377- fluid .set_flags ({"FLAGS_cudnn_deterministic" : True })
378379 with fluid .dygraph .guard ():
379380 out_use_state_dict = self .train_resnet (
380381 enable_amp = True , use_data_loader = True , use_save_load = True )
@@ -390,18 +391,43 @@ class TestResnet2(unittest.TestCase):
390391 Use paddle-2.0 API
391392 """
392393
393- def train_resnet (self , enable_amp = True , use_data_loader = False ):
394+ def train_resnet (self ,
395+ enable_amp = True ,
396+ use_data_loader = False ,
397+ use_param_group = False ):
394398 seed = 90
395399
396400 batch_size = train_parameters ["batch_size" ]
397- batch_num = 1
401+ batch_num = 10
398402
399403 paddle .seed (seed )
400404 paddle .framework .random ._manual_program_seed (seed )
401405
402406 resnet = ResNet (use_cudnn = True )
403- optimizer = optimizer_setting (
404- train_parameters , parameter_list = resnet .parameters ())
407+
408+ if use_param_group :
409+ conv_params = resnet .conv .parameters ()
410+ other_params = []
411+ for p in resnet .parameters ():
412+ contains = False
413+ for q in conv_params :
414+ if p is q :
415+ contains = True
416+ if not contains :
417+ other_params .append (p )
418+ # NOTE(zhiqiu): The Membership test operations(in / not in) calls "is" and "equal",
419+ # see details: https://docs.python.org/3/reference/expressions.html#membership-test-operations.
420+ # So do not use other_params = [p for p in resnet.parameters() if p not in conv_params]
421+ optimizer = paddle .optimizer .Momentum (parameters = [{
422+ 'params' : conv_params ,
423+ 'learning_rate' : 0.01
424+ }, {
425+ 'params' : other_params ,
426+ 'learning_rate' : 0.001
427+ }])
428+ else :
429+ optimizer = paddle .optimizer .SGD (parameters = resnet .parameters ())
430+
405431 np .random .seed (seed )
406432 train_reader = paddle .batch (
407433 paddle .dataset .flowers .train (use_xmap = False ), batch_size = batch_size )
@@ -456,7 +482,7 @@ def train_resnet(self, enable_amp=True, use_data_loader=False):
456482 scaled_loss = scaler .scale (avg_loss )
457483 scaled_loss .backward ()
458484
459- scaler .minimize (optimizer , scaled_loss )
485+ scaler .step (optimizer )
460486
461487 dy_grad_value = {}
462488 for param in resnet .parameters ():
@@ -475,22 +501,27 @@ def train_resnet(self, enable_amp=True, use_data_loader=False):
475501 return dy_out , dy_param_value , dy_grad_value
476502
477503 def test_resnet (self ):
478- if fluid .core .is_compiled_with_cuda ():
479- fluid .set_flags ({"FLAGS_cudnn_deterministic" : True })
480504 with fluid .dygraph .guard ():
481505 out_fp32 = self .train_resnet (enable_amp = False )
482506 out_amp = self .train_resnet (enable_amp = True )
483507 print (out_fp32 [0 ], out_amp [0 ])
484- self .assertTrue (np .allclose (out_fp32 [0 ], out_amp [0 ], atol = 1.e-2 ))
508+ self .assertTrue (np .allclose (out_fp32 [0 ], out_amp [0 ], atol = 1.e-5 ))
485509
486510 def test_with_data_loader (self ):
487- if fluid .core .is_compiled_with_cuda ():
488- fluid .set_flags ({"FLAGS_cudnn_deterministic" : True })
489511 with fluid .dygraph .guard ():
490512 out_fp32 = self .train_resnet (enable_amp = False , use_data_loader = True )
491513 out_amp = self .train_resnet (enable_amp = True , use_data_loader = True )
492514 print (out_fp32 [0 ], out_amp [0 ])
493- self .assertTrue (np .allclose (out_fp32 [0 ], out_amp [0 ], atol = 1.e-2 ))
515+ self .assertTrue (np .allclose (out_fp32 [0 ], out_amp [0 ], atol = 1.e-5 ))
516+
517+ def test_param_group (self ):
518+ with fluid .dygraph .guard ():
519+ out_fp32 = self .train_resnet (
520+ enable_amp = False , use_data_loader = True , use_param_group = True )
521+ out_amp = self .train_resnet (
522+ enable_amp = True , use_data_loader = True , use_param_group = True )
523+ print (out_fp32 [0 ], out_amp [0 ])
524+ self .assertTrue (np .allclose (out_fp32 [0 ], out_amp [0 ], atol = 1.e-5 ))
494525
495526
496527class TestResnet (unittest .TestCase ):
@@ -566,8 +597,6 @@ def train_resnet(self, enable_amp=True):
566597 return dy_out , dy_param_value , dy_grad_value
567598
568599 def test_resnet (self ):
569- if fluid .core .is_compiled_with_cuda ():
570- fluid .set_flags ({"FLAGS_cudnn_deterministic" : True })
571600 out_fp32 = self .train_resnet (enable_amp = False )
572601 out_amp = self .train_resnet (enable_amp = True )
573602 print (out_fp32 [0 ], out_amp [0 ])
0 commit comments