提交 a09ed573 编写于 作者: L LielinJiang 提交者: ruri

fix_infer_bug_release_some_model (#3757)

上级 a6ce9fcf
...@@ -161,6 +161,7 @@ CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch train.py \ ...@@ -161,6 +161,7 @@ CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch train.py \
* **label_smoothing_epsilon**: label_smoothing的epsilon, 默认值:0.1 * **label_smoothing_epsilon**: label_smoothing的epsilon, 默认值:0.1
* **random_seed**: 随机数种子, 默认值: 1000 * **random_seed**: 随机数种子, 默认值: 1000
* **padding_type**: efficientNet中卷积操作的padding方式, 默认值: "SAME". * **padding_type**: efficientNet中卷积操作的padding方式, 默认值: "SAME".
* **use_se**: efficientNet中是否使用Squeeze-and-Excitation模块, 默认值: True.
* **use_ema**: 是否在更新模型参数时使用ExponentialMovingAverage. 默认值: False. * **use_ema**: 是否在更新模型参数时使用ExponentialMovingAverage. 默认值: False.
* **ema_decay**: ExponentialMovingAverage的decay rate. 默认值: 0.9999. * **ema_decay**: ExponentialMovingAverage的decay rate. 默认值: 0.9999.
...@@ -413,9 +414,12 @@ PaddlePaddle/Models ImageClassification 支持自定义数据 ...@@ -413,9 +414,12 @@ PaddlePaddle/Models ImageClassification 支持自定义数据
|[EfficientNetB5](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB5_pretrained.tar)<sup>[1](#trans)</sup> | 83.62% | 96.72% | 88.578 | 32.102 | |[EfficientNetB5](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB5_pretrained.tar)<sup>[1](#trans)</sup> | 83.62% | 96.72% | 88.578 | 32.102 |
|[EfficientNetB6](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB6_pretrained.tar)<sup>[1](#trans)</sup> | 84.00% | 96.88% | 138.670 | 51.059 | |[EfficientNetB6](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB6_pretrained.tar)<sup>[1](#trans)</sup> | 84.00% | 96.88% | 138.670 | 51.059 |
|[EfficientNetB7](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB7_pretrained.tar)<sup>[1](#trans)</sup> | 84.30% | 96.89% | 234.364 | 82.107 | |[EfficientNetB7](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB7_pretrained.tar)<sup>[1](#trans)</sup> | 84.30% | 96.89% | 234.364 | 82.107 |
|[EfficientNetB0_small](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB0_Small_pretrained.tar)<sup>[2](#trans)</sup> | 75.80% | 92.58% | 3.342 | 2.729 |
<a name="trans">[1]</a> 表示该预训练权重是由[官方的代码仓库](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet)转换来的。 <a name="trans">[1]</a> 表示该预训练权重是由[官方的代码仓库](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet)转换来的。
<a name="trans">[2]</a> 表示该预训练权重是在EfficientNetB0的基础上去除se模块,并使用通用的卷积训练的,精度稍稍下降,但是速度大幅提升。
## FAQ ## FAQ
**Q:** 加载预训练模型报错,Enforce failed. Expected x_dims[1] == labels_dims[1], but received x_dims[1]:1000 != labels_dims[1]:6. **Q:** 加载预训练模型报错,Enforce failed. Expected x_dims[1] == labels_dims[1], but received x_dims[1]:1000 != labels_dims[1]:6.
......
...@@ -155,6 +155,7 @@ Switch: ...@@ -155,6 +155,7 @@ Switch:
* **label_smoothing_epsilon**: the label_smoothing_epsilon. Default:0.1. * **label_smoothing_epsilon**: the label_smoothing_epsilon. Default:0.1.
* **random_seed**: random seed for debugging, Default: 1000. * **random_seed**: random seed for debugging, Default: 1000.
* **padding_type**: padding type of convolution for efficientNet, Default: "SAME". * **padding_type**: padding type of convolution for efficientNet, Default: "SAME".
* **use_se**: whether to use Squeeze-and-Excitation module in efficientNet, Default: True.
* **use_ema**: whether to use ExponentialMovingAverage or not. Default: False. * **use_ema**: whether to use ExponentialMovingAverage or not. Default: False.
* **ema_decay**: the value of ExponentialMovingAverage decay rate. Default: 0.9999. * **ema_decay**: the value of ExponentialMovingAverage decay rate. Default: 0.9999.
...@@ -397,9 +398,12 @@ Pretrained models can be downloaded by clicking related model names. ...@@ -397,9 +398,12 @@ Pretrained models can be downloaded by clicking related model names.
|[EfficientNetB5](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB5_pretrained.tar)<sup>[1](#trans)</sup> | 83.62% | 96.72% | 88.578 | 32.102 | |[EfficientNetB5](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB5_pretrained.tar)<sup>[1](#trans)</sup> | 83.62% | 96.72% | 88.578 | 32.102 |
|[EfficientNetB6](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB6_pretrained.tar)<sup>[1](#trans)</sup> | 84.00% | 96.88% | 138.670 | 51.059 | |[EfficientNetB6](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB6_pretrained.tar)<sup>[1](#trans)</sup> | 84.00% | 96.88% | 138.670 | 51.059 |
|[EfficientNetB7](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB7_pretrained.tar)<sup>[1](#trans)</sup> | 84.30% | 96.89% | 234.364 | 82.107 | |[EfficientNetB7](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB7_pretrained.tar)<sup>[1](#trans)</sup> | 84.30% | 96.89% | 234.364 | 82.107 |
|[EfficientNetB0_small](https://paddle-imagenet-models-name.bj.bcebos.com/EfficientNetB0_Small_pretrained.tar)<sup>[2](#trans)</sup> | 75.80% | 92.58% | 3.342 | 2.729 |
<a name="trans">[1]</a> means the pretrained weight is converted form [original repository](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet). <a name="trans">[1]</a> means the pretrained weight is converted form [original repository](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet).
<a name="trans">[2]</a> means the pretrained weight is based on EfficientNetB0, removed Squeeze-and-Excitation module and use general convolution. This model speed is much faster.
## FAQ ## FAQ
**Q:** How to solve this problem when I try to train a 6-classes dataset with indicating pretrained_model parameter ? **Q:** How to solve this problem when I try to train a 6-classes dataset with indicating pretrained_model parameter ?
......
...@@ -48,6 +48,7 @@ parser.add_argument('--image_std', nargs='+', type=float, default=[0.229, 0.224, ...@@ -48,6 +48,7 @@ parser.add_argument('--image_std', nargs='+', type=float, default=[0.229, 0.224,
add_arg('crop_size', int, 224, "The value of crop size") add_arg('crop_size', int, 224, "The value of crop size")
add_arg('interpolation', int, None, "The interpolation mode") add_arg('interpolation', int, None, "The interpolation mode")
add_arg('padding_type', str, "SAME", "Padding type of convolution") add_arg('padding_type', str, "SAME", "Padding type of convolution")
add_arg('use_se', bool, True, "Whether to use Squeeze-and-Excitation module for EfficientNet.")
# yapf: enable # yapf: enable
...@@ -68,8 +69,8 @@ def eval(args): ...@@ -68,8 +69,8 @@ def eval(args):
# model definition # model definition
if args.model.startswith('EfficientNet'): if args.model.startswith('EfficientNet'):
model = models.__dict__[args.model](is_test=True, model = models.__dict__[args.model](is_test=True, padding_type=args.padding_type,
padding_type=args.padding_type) use_se=args.use_se)
else: else:
model = models.__dict__[args.model]() model = models.__dict__[args.model]()
......
...@@ -49,6 +49,8 @@ add_arg('crop_size', int, 224, "The value of crop size" ...@@ -49,6 +49,8 @@ add_arg('crop_size', int, 224, "The value of crop size"
add_arg('topk', int, 1, "topk") add_arg('topk', int, 1, "topk")
add_arg('label_path', str, "./utils/tools/readable_label.txt", "readable label filepath") add_arg('label_path', str, "./utils/tools/readable_label.txt", "readable label filepath")
add_arg('interpolation', int, None, "The interpolation mode") add_arg('interpolation', int, None, "The interpolation mode")
add_arg('padding_type', str, "SAME", "Padding type of convolution")
add_arg('use_se', bool, True, "Whether to use Squeeze-and-Excitation module for EfficientNet.")
# yapf: enable # yapf: enable
...@@ -61,7 +63,13 @@ def infer(args): ...@@ -61,7 +63,13 @@ def infer(args):
), "please load right pretrained model path for infer" ), "please load right pretrained model path for infer"
image = fluid.data( image = fluid.data(
name='image', shape=[None] + image_shape, dtype='float32') name='image', shape=[None] + image_shape, dtype='float32')
model = models.__dict__[args.model]()
if args.model.startswith('EfficientNet'):
model = models.__dict__[args.model](is_test=True, padding_type=args.padding_type,
use_se=args.use_se)
else:
model = models.__dict__[args.model]()
if args.model == "GoogLeNet": if args.model == "GoogLeNet":
out, _, _ = model.net(input=image, class_dim=args.class_dim) out, _, _ = model.net(input=image, class_dim=args.class_dim)
else: else:
......
...@@ -103,7 +103,7 @@ def round_repeats(repeats, global_params): ...@@ -103,7 +103,7 @@ def round_repeats(repeats, global_params):
class EfficientNet(): class EfficientNet():
def __init__(self, name='b0', padding_type='SAME', override_params=None, is_test=False): def __init__(self, name='b0', padding_type='SAME', override_params=None, is_test=False, use_se=True):
valid_names = ['b' + str(i) for i in range(8)] valid_names = ['b' + str(i) for i in range(8)]
assert name in valid_names, 'efficient name should be in b0~b7' assert name in valid_names, 'efficient name should be in b0~b7'
model_name = 'efficientnet-' + name model_name = 'efficientnet-' + name
...@@ -112,6 +112,7 @@ class EfficientNet(): ...@@ -112,6 +112,7 @@ class EfficientNet():
self._bn_eps = self._global_params.batch_norm_epsilon self._bn_eps = self._global_params.batch_norm_epsilon
self.is_test = is_test self.is_test = is_test
self.padding_type = padding_type self.padding_type = padding_type
self.use_se = use_se
def net(self, input, class_dim=1000, is_test=False): def net(self, input, class_dim=1000, is_test=False):
...@@ -243,7 +244,7 @@ class EfficientNet(): ...@@ -243,7 +244,7 @@ class EfficientNet():
def mb_conv_block(self, inputs, block_args, is_test=False, drop_connect_rate=None, name=None): def mb_conv_block(self, inputs, block_args, is_test=False, drop_connect_rate=None, name=None):
# Expansion and Depthwise Convolution # Expansion and Depthwise Convolution
oup = block_args.input_filters * block_args.expand_ratio # number of output channels oup = block_args.input_filters * block_args.expand_ratio # number of output channels
has_se = (block_args.se_ratio is not None) and (0 < block_args.se_ratio <= 1) has_se = self.use_se and (block_args.se_ratio is not None) and (0 < block_args.se_ratio <= 1)
id_skip = block_args.id_skip # skip connection and drop connect id_skip = block_args.id_skip # skip connection and drop connect
conv = inputs conv = inputs
if block_args.expand_ratio != 1: if block_args.expand_ratio != 1:
...@@ -413,41 +414,41 @@ class BlockDecoder(object): ...@@ -413,41 +414,41 @@ class BlockDecoder(object):
return block_strings return block_strings
def EfficientNetB0(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB0(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b0', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b0', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB1(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB1(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b1', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b1', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB2(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB2(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b2', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b2', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB3(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB3(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b3', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b3', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB4(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB4(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b4', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b4', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB5(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB5(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b5', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b5', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB6(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB6(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b6', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b6', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
def EfficientNetB7(is_test=False, padding_type='SAME', override_params=None): def EfficientNetB7(is_test=False, padding_type='SAME', override_params=None, use_se=True):
model = EfficientNet(name='b7', is_test=is_test, padding_type=padding_type, override_params=override_params) model = EfficientNet(name='b7', is_test=is_test, padding_type=padding_type, override_params=override_params, use_se=use_se)
return model return model
\ No newline at end of file
...@@ -265,7 +265,10 @@ class ImageNetReader: ...@@ -265,7 +265,10 @@ class ImageNetReader:
rotate=False, rotate=False,
data_dir=None): data_dir=None):
num_trainers = int(os.environ.get('PADDLE_TRAINERS_NUM', 1)) num_trainers = int(os.environ.get('PADDLE_TRAINERS_NUM', 1))
batch_size = settings.batch_size / paddle.fluid.core.get_cuda_device_count() if mode == 'test':
batch_size = 1
else:
batch_size = settings.batch_size / paddle.fluid.core.get_cuda_device_count()
def reader(): def reader():
def read_file_list(): def read_file_list():
with open(file_list) as flist: with open(file_list) as flist:
......
...@@ -61,9 +61,9 @@ def build_program(is_train, main_prog, startup_prog, args): ...@@ -61,9 +61,9 @@ def build_program(is_train, main_prog, startup_prog, args):
is_test = False if is_train else True is_test = False if is_train else True
override_params = {"drop_connect_rate": args.drop_connect_rate} override_params = {"drop_connect_rate": args.drop_connect_rate}
padding_type = args.padding_type padding_type = args.padding_type
model = models.__dict__[args.model](is_test=is_test, use_se = args.use_se
override_params=override_params, model = models.__dict__[args.model](is_test=is_test, override_params=override_params,
padding_type=padding_type) padding_type=padding_type, use_se=use_se)
else: else:
model = models.__dict__[args.model]() model = models.__dict__[args.model]()
with fluid.program_guard(main_prog, startup_prog): with fluid.program_guard(main_prog, startup_prog):
......
...@@ -140,6 +140,7 @@ def parse_args(): ...@@ -140,6 +140,7 @@ def parse_args():
add_arg('use_ema', bool, False, "Whether to use ExponentialMovingAverage.") add_arg('use_ema', bool, False, "Whether to use ExponentialMovingAverage.")
add_arg('ema_decay', float, 0.9999, "The value of ema decay rate") add_arg('ema_decay', float, 0.9999, "The value of ema decay rate")
add_arg('padding_type', str, "SAME", "Padding type of convolution") add_arg('padding_type', str, "SAME", "Padding type of convolution")
add_arg('use_se', bool, True, "Whether to use Squeeze-and-Excitation module for EfficientNet.")
# yapf: enable # yapf: enable
args = parser.parse_args() args = parser.parse_args()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册