提交 044f19e7 编写于 作者: L LielinJiang 提交者: ruri

Fix inference bug and release EfficientNetB0_small in image classification (#3667)

* fix_infer_bug_release_some_model
上级 e47730a0
......@@ -164,6 +164,7 @@ CUDA_VISIBLE_DEVICES=0,1,2,3 python -m paddle.distributed.launch train.py \
* **label_smoothing_epsilon**: label_smoothing的epsilon, 默认值:0.1
* **random_seed**: 随机数种子, 默认值: 1000
* **padding_type**: efficientNet中卷积操作的padding方式, 默认值: "SAME".
* **use_se**: efficientNet中是否使用Squeeze-and-Excitation模块, 默认值: True.
* **use_ema**: 是否在更新模型参数时使用ExponentialMovingAverage. 默认值: False.
* **ema_decay**: ExponentialMovingAverage的decay rate. 默认值: 0.9999.
......@@ -416,9 +417,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 |
|[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 |
|[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">[2]</a> 表示该预训练权重是在EfficientNetB0的基础上去除se模块,并使用通用的卷积训练的,精度稍稍下降,但是速度大幅提升。
## FAQ
**Q:** 加载预训练模型报错,Enforce failed. Expected x_dims[1] == labels_dims[1], but received x_dims[1]:1000 != labels_dims[1]:6.
......
......@@ -157,6 +157,7 @@ Switch:
* **label_smoothing_epsilon**: the label_smoothing_epsilon. Default:0.1.
* **random_seed**: random seed for debugging, Default: 1000.
* **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.
* **ema_decay**: the value of ExponentialMovingAverage decay rate. Default: 0.9999.
......@@ -399,9 +400,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 |
|[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 |
|[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">[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
**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,
add_arg('crop_size', int, 224, "The value of crop size")
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
......@@ -67,7 +68,8 @@ def eval(args):
# model definition
if args.model.startswith('EfficientNet'):
model = models.__dict__[args.model](is_test=True, padding_type=args.padding_type)
model = models.__dict__[args.model](is_test=True, padding_type=args.padding_type,
use_se=args.use_se)
else:
model = models.__dict__[args.model]()
......
......@@ -103,7 +103,7 @@ def round_repeats(repeats, global_params):
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)]
assert name in valid_names, 'efficient name should be in b0~b7'
model_name = 'efficientnet-' + name
......@@ -112,6 +112,7 @@ class EfficientNet():
self._bn_eps = self._global_params.batch_norm_epsilon
self.is_test = is_test
self.padding_type = padding_type
self.use_se = use_se
def net(self, input, class_dim=1000, is_test=False):
......@@ -243,7 +244,7 @@ class EfficientNet():
def mb_conv_block(self, inputs, block_args, is_test=False, drop_connect_rate=None, name=None):
# Expansion and Depthwise Convolution
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
conv = inputs
if block_args.expand_ratio != 1:
......@@ -413,41 +414,41 @@ class BlockDecoder(object):
return block_strings
def EfficientNetB0(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b0', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB1(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b1', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB2(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b2', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB3(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b3', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB4(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b4', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB5(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b5', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB6(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b6', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
def EfficientNetB7(is_test=False, padding_type='SAME', override_params=None):
model = EfficientNet(name='b7', is_test=is_test, padding_type=padding_type, override_params=override_params)
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, use_se=use_se)
return model
\ No newline at end of file
......@@ -265,7 +265,10 @@ class ImageNetReader:
rotate=False,
data_dir=None):
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 read_file_list():
with open(file_list) as flist:
......
......@@ -59,7 +59,9 @@ def build_program(is_train, main_prog, startup_prog, args):
is_test = False if is_train else True
override_params = {"drop_connect_rate": args.drop_connect_rate}
padding_type = args.padding_type
model = models.__dict__[args.model](is_test=is_test, override_params=override_params, padding_type=padding_type)
use_se = args.use_se
model = models.__dict__[args.model](is_test=is_test, override_params=override_params,
padding_type=padding_type, use_se=use_se)
else:
model = models.__dict__[args.model]()
with fluid.program_guard(main_prog, startup_prog):
......
......@@ -139,6 +139,7 @@ def parse_args():
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('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
args = parser.parse_args()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册