diff --git a/fluid/image_classification/.run_ce.sh b/fluid/image_classification/.run_ce.sh index be1a37615885f0e7f6700b0399e419ac90afaa33..eee6cc08f5eadbfbe48827712de33497ea89d429 100755 --- a/fluid/image_classification/.run_ce.sh +++ b/fluid/image_classification/.run_ce.sh @@ -1,10 +1,11 @@ #!/bin/bash # This file is only used for continuous evaluation. +export FLAGS_cudnn_deterministic=True cudaid=${object_detection_cudaid:=0} export CUDA_VISIBLE_DEVICES=$cudaid -python train.py --batch_size=64 --num_epochs=10 --total_images=6149 --enable_ce=True | python _ce.py +python train.py --batch_size=64 --num_epochs=5 --enable_ce=True | python _ce.py cudaid=${object_detection_cudaid_m:=0, 1, 2, 3} export CUDA_VISIBLE_DEVICES=$cudaid -python train.py --batch_size=64 --num_epochs=10 --total_images=6149 --enable_ce=True | python _ce.py +python train.py --batch_size=128 --num_epochs=5 --enable_ce=True | python _ce.py diff --git a/fluid/image_classification/_ce.py b/fluid/image_classification/_ce.py index 0030bed1759390f2dad0843d10488f91b04f42b7..363bcae789c29fd212dcffe22e72cf7aac7b665a 100644 --- a/fluid/image_classification/_ce.py +++ b/fluid/image_classification/_ce.py @@ -1,5 +1,7 @@ ####this file is only used for continuous evaluation test! - +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import os import sys sys.path.append(os.environ['ceroot']) @@ -14,7 +16,7 @@ train_cost_kpi = CostKpi('train_cost', 0.5, 0, actived=True, desc='train cost') test_acc_top1_kpi = AccKpi('test_acc_top1', 0.05, 0, desc='TOP1 ACC') test_acc_top5_kpi = AccKpi( 'test_acc_top5', 0.05, 0, actived=False, desc='TOP5 ACC') -test_cost_kpi = CostKpi('test_cost', 1.0, 0, actived=True, desc='train cost') +test_cost_kpi = CostKpi('test_cost', 0.05, 0, actived=True, desc='train cost') train_speed_kpi = AccKpi( 'train_speed', 0.5, @@ -27,13 +29,13 @@ train_acc_top1_card4_kpi = AccKpi( train_acc_top5_card4_kpi = AccKpi( 'train_acc_top5_card4', 0.05, 0, actived=False, desc='TOP5 ACC') train_cost_card4_kpi = CostKpi( - 'train_cost_kpi', 0.3, 0, actived=True, desc='train cost') + 'train_cost_kpi', 0.05, 0, actived=True, desc='train cost') test_acc_top1_card4_kpi = AccKpi( 'test_acc_top1_card4', 0.05, 0, desc='TOP1 ACC') test_acc_top5_card4_kpi = AccKpi( 'test_acc_top5_card4', 0.05, 0, actived=False, desc='TOP5 ACC') test_cost_card4_kpi = CostKpi( - 'test_cost_card4', 1.0, 0, actived=True, desc='train cost') + 'test_cost_card4', 0.05, 0, actived=True, desc='train cost') train_speed_card4_kpi = AccKpi( 'train_speed_card4', 0.5, diff --git a/fluid/image_classification/eval.py b/fluid/image_classification/eval.py index e0c96d0f1333e69a5260ae7ae88af8729033cdcf..7d265e525e063488fd758c77b1d90550e6afdf9f 100644 --- a/fluid/image_classification/eval.py +++ b/fluid/image_classification/eval.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import os import numpy as np import time diff --git a/fluid/image_classification/infer.py b/fluid/image_classification/infer.py index a835926da248d926de36d1c46bc3f7df7265b1d0..19d204a1a21fde57f4c9b28e0c61cb9fd02edc3c 100644 --- a/fluid/image_classification/infer.py +++ b/fluid/image_classification/infer.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import os import numpy as np import time @@ -15,7 +18,6 @@ import math parser = argparse.ArgumentParser(description=__doc__) # yapf: disable add_arg = functools.partial(add_arguments, argparser=parser) -add_arg('batch_size', int, 256, "Minibatch size.") add_arg('use_gpu', bool, True, "Whether to use GPU or not.") add_arg('class_dim', int, 1000, "Class number.") add_arg('image_shape', str, "3,224,224", "Input image size") diff --git a/fluid/image_classification/models/alexnet.py b/fluid/image_classification/models/alexnet.py index b090f6bddbd8a73025fecde30c1296e078fdb222..3e0eab2dee1d2f2e8d3cb2e8c12a3504a1e7c0e5 100644 --- a/fluid/image_classification/models/alexnet.py +++ b/fluid/image_classification/models/alexnet.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid import math diff --git a/fluid/image_classification/models/dpn.py b/fluid/image_classification/models/dpn.py index 8f0680aad09025ba61aa352c9bc16766798e89d9..d9144eeb6e7dc781e33aad9b4f54ce0f3b9e903d 100644 --- a/fluid/image_classification/models/dpn.py +++ b/fluid/image_classification/models/dpn.py @@ -1,13 +1,12 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import os import numpy as np import time import sys -import paddle -import paddle.fluid as fluid -import paddle.fluid.layers.control_flow as control_flow -import paddle.fluid.layers.nn as nn -import paddle.fluid.layers.tensor as tensor import math +import paddle.fluid as fluid __all__ = ["DPN", "DPN68", "DPN92", "DPN98", "DPN107", "DPN131"] @@ -67,7 +66,7 @@ class DPN(object): for gc in range(4): bw = bws[gc] inc = inc_sec[gc] - R = (k_r * bw) / rs[gc] + R = (k_r * bw) // rs[gc] if gc == 0: _type1 = 'proj' _type2 = 'normal' @@ -178,8 +177,8 @@ class DPN(object): _type='normal'): kw = 3 kh = 3 - pw = (kw - 1) / 2 - ph = (kh - 1) / 2 + pw = (kw - 1) // 2 + ph = (kh - 1) // 2 # type if _type is 'proj': diff --git a/fluid/image_classification/models/googlenet.py b/fluid/image_classification/models/googlenet.py index 5f8043a2b69a8883f6662185921009e6b977ded9..ebc8566e129296a453bd59109ffaf37f0760660a 100644 --- a/fluid/image_classification/models/googlenet.py +++ b/fluid/image_classification/models/googlenet.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid @@ -36,7 +39,7 @@ class GoogleNet(): num_filters=num_filters, filter_size=filter_size, stride=stride, - padding=(filter_size - 1) / 2, + padding=(filter_size - 1) // 2, groups=groups, act=act, param_attr=param_attr, diff --git a/fluid/image_classification/models/inception_v4.py b/fluid/image_classification/models/inception_v4.py index 51c7266f69571b4f38d5a68b4de7838d72afc2b9..d3a80a20500f365166d50a0cf222613d0427354f 100644 --- a/fluid/image_classification/models/inception_v4.py +++ b/fluid/image_classification/models/inception_v4.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid import math diff --git a/fluid/image_classification/models/learning_rate.py b/fluid/image_classification/models/learning_rate.py index d8c137e6db8f5ecaac7f7b43d6537e16d2ae03c8..a385a931c0cfc68abd9ee61c009226e14b0be8b4 100644 --- a/fluid/image_classification/models/learning_rate.py +++ b/fluid/image_classification/models/learning_rate.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid import paddle.fluid.layers.ops as ops diff --git a/fluid/image_classification/models/mobilenet.py b/fluid/image_classification/models/mobilenet.py index bae564fc31f19b4b9abb9c0e7c3c1488ab7b9219..f3554734768d5bbec96dac2443b48389d235da91 100644 --- a/fluid/image_classification/models/mobilenet.py +++ b/fluid/image_classification/models/mobilenet.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle.fluid as fluid from paddle.fluid.initializer import MSRA from paddle.fluid.param_attr import ParamAttr diff --git a/fluid/image_classification/models/resnet.py b/fluid/image_classification/models/resnet.py index b3a6956222173aba8d7350e30e6c5344a7317682..75c7b750541c60821a624f95a2ab56d2890fcb25 100644 --- a/fluid/image_classification/models/resnet.py +++ b/fluid/image_classification/models/resnet.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid import math @@ -75,7 +78,7 @@ class ResNet(): num_filters=num_filters, filter_size=filter_size, stride=stride, - padding=(filter_size - 1) / 2, + padding=(filter_size - 1) // 2, groups=groups, act=None, bias_attr=False) diff --git a/fluid/image_classification/models/se_resnext.py b/fluid/image_classification/models/se_resnext.py index 272880c7cffd28f9ce09507b5ab931abb219d874..cc03b29a494f124faa3539d4d7ec8eb79434ed64 100644 --- a/fluid/image_classification/models/se_resnext.py +++ b/fluid/image_classification/models/se_resnext.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid import math @@ -11,7 +14,7 @@ train_parameters = { "input_size": [3, 224, 224], "input_mean": [0.485, 0.456, 0.406], "input_std": [0.229, 0.224, 0.225], - "dropout_seed": None, + "enable_ce": False, "learning_strategy": { "name": "piecewise_decay", "batch_size": 256, @@ -102,9 +105,11 @@ class SE_ResNeXt(): pool = fluid.layers.pool2d( input=conv, pool_size=7, pool_type='avg', global_pooling=True) - # do not set seed when traning, it is only used for debug - drop = fluid.layers.dropout( - x=pool, dropout_prob=0.5, seed=self.params["dropout_seed"]) + # enable_ce is used for continuous evaluation to remove the randomness + if self.params["enable_ce"]: + drop = pool + else: + drop = fluid.layers.dropout(x=pool, dropout_prob=0.5) stdv = 1.0 / math.sqrt(drop.shape[1] * 1.0) out = fluid.layers.fc(input=drop, size=class_dim, @@ -156,7 +161,7 @@ class SE_ResNeXt(): num_filters=num_filters, filter_size=filter_size, stride=stride, - padding=(filter_size - 1) / 2, + padding=(filter_size - 1) // 2, groups=groups, act=None, bias_attr=False) @@ -167,7 +172,7 @@ class SE_ResNeXt(): input=input, pool_size=0, pool_type='avg', global_pooling=True) stdv = 1.0 / math.sqrt(pool.shape[1] * 1.0) squeeze = fluid.layers.fc(input=pool, - size=num_channels / reduction_ratio, + size=num_channels // reduction_ratio, act='relu', param_attr=fluid.param_attr.ParamAttr( initializer=fluid.initializer.Uniform( diff --git a/fluid/image_classification/models/vgg.py b/fluid/image_classification/models/vgg.py index 6b6f8bd171902d0ea1d27a00a66dce2722f745c5..1af664fdb554f05ba8a556abbba36cd1c3141a40 100644 --- a/fluid/image_classification/models/vgg.py +++ b/fluid/image_classification/models/vgg.py @@ -1,3 +1,6 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import paddle import paddle.fluid as fluid diff --git a/fluid/image_classification/train.py b/fluid/image_classification/train.py index aed5802c8e75bb2a636b39f1627cd7333e9109cc..041064c5ce5d6e640b83bd91055137139e3baf14 100644 --- a/fluid/image_classification/train.py +++ b/fluid/image_classification/train.py @@ -1,17 +1,20 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function import os import numpy as np import time import sys +import functools +import math import paddle import paddle.fluid as fluid import paddle.dataset.flowers as flowers import models import reader import argparse -import functools from models.learning_rate import cosine_decay from utility import add_arguments, print_arguments -import math parser = argparse.ArgumentParser(description=__doc__) add_arg = functools.partial(add_arguments, argparser=parser) @@ -104,8 +107,11 @@ def train(args): if args.enable_ce: assert model_name == "SE_ResNeXt50_32x4d" + fluid.default_startup_program().random_seed = 1000 + model.params["enable_ce"] = True + class_dim = 102 - if model_name is "GoogleNet": + if model_name == "GoogleNet": out0, out1, out2 = model.net(input=image, class_dim=class_dim) cost0 = fluid.layers.cross_entropy(input=out0, label=label) cost1 = fluid.layers.cross_entropy(input=out1, label=label) @@ -134,8 +140,6 @@ def train(args): params["num_epochs"] = args.num_epochs params["learning_strategy"]["batch_size"] = args.batch_size params["learning_strategy"]["name"] = args.lr_strategy - if args.enable_ce: - params["dropout_seed"] = 10 # initialize optimizer optimizer = optimizer_setting(params) @@ -144,9 +148,6 @@ def train(args): if with_memory_optimization: fluid.memory_optimize(fluid.default_main_program()) - if args.enable_ce: - fluid.default_startup_program().random_seed = 1000 - place = fluid.CUDAPlace(0) if args.use_gpu else fluid.CPUPlace() exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) @@ -172,6 +173,7 @@ def train(args): # but it is time consuming. For faster speed, need another dataset. import random random.seed(0) + np.random.seed(0) train_reader = paddle.batch( flowers.train(use_xmap=False), batch_size=train_batch_size) test_reader = paddle.batch( @@ -256,7 +258,7 @@ def train(args): # This is for continuous evaluation only if args.enable_ce and pass_id == args.num_epochs - 1: if gpu_nums == 1: - # Use the last cost/acc for training + # Use the mean cost/acc for training print("kpis train_cost %s" % train_loss) print("kpis train_acc_top1 %s" % train_acc1) print("kpis train_acc_top5 %s" % train_acc5) @@ -266,21 +268,21 @@ def train(args): print("kpis test_acc_top5 %s" % test_acc5) print("kpis train_speed %s" % train_speed) else: - # Use the last cost/acc for training - print("kpis train_cost_card%s %s" % + # Use the mean cost/acc for training + print("kpis train_cost_card%s %s" % (gpu_nums, train_loss)) - print("kpis train_acc_top1_card%s %s" % + print("kpis train_acc_top1_card%s %s" % (gpu_nums, train_acc1)) - print("kpis train_acc_top5_card%s %s" % + print("kpis train_acc_top5_card%s %s" % (gpu_nums, train_acc5)) # Use the mean cost/acc for testing - print("kpis test_cost_card%s %s" % + print("kpis test_cost_card%s %s" % (gpu_nums, test_loss)) - print("kpis test_acc_top1_card%s %s" % + print("kpis test_acc_top1_card%s %s" % (gpu_nums, test_acc1)) - print("kpis test_acc_top5_card%s %s" % + print("kpis test_acc_top5_card%s %s" % (gpu_nums, test_acc5)) - print("kpis train_speed_card%s %s" % + print("kpis train_speed_card%s %s" % (gpu_nums, train_speed)) diff --git a/fluid/image_classification/utility.py b/fluid/image_classification/utility.py index 506e6007ceb9059caf1163befb6ff594d67b547a..5b10a179ac2231cb26ab42993b7300d5e99f44bc 100644 --- a/fluid/image_classification/utility.py +++ b/fluid/image_classification/utility.py @@ -18,6 +18,7 @@ from __future__ import division from __future__ import print_function import distutils.util import numpy as np +import six from paddle.fluid import core @@ -37,7 +38,7 @@ def print_arguments(args): :type args: argparse.Namespace """ print("----------- Configuration Arguments -----------") - for arg, value in sorted(vars(args).iteritems()): + for arg, value in sorted(six.iteritems(vars(args))): print("%s: %s" % (arg, value)) print("------------------------------------------------")