9
9
import numpy as np
10
10
from collections import defaultdict
11
11
12
- import paddle .fluid as fluid
13
12
sys .path .append (os .path .dirname ("__file__" ))
14
13
sys .path .append (
15
14
os .path .join (os .path .dirname ("__file__" ), os .path .pardir , os .path .pardir ))
21
20
from paddle .fluid .layer_helper import LayerHelper
22
21
quantization_model_save_dir = './quantization_models/'
23
22
24
- from paddle .fluid .contrib .slim .quantization import AddQuantDequantPass
25
-
26
23
_logger = get_logger (__name__ , level = logging .INFO )
27
24
28
25
parser = argparse .ArgumentParser (description = __doc__ )
74
71
75
72
76
73
def piecewise_decay (args ):
77
- places = fluid .cuda_places () if args .use_gpu else fluid .cpu_places ()
74
+ places = paddle .static .cuda_places (
75
+ ) if args .use_gpu else paddle .static .cpu_places ()
78
76
step = int (
79
77
math .ceil (float (args .total_images ) / (args .batch_size * len (places ))))
80
78
bd = [step * e for e in args .step_epochs ]
81
79
lr = [args .lr * (0.1 ** i ) for i in range (len (bd ) + 1 )]
82
- learning_rate = fluid .layers .piecewise_decay (boundaries = bd , values = lr )
83
- optimizer = fluid .optimizer .Momentum (
80
+ learning_rate = paddle .optimizer .lr .PiecewiseDecay (
81
+ boundaries = bd , values = lr , verbose = False )
82
+ optimizer = paddle .optimizer .Momentum (
84
83
learning_rate = learning_rate ,
85
84
momentum = args .momentum_rate ,
86
- regularization = fluid .regularizer .L2Decay (args .l2_decay ))
85
+ weight_decay = paddle .regularizer .L2Decay (args .l2_decay ))
87
86
return learning_rate , optimizer
88
87
89
88
90
89
def cosine_decay (args ):
91
- places = fluid .cuda_places () if args .use_gpu else fluid .cpu_places ()
90
+ places = paddle .static .cuda_places (
91
+ ) if args .use_gpu else paddle .static .cpu_places ()
92
92
step = int (
93
93
math .ceil (float (args .total_images ) / (args .batch_size * len (places ))))
94
- learning_rate = fluid . layers . cosine_decay (
95
- learning_rate = args .lr , step_each_epoch = step , epochs = args .num_epochs )
96
- optimizer = fluid .optimizer .Momentum (
94
+ learning_rate = paddle . optimizer . lr . CosineAnnealingDecay (
95
+ learning_rate = args .lr , T_max = step * args .num_epochs , verbose = False )
96
+ optimizer = paddle .optimizer .Momentum (
97
97
learning_rate = learning_rate ,
98
98
momentum = args .momentum_rate ,
99
- regularization = fluid .regularizer .L2Decay (args .l2_decay ))
99
+ weight_decay = paddle .regularizer .L2Decay (args .l2_decay ))
100
100
return learning_rate , optimizer
101
101
102
102
@@ -127,41 +127,43 @@ def compress(args):
127
127
image_shape = [int (m ) for m in image_shape .split ("," )]
128
128
assert args .model in model_list , "{} is not in lists: {}" .format (args .model ,
129
129
model_list )
130
- image = fluid .layers .data (name = 'image' , shape = image_shape , dtype = 'float32' )
130
+ image = paddle .static .data (
131
+ name = 'image' , shape = [None ] + image_shape , dtype = 'float32' )
131
132
if args .use_pact :
132
133
image .stop_gradient = False
133
- label = fluid . layers .data (name = 'label' , shape = [1 ], dtype = 'int64' )
134
+ label = paddle . static .data (name = 'label' , shape = [None , 1 ], dtype = 'int64' )
134
135
# model definition
135
136
model = models .__dict__ [args .model ]()
136
137
out = model .net (input = image , class_dim = class_dim )
137
- cost = fluid . layers .cross_entropy (input = out , label = label )
138
- avg_cost = fluid . layers .mean (x = cost )
139
- acc_top1 = fluid . layers .accuracy (input = out , label = label , k = 1 )
140
- acc_top5 = fluid . layers .accuracy (input = out , label = label , k = 5 )
138
+ cost = paddle . nn . functional . loss .cross_entropy (input = out , label = label )
139
+ avg_cost = paddle .mean (x = cost )
140
+ acc_top1 = paddle . metric .accuracy (input = out , label = label , k = 1 )
141
+ acc_top5 = paddle . metric .accuracy (input = out , label = label , k = 5 )
141
142
142
- train_prog = fluid .default_main_program ()
143
- val_program = fluid .default_main_program ().clone (for_test = True )
143
+ train_prog = paddle . static .default_main_program ()
144
+ val_program = paddle . static .default_main_program ().clone (for_test = True )
144
145
145
146
if not args .analysis :
146
147
learning_rate , opt = create_optimizer (args )
147
148
opt .minimize (avg_cost )
148
149
149
- place = fluid .CUDAPlace (0 ) if args .use_gpu else fluid .CPUPlace ()
150
- exe = fluid .Executor (place )
151
- exe .run (fluid .default_startup_program ())
150
+ place = paddle .CUDAPlace (0 ) if args .use_gpu else paddle .CPUPlace ()
151
+ exe = paddle . static .Executor (place )
152
+ exe .run (paddle . static .default_startup_program ())
152
153
153
- train_reader = paddle .fluid . io . batch (
154
+ train_reader = paddle .batch (
154
155
train_reader , batch_size = args .batch_size , drop_last = True )
155
- train_loader = fluid .io .DataLoader .from_generator (
156
+ train_loader = paddle .io .DataLoader .from_generator (
156
157
feed_list = [image , label ],
157
158
capacity = 512 ,
158
159
use_double_buffer = True ,
159
160
iterable = True )
160
- places = fluid .cuda_places () if args .use_gpu else fluid .cpu_places ()
161
+ places = paddle .static .cuda_places (
162
+ ) if args .use_gpu else paddle .static .cpu_places ()
161
163
train_loader .set_sample_list_generator (train_reader , places )
162
164
163
- val_reader = paddle .fluid . io . batch (val_reader , batch_size = args .batch_size )
164
- valid_loader = fluid .io .DataLoader .from_generator (
165
+ val_reader = paddle .batch (val_reader , batch_size = args .batch_size )
166
+ valid_loader = paddle .io .DataLoader .from_generator (
165
167
feed_list = [image , label ],
166
168
capacity = 512 ,
167
169
use_double_buffer = True ,
@@ -246,21 +248,21 @@ def pact(x):
246
248
helper = LayerHelper ("pact" , ** locals ())
247
249
dtype = 'float32'
248
250
init_thres = values [x .name .split ('_tmp_input' )[0 ]]
249
- u_param_attr = fluid .ParamAttr (
251
+ u_param_attr = paddle .ParamAttr (
250
252
name = x .name + '_pact' ,
251
- initializer = fluid . initializer .ConstantInitializer (value = init_thres ),
252
- regularizer = fluid .regularizer .L2Decay (0.0001 ),
253
+ initializer = paddle . nn . initializer .Constant (value = init_thres ),
254
+ regularizer = paddle .regularizer .L2Decay (0.0001 ),
253
255
learning_rate = 1 )
254
256
u_param = helper .create_parameter (
255
257
attr = u_param_attr , shape = [1 ], dtype = dtype )
256
258
257
- part_a = fluid . layers . relu (fluid . layers . elementwise_sub ( x , u_param ) )
258
- part_b = fluid . layers . relu (fluid . layers . elementwise_sub ( - u_param , x ) )
259
+ part_a = paddle . nn . functional . relu (x - u_param )
260
+ part_b = paddle . nn . functional . relu (- u_param - x )
259
261
x = x - part_a + part_b
260
262
return x
261
263
262
264
def get_optimizer ():
263
- return fluid .optimizer .MomentumOptimizer (args .lr , 0.9 )
265
+ return paddle .optimizer .Momentum (args .lr , 0.9 )
264
266
265
267
if args .use_pact :
266
268
act_preprocess_func = pact
@@ -294,11 +296,7 @@ def get_optimizer():
294
296
args .pretrained_model ), "pretrained_model doesn't exist"
295
297
296
298
if args .pretrained_model :
297
-
298
- def if_exist (var ):
299
- return os .path .exists (os .path .join (args .pretrained_model , var .name ))
300
-
301
- fluid .io .load_vars (exe , args .pretrained_model , predicate = if_exist )
299
+ paddle .static .load (train_prog , args .pretrained_model , exe )
302
300
303
301
def test (epoch , program ):
304
302
batch_id = 0
@@ -325,44 +323,42 @@ def test(epoch, program):
325
323
np .mean (np .array (acc_top1_ns )), np .mean (np .array (acc_top5_ns ))))
326
324
return np .mean (np .array (acc_top1_ns ))
327
325
328
- def train (epoch , compiled_train_prog ):
326
+ def train (epoch , compiled_train_prog , lr ):
329
327
330
328
batch_id = 0
331
329
for data in train_loader ():
332
330
start_time = time .time ()
333
- lr_n , loss_n , acc_top1_n , acc_top5_n = exe .run (
331
+ loss_n , acc_top1_n , acc_top5_n = exe .run (
334
332
compiled_train_prog ,
335
333
feed = data ,
336
- fetch_list = [
337
- learning_rate .name , avg_cost .name , acc_top1 .name ,
338
- acc_top5 .name
339
- ])
334
+ fetch_list = [avg_cost .name , acc_top1 .name , acc_top5 .name ])
340
335
341
336
end_time = time .time ()
342
- lr_n = np .mean (lr_n )
343
337
loss_n = np .mean (loss_n )
344
338
acc_top1_n = np .mean (acc_top1_n )
345
339
acc_top5_n = np .mean (acc_top5_n )
346
340
if batch_id % args .log_period == 0 :
347
341
_logger .info (
348
342
"epoch[{}]-batch[{}] lr: {:.6f} - loss: {:.6f}; acc_top1: {:.6f}; acc_top5: {:.6f}; time: {:.3f}" .
349
- format (epoch , batch_id , lr_n , loss_n , acc_top1_n ,
343
+ format (epoch , batch_id ,
344
+ learning_rate .get_lr (), loss_n , acc_top1_n ,
350
345
acc_top5_n , end_time - start_time ))
351
346
352
347
if args .use_pact and batch_id % 1000 == 0 :
353
348
threshold = {}
354
349
for var in val_program .list_vars ():
355
350
if 'pact' in var .name :
356
- array = np .array (fluid . global_scope ().find_var (var . name )
357
- .get_tensor ())
351
+ array = np .array (paddle . static . global_scope ().find_var (
352
+ var . name ) .get_tensor ())
358
353
threshold [var .name ] = array [0 ]
359
354
_logger .info (threshold )
360
355
batch_id += 1
356
+ lr .step ()
361
357
362
- build_strategy = fluid .BuildStrategy ()
358
+ build_strategy = paddle . static .BuildStrategy ()
363
359
build_strategy .enable_inplace = False
364
360
build_strategy .fuse_all_reduce_ops = False
365
- exec_strategy = fluid .ExecutionStrategy ()
361
+ exec_strategy = paddle . static .ExecutionStrategy ()
366
362
compiled_train_prog = compiled_train_prog .with_data_parallel (
367
363
loss_name = avg_cost .name ,
368
364
build_strategy = build_strategy ,
@@ -377,37 +373,38 @@ def train(epoch, compiled_train_prog):
377
373
ckpt_path = args .checkpoint_dir
378
374
assert args .checkpoint_epoch is not None , "checkpoint_epoch must be set"
379
375
start_epoch = args .checkpoint_epoch
380
- fluid . io . load_persistables (
376
+ paddle . static . load_vars (
381
377
exe , dirname = args .checkpoint_dir , main_program = val_program )
382
378
start_step = start_epoch * int (
383
379
math .ceil (float (args .total_images ) / args .batch_size ))
384
- v = fluid .global_scope ().find_var ('@LR_DECAY_COUNTER@' ).get_tensor ()
380
+ v = paddle .static .global_scope ().find_var (
381
+ '@LR_DECAY_COUNTER@' ).get_tensor ()
385
382
v .set (np .array ([start_step ]).astype (np .float32 ), place )
386
383
387
384
best_eval_acc1 = 0
388
385
best_acc1_epoch = 0
389
386
for i in range (start_epoch , args .num_epochs ):
390
- train (i , compiled_train_prog )
387
+ train (i , compiled_train_prog , learning_rate )
391
388
acc1 = test (i , val_program )
392
389
if acc1 > best_eval_acc1 :
393
390
best_eval_acc1 = acc1
394
391
best_acc1_epoch = i
395
392
_logger .info ("Best Validation Acc1: {:.6f}, at epoch {}" .format (
396
393
best_eval_acc1 , best_acc1_epoch ))
397
- fluid . io . save_persistables (
394
+ paddle . static . save (
398
395
exe ,
399
396
dirname = os .path .join (args .output_dir , str (i )),
400
397
main_program = val_program )
401
398
if acc1 > best_acc1 :
402
399
best_acc1 = acc1
403
400
best_epoch = i
404
- fluid . io . save_persistables (
401
+ paddle . static . save (
405
402
exe ,
406
403
dirname = os .path .join (args .output_dir , 'best_model' ),
407
404
main_program = val_program )
408
405
409
406
if os .path .exists (os .path .join (args .output_dir , 'best_model' )):
410
- fluid . io . load_persistables (
407
+ paddle . static . load (
411
408
exe ,
412
409
dirname = os .path .join (args .output_dir , 'best_model' ),
413
410
main_program = val_program )
@@ -430,7 +427,7 @@ def train(epoch, compiled_train_prog):
430
427
if not os .path .isdir (model_path ):
431
428
os .makedirs (model_path )
432
429
433
- fluid . io .save_inference_model (
430
+ paddle . static .save_inference_model (
434
431
dirname = float_path ,
435
432
feeded_var_names = [image .name ],
436
433
target_vars = [out ],
0 commit comments