From 7ad89bc18e5ba12c2c38962e150de683dd8f7f2f Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Sun, 3 May 2020 14:28:45 +0000 Subject: [PATCH 1/8] addcs pnet --- ppcls/modeling/architectures/__init__.py | 20 +- ppcls/modeling/architectures/csp_resnet.py | 233 +++++++++++++++++++++ 2 files changed, 244 insertions(+), 9 deletions(-) create mode 100644 ppcls/modeling/architectures/csp_resnet.py diff --git a/ppcls/modeling/architectures/__init__.py b/ppcls/modeling/architectures/__init__.py index b6b69a370b..308c449c16 100644 --- a/ppcls/modeling/architectures/__init__.py +++ b/ppcls/modeling/architectures/__init__.py @@ -1,16 +1,16 @@ -#copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. # -#Licensed under the Apache License, Version 2.0 (the "License"); -#you may not use this file except in compliance with the License. -#You may obtain a copy of the License at +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # -#Unless required by applicable law or agreed to in writing, software -#distributed under the License is distributed on an "AS IS" BASIS, -#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -#See the License for the specific language governing permissions and -#limitations under the License. +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. from .alexnet import AlexNet from .mobilenet_v1 import MobileNetV1_x0_25, MobileNetV1_x0_5, MobileNetV1_x1_0, MobileNetV1_x0_75, MobileNetV1 @@ -45,3 +45,5 @@ # distillation model from .distillation_models import ResNet50_vd_distill_MobileNetV3_large_x1_0, ResNeXt101_32x16d_wsl_distill_ResNet50_vd + +from .csp_resnet import CSPNetNet50 diff --git a/ppcls/modeling/architectures/csp_resnet.py b/ppcls/modeling/architectures/csp_resnet.py new file mode 100644 index 0000000000..f343892e0d --- /dev/null +++ b/ppcls/modeling/architectures/csp_resnet.py @@ -0,0 +1,233 @@ +# copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import math + +import paddle +import paddle.fluid as fluid +from paddle.fluid.param_attr import ParamAttr + +__all__ = ["CSPNetNet50", ] + + +class CSPNetNet(): + def __init__(self, layers=50): + self.layers = layers + + def net(self, input, class_dim=1000, data_format="NCHW"): + layers = self.layers + supported_layers = [18, 34, 50, 101, 152] + assert layers in supported_layers, \ + "supported layers are {} but input layer is {}".format( + supported_layers, layers) + + if layers == 18: + depth = [2, 2, 2, 2] + elif layers == 34 or layers == 50: + depth = [3, 3, 5, 3] + elif layers == 101: + depth = [3, 4, 23, 3] + elif layers == 152: + depth = [3, 8, 36, 3] + num_filters = [64, 128, 256, 512] + + conv = self.conv_bn_layer( + input=input, + num_filters=64, + filter_size=7, + stride=2, + act='relu', + name="conv1", + data_format=data_format) + conv = fluid.layers.pool2d( + input=conv, + pool_size=3, + pool_stride=2, + pool_padding=1, + pool_type='max', + data_format=data_format) + + if layers >= 50: + for block in range(len(depth)): + conv_name = "res" + str(block + 2) + chr(97) + if block != 0: + conv = self.conv_bn_layer( + input=conv, + num_filters=num_filters[block] * 2, + filter_size=3, + stride=2, + act="leaky_relu", + name=conv_name + "_downsample", + data_format=data_format) + + # layer warp + # left = conv + # right = conv + left, right = fluid.layers.split( + conv, + num_or_sections=[conv.shape[1] // 2, conv.shape[1] // 2], + dim=1) + right = self.conv_bn_layer( + input=right, + num_filters=num_filters[block] * 4, + filter_size=1, + act="leaky_relu", + name=conv_name + "_right_first_route", + data_format=data_format) + + for i in range(depth[block]): + conv_name = "res" + str(block + 2) + chr(97 + i) + + right = self.bottleneck_block( + input=right, + num_filters=num_filters[block], + stride=1, + name=conv_name, + data_format=data_format) + + # route + left = self.conv_bn_layer( + input=left, + num_filters=num_filters[block] * 2, + filter_size=1, + act="leaky_relu", + name=conv_name + "_left_route", + data_format=data_format) + right = self.conv_bn_layer( + input=right, + num_filters=num_filters[block] * 2, + filter_size=1, + act="leaky_relu", + name=conv_name + "_right_route", + data_format=data_format) + conv = fluid.layers.concat([left, right], axis=1) + + conv = self.conv_bn_layer( + input=conv, + num_filters=num_filters[block] * 2, + filter_size=1, + stride=1, + act="leaky_relu", + name=conv_name + "_merged_transition", + data_format=data_format) + else: + assert False, "not implemented now!!!" + + pool = fluid.layers.pool2d( + input=conv, + pool_type='avg', + global_pooling=True, + data_format=data_format) + stdv = 1.0 / math.sqrt(pool.shape[1] * 1.0) + out = fluid.layers.fc( + input=pool, + size=class_dim, + param_attr=fluid.param_attr.ParamAttr( + name="fc_0.w_0", + initializer=fluid.initializer.Uniform(-stdv, stdv)), + bias_attr=ParamAttr(name="fc_0.b_0")) + return out + + def conv_bn_layer(self, + input, + num_filters, + filter_size, + stride=1, + groups=1, + act=None, + name=None, + data_format='NCHW'): + conv = fluid.layers.conv2d( + input=input, + num_filters=num_filters, + filter_size=filter_size, + stride=stride, + padding=(filter_size - 1) // 2, + groups=groups, + act=act, + param_attr=ParamAttr(name=name + "_weights"), + bias_attr=False, + name=name + '.conv2d.output.1', + data_format=data_format) + + if name == "conv1": + bn_name = "bn_" + name + else: + bn_name = "bn" + name[3:] + bn = fluid.layers.batch_norm( + input=conv, + act=None, + name=bn_name + '.output.1', + param_attr=ParamAttr(name=bn_name + '_scale'), + bias_attr=ParamAttr(bn_name + '_offset'), + moving_mean_name=bn_name + '_mean', + moving_variance_name=bn_name + '_variance', + data_layout=data_format) + return bn + + def shortcut(self, input, ch_out, stride, is_first, name, data_format): + if data_format == 'NCHW': + ch_in = input.shape[1] + else: + ch_in = input.shape[-1] + if ch_in != ch_out or stride != 1 or is_first == True: + return self.conv_bn_layer( + input, ch_out, 1, stride, name=name, data_format=data_format) + else: + return input + + def bottleneck_block(self, input, num_filters, stride, name, data_format): + conv0 = self.conv_bn_layer( + input=input, + num_filters=num_filters, + filter_size=1, + act="leaky_relu", + name=name + "_branch2a", + data_format=data_format) + conv1 = self.conv_bn_layer( + input=conv0, + num_filters=num_filters, + filter_size=3, + stride=stride, + act="leaky_relu", + name=name + "_branch2b", + data_format=data_format) + conv2 = self.conv_bn_layer( + input=conv1, + num_filters=num_filters * 2, + filter_size=1, + act=None, + name=name + "_branch2c", + data_format=data_format) + + short = self.shortcut( + input, + num_filters * 2, + stride, + is_first=False, + name=name + "_branch1", + data_format=data_format) + + ret = short + conv2 + ret = fluid.layers.leaky_relu(ret, alpha=0.1) + return ret + + +def CSPNetNet50(): + model = CSPNetNet(layers=50) + return model From 9123f5da4b3b2276db5b726d292a88cdf1e8d139 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Tue, 12 May 2020 06:05:52 +0000 Subject: [PATCH 2/8] fix cspnet --- ppcls/modeling/architectures/__init__.py | 2 +- ppcls/modeling/architectures/csp_resnet.py | 42 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/ppcls/modeling/architectures/__init__.py b/ppcls/modeling/architectures/__init__.py index 308c449c16..fa18f958b9 100644 --- a/ppcls/modeling/architectures/__init__.py +++ b/ppcls/modeling/architectures/__init__.py @@ -46,4 +46,4 @@ # distillation model from .distillation_models import ResNet50_vd_distill_MobileNetV3_large_x1_0, ResNeXt101_32x16d_wsl_distill_ResNet50_vd -from .csp_resnet import CSPNetNet50 +from .csp_resnet import CSPResNet50 diff --git a/ppcls/modeling/architectures/csp_resnet.py b/ppcls/modeling/architectures/csp_resnet.py index f343892e0d..e7291861b3 100644 --- a/ppcls/modeling/architectures/csp_resnet.py +++ b/ppcls/modeling/architectures/csp_resnet.py @@ -22,10 +22,10 @@ import paddle.fluid as fluid from paddle.fluid.param_attr import ParamAttr -__all__ = ["CSPNetNet50", ] +__all__ = ["CSPResNet50", ] -class CSPNetNet(): +class CSPResNet(): def __init__(self, layers=50): self.layers = layers @@ -39,7 +39,7 @@ def net(self, input, class_dim=1000, data_format="NCHW"): if layers == 18: depth = [2, 2, 2, 2] elif layers == 34 or layers == 50: - depth = [3, 3, 5, 3] + depth = [3, 3, 5, 2] elif layers == 101: depth = [3, 4, 23, 3] elif layers == 152: @@ -51,14 +51,14 @@ def net(self, input, class_dim=1000, data_format="NCHW"): num_filters=64, filter_size=7, stride=2, - act='relu', + act='leaky', name="conv1", data_format=data_format) conv = fluid.layers.pool2d( input=conv, - pool_size=3, + pool_size=2, pool_stride=2, - pool_padding=1, + pool_padding=0, pool_type='max', data_format=data_format) @@ -68,7 +68,7 @@ def net(self, input, class_dim=1000, data_format="NCHW"): if block != 0: conv = self.conv_bn_layer( input=conv, - num_filters=num_filters[block] * 2, + num_filters=num_filters[block], filter_size=3, stride=2, act="leaky_relu", @@ -76,15 +76,19 @@ def net(self, input, class_dim=1000, data_format="NCHW"): data_format=data_format) # layer warp - # left = conv - # right = conv - left, right = fluid.layers.split( - conv, - num_or_sections=[conv.shape[1] // 2, conv.shape[1] // 2], - dim=1) + # left, right = fluid.layers.split( + # conv, + # num_or_sections=[conv.shape[1]//2, conv.shape[1]//2], + # dim=1) + left = conv + right = conv + if block == 0: + ch = num_filters[block] + else: + ch = num_filters[block] * 2 right = self.conv_bn_layer( input=right, - num_filters=num_filters[block] * 4, + num_filters=ch, filter_size=1, act="leaky_relu", name=conv_name + "_right_first_route", @@ -159,7 +163,7 @@ def conv_bn_layer(self, stride=stride, padding=(filter_size - 1) // 2, groups=groups, - act=act, + act=None, param_attr=ParamAttr(name=name + "_weights"), bias_attr=False, name=name + '.conv2d.output.1', @@ -178,6 +182,10 @@ def conv_bn_layer(self, moving_mean_name=bn_name + '_mean', moving_variance_name=bn_name + '_variance', data_layout=data_format) + if act == "relu": + bn = fluid.layers.relu(bn) + elif act == "leaky_relu": + bn = fluid.layers.leaky_relu(bn) return bn def shortcut(self, input, ch_out, stride, is_first, name, data_format): @@ -228,6 +236,6 @@ def bottleneck_block(self, input, num_filters, stride, name, data_format): return ret -def CSPNetNet50(): - model = CSPNetNet(layers=50) +def CSPResNet50(): + model = CSPResNet(layers=50) return model From 07e1e5dc31e7f5729601cc0af0f3b68707904894 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Thu, 14 May 2020 03:21:59 +0000 Subject: [PATCH 3/8] add cspnet --- ppcls/modeling/architectures/__init__.py | 2 +- ppcls/modeling/architectures/csp_resnet.py | 140 ++++++++++----------- 2 files changed, 68 insertions(+), 74 deletions(-) diff --git a/ppcls/modeling/architectures/__init__.py b/ppcls/modeling/architectures/__init__.py index fa18f958b9..16e2e6c27c 100644 --- a/ppcls/modeling/architectures/__init__.py +++ b/ppcls/modeling/architectures/__init__.py @@ -46,4 +46,4 @@ # distillation model from .distillation_models import ResNet50_vd_distill_MobileNetV3_large_x1_0, ResNeXt101_32x16d_wsl_distill_ResNet50_vd -from .csp_resnet import CSPResNet50 +from .csp_resnet import * diff --git a/ppcls/modeling/architectures/csp_resnet.py b/ppcls/modeling/architectures/csp_resnet.py index e7291861b3..d42cf4a6ca 100644 --- a/ppcls/modeling/architectures/csp_resnet.py +++ b/ppcls/modeling/architectures/csp_resnet.py @@ -18,11 +18,10 @@ import math -import paddle import paddle.fluid as fluid from paddle.fluid.param_attr import ParamAttr -__all__ = ["CSPResNet50", ] +__all__ = ["CSPResNet50", "CSPResNet101"] class CSPResNet(): @@ -31,19 +30,16 @@ def __init__(self, layers=50): def net(self, input, class_dim=1000, data_format="NCHW"): layers = self.layers - supported_layers = [18, 34, 50, 101, 152] + supported_layers = [50, 101] assert layers in supported_layers, \ "supported layers are {} but input layer is {}".format( supported_layers, layers) - if layers == 18: - depth = [2, 2, 2, 2] - elif layers == 34 or layers == 50: + if layers == 50: depth = [3, 3, 5, 2] elif layers == 101: - depth = [3, 4, 23, 3] - elif layers == 152: - depth = [3, 8, 36, 3] + depth = [3, 3, 22, 2] + num_filters = [64, 128, 256, 512] conv = self.conv_bn_layer( @@ -62,75 +58,68 @@ def net(self, input, class_dim=1000, data_format="NCHW"): pool_type='max', data_format=data_format) - if layers >= 50: - for block in range(len(depth)): - conv_name = "res" + str(block + 2) + chr(97) - if block != 0: - conv = self.conv_bn_layer( - input=conv, - num_filters=num_filters[block], - filter_size=3, - stride=2, - act="leaky_relu", - name=conv_name + "_downsample", - data_format=data_format) - - # layer warp - # left, right = fluid.layers.split( - # conv, - # num_or_sections=[conv.shape[1]//2, conv.shape[1]//2], - # dim=1) - left = conv - right = conv - if block == 0: - ch = num_filters[block] - else: - ch = num_filters[block] * 2 - right = self.conv_bn_layer( - input=right, - num_filters=ch, - filter_size=1, + for block in range(len(depth)): + conv_name = "res" + str(block + 2) + chr(97) + if block != 0: + conv = self.conv_bn_layer( + input=conv, + num_filters=num_filters[block], + filter_size=3, + stride=2, act="leaky_relu", - name=conv_name + "_right_first_route", + name=conv_name + "_downsample", data_format=data_format) - for i in range(depth[block]): - conv_name = "res" + str(block + 2) + chr(97 + i) - - right = self.bottleneck_block( - input=right, - num_filters=num_filters[block], - stride=1, - name=conv_name, - data_format=data_format) - - # route - left = self.conv_bn_layer( - input=left, - num_filters=num_filters[block] * 2, - filter_size=1, - act="leaky_relu", - name=conv_name + "_left_route", - data_format=data_format) - right = self.conv_bn_layer( + # split + left = conv + right = conv + if block == 0: + ch = num_filters[block] + else: + ch = num_filters[block] * 2 + right = self.conv_bn_layer( + input=right, + num_filters=ch, + filter_size=1, + act="leaky_relu", + name=conv_name + "_right_first_route", + data_format=data_format) + + for i in range(depth[block]): + conv_name = "res" + str(block + 2) + chr(97 + i) + + right = self.bottleneck_block( input=right, - num_filters=num_filters[block] * 2, - filter_size=1, - act="leaky_relu", - name=conv_name + "_right_route", - data_format=data_format) - conv = fluid.layers.concat([left, right], axis=1) - - conv = self.conv_bn_layer( - input=conv, - num_filters=num_filters[block] * 2, - filter_size=1, + num_filters=num_filters[block], stride=1, - act="leaky_relu", - name=conv_name + "_merged_transition", + name=conv_name, data_format=data_format) - else: - assert False, "not implemented now!!!" + + # route + left = self.conv_bn_layer( + input=left, + num_filters=num_filters[block] * 2, + filter_size=1, + act="leaky_relu", + name=conv_name + "_left_route", + data_format=data_format) + right = self.conv_bn_layer( + input=right, + num_filters=num_filters[block] * 2, + filter_size=1, + act="leaky_relu", + name=conv_name + "_right_route", + data_format=data_format) + conv = fluid.layers.concat([left, right], axis=1) + + conv = self.conv_bn_layer( + input=conv, + num_filters=num_filters[block] * 2, + filter_size=1, + stride=1, + act="leaky_relu", + name=conv_name + "_merged_transition", + data_format=data_format) pool = fluid.layers.pool2d( input=conv, @@ -193,7 +182,7 @@ def shortcut(self, input, ch_out, stride, is_first, name, data_format): ch_in = input.shape[1] else: ch_in = input.shape[-1] - if ch_in != ch_out or stride != 1 or is_first == True: + if ch_in != ch_out or stride != 1 or is_first is True: return self.conv_bn_layer( input, ch_out, 1, stride, name=name, data_format=data_format) else: @@ -239,3 +228,8 @@ def bottleneck_block(self, input, num_filters, stride, name, data_format): def CSPResNet50(): model = CSPResNet(layers=50) return model + + +def CSPResNet101(): + model = CSPResNet(layers=101) + return model From 88e671b2f3d952224f1fd9ccbc1f972d964b51b8 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Thu, 14 May 2020 03:33:43 +0000 Subject: [PATCH 4/8] add cspresnet50 config --- configs/CSPNet/CSPResNet50.yaml | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 configs/CSPNet/CSPResNet50.yaml diff --git a/configs/CSPNet/CSPResNet50.yaml b/configs/CSPNet/CSPResNet50.yaml new file mode 100644 index 0000000000..02f1a4e41f --- /dev/null +++ b/configs/CSPNet/CSPResNet50.yaml @@ -0,0 +1,76 @@ +mode: 'train' +ARCHITECTURE: + name: 'CSPResNet50' + +pretrained_model: "" +model_save_dir: "./output/" +classes_num: 1000 +total_images: 1281167 +save_interval: 1 +validate: True +valid_interval: 1 +epochs: 120 +topk: 5 +image_shape: [3, 256, 256] + +use_mix: False +ls_epsilon: -1 + +LEARNING_RATE: + function: 'Piecewise' + params: + lr: 0.1 + decay_epochs: [30, 60, 90] + gamma: 0.1 + +OPTIMIZER: + function: 'Momentum' + params: + momentum: 0.9 + regularizer: + function: 'L2' + factor: 0.000100 + +TRAIN: + batch_size: 256 + num_workers: 4 + file_list: "./dataset/ILSVRC2012/train_list.txt" + data_dir: "./dataset/ILSVRC2012/" + shuffle_seed: 0 + transforms: + - DecodeImage: + to_rgb: True + to_np: False + channel_first: False + - RandCropImage: + size: 256 + - RandFlipImage: + flip_code: 1 + - NormalizeImage: + scale: 1./255. + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: + +VALID: + batch_size: 64 + num_workers: 4 + file_list: "./dataset/ILSVRC2012/val_list.txt" + data_dir: "./dataset/ILSVRC2012/" + shuffle_seed: 0 + transforms: + - DecodeImage: + to_rgb: True + to_np: False + channel_first: False + - ResizeImage: + resize_short: 256 + - CropImage: + size: 256 + - NormalizeImage: + scale: 1.0/255.0 + mean: [0.485, 0.456, 0.406] + std: [0.229, 0.224, 0.225] + order: '' + - ToCHWImage: From 008d7eb10a7cba7900101ba1da95d494e5b074ce Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Thu, 14 May 2020 08:17:25 +0000 Subject: [PATCH 5/8] fix init --- ppcls/modeling/architectures/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppcls/modeling/architectures/__init__.py b/ppcls/modeling/architectures/__init__.py index 16e2e6c27c..6ab6e67146 100644 --- a/ppcls/modeling/architectures/__init__.py +++ b/ppcls/modeling/architectures/__init__.py @@ -46,4 +46,4 @@ # distillation model from .distillation_models import ResNet50_vd_distill_MobileNetV3_large_x1_0, ResNeXt101_32x16d_wsl_distill_ResNet50_vd -from .csp_resnet import * +from .csp_resnet import CSPResNet50, CSPResNet101 \ No newline at end of file From 9ecd3834a740b436ad57665bbafeb492c817dbad Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Fri, 15 May 2020 03:11:27 +0000 Subject: [PATCH 6/8] add mish interface for cspnet --- configs/CSPNet/CSPResNet50.yaml | 2 +- ppcls/modeling/architectures/csp_resnet.py | 47 ++++++++++++++++------ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/configs/CSPNet/CSPResNet50.yaml b/configs/CSPNet/CSPResNet50.yaml index 02f1a4e41f..78b56af93b 100644 --- a/configs/CSPNet/CSPResNet50.yaml +++ b/configs/CSPNet/CSPResNet50.yaml @@ -1,6 +1,6 @@ mode: 'train' ARCHITECTURE: - name: 'CSPResNet50' + name: 'CSPResNet50_leaky' pretrained_model: "" model_save_dir: "./output/" diff --git a/ppcls/modeling/architectures/csp_resnet.py b/ppcls/modeling/architectures/csp_resnet.py index d42cf4a6ca..b1be8d25cc 100644 --- a/ppcls/modeling/architectures/csp_resnet.py +++ b/ppcls/modeling/architectures/csp_resnet.py @@ -21,12 +21,16 @@ import paddle.fluid as fluid from paddle.fluid.param_attr import ParamAttr -__all__ = ["CSPResNet50", "CSPResNet101"] +__all__ = [ + "CSPResNet50_leaky", "CSPResNet50_mish", "CSPResNet101_leaky", + "CSPResNet101_mish" +] class CSPResNet(): - def __init__(self, layers=50): + def __init__(self, layers=50, act="leaky_relu"): self.layers = layers + self.act = act def net(self, input, class_dim=1000, data_format="NCHW"): layers = self.layers @@ -47,7 +51,7 @@ def net(self, input, class_dim=1000, data_format="NCHW"): num_filters=64, filter_size=7, stride=2, - act='leaky', + act=self.act, name="conv1", data_format=data_format) conv = fluid.layers.pool2d( @@ -66,7 +70,7 @@ def net(self, input, class_dim=1000, data_format="NCHW"): num_filters=num_filters[block], filter_size=3, stride=2, - act="leaky_relu", + act=self.act, name=conv_name + "_downsample", data_format=data_format) @@ -81,7 +85,7 @@ def net(self, input, class_dim=1000, data_format="NCHW"): input=right, num_filters=ch, filter_size=1, - act="leaky_relu", + act=self.act, name=conv_name + "_right_first_route", data_format=data_format) @@ -100,14 +104,14 @@ def net(self, input, class_dim=1000, data_format="NCHW"): input=left, num_filters=num_filters[block] * 2, filter_size=1, - act="leaky_relu", + act=self.act, name=conv_name + "_left_route", data_format=data_format) right = self.conv_bn_layer( input=right, num_filters=num_filters[block] * 2, filter_size=1, - act="leaky_relu", + act=self.act, name=conv_name + "_right_route", data_format=data_format) conv = fluid.layers.concat([left, right], axis=1) @@ -117,7 +121,7 @@ def net(self, input, class_dim=1000, data_format="NCHW"): num_filters=num_filters[block] * 2, filter_size=1, stride=1, - act="leaky_relu", + act=self.act, name=conv_name + "_merged_transition", data_format=data_format) @@ -175,8 +179,17 @@ def conv_bn_layer(self, bn = fluid.layers.relu(bn) elif act == "leaky_relu": bn = fluid.layers.leaky_relu(bn) + elif act == "mish": + bn = self._mish(bn) return bn + def _mish(self, input): + return input * fluid.layers.tanh(self._softplus(input)) + + def _softplus(self, input): + expf = fluid.layers.exp(fluid.layers.clip(input, -200, 50)) + return fluid.layers.log(1 + expf) + def shortcut(self, input, ch_out, stride, is_first, name, data_format): if data_format == 'NCHW': ch_in = input.shape[1] @@ -225,11 +238,21 @@ def bottleneck_block(self, input, num_filters, stride, name, data_format): return ret -def CSPResNet50(): - model = CSPResNet(layers=50) +def CSPResNet50_leaky(): + model = CSPResNet(layers=50, act="leaky_relu") + return model + + +def CSPResNet50_mish(): + model = CSPResNet(layers=50, act="mish") + return model + + +def CSPResNet101_leaky(): + model = CSPResNet(layers=101, act="leaky_relu") return model -def CSPResNet101(): - model = CSPResNet(layers=101) +def CSPResNet101_mish(): + model = CSPResNet(layers=101, act="mish") return model From e0f3139258008b793a93f2404e45f434d7effa19 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Mon, 18 May 2020 02:08:31 +0000 Subject: [PATCH 7/8] fix init --- ppcls/modeling/architectures/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppcls/modeling/architectures/__init__.py b/ppcls/modeling/architectures/__init__.py index 6ab6e67146..ac57a786aa 100644 --- a/ppcls/modeling/architectures/__init__.py +++ b/ppcls/modeling/architectures/__init__.py @@ -46,4 +46,4 @@ # distillation model from .distillation_models import ResNet50_vd_distill_MobileNetV3_large_x1_0, ResNeXt101_32x16d_wsl_distill_ResNet50_vd -from .csp_resnet import CSPResNet50, CSPResNet101 \ No newline at end of file +from .csp_resnet import CSPResNet50_leaky \ No newline at end of file From d137720b94caccc7d418985d5336cb1210794d79 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Mon, 18 May 2020 02:50:52 +0000 Subject: [PATCH 8/8] fix download to support pdparams --- ppcls/utils/model_zoo.py | 10 +++++----- ppcls/utils/pretrained.list | 1 + tools/download.py | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ppcls/utils/model_zoo.py b/ppcls/utils/model_zoo.py index dd65e921f3..d023f4d1fb 100644 --- a/ppcls/utils/model_zoo.py +++ b/ppcls/utils/model_zoo.py @@ -58,9 +58,9 @@ def __init__(self, url='', times=''): super(RetryError, self).__init__(message) -def _get_url(architecture): +def _get_url(architecture, postfix="tar"): prefix = "https://paddle-imagenet-models-name.bj.bcebos.com/" - fname = architecture + "_pretrained.tar" + fname = architecture + "_pretrained." + postfix return prefix + fname @@ -193,13 +193,13 @@ def list_models(): return -def get(architecture, path, decompress=True): +def get(architecture, path, decompress=True, postfix="tar"): """ Get the pretrained model. """ _check_pretrained_name(architecture) - url = _get_url(architecture) + url = _get_url(architecture, postfix=postfix) fname = _download(url, path) - if decompress: + if postfix == "tar" and decompress: _decompress(fname) logger.info("download {} finished ".format(fname)) diff --git a/ppcls/utils/pretrained.list b/ppcls/utils/pretrained.list index 633cafd921..91ae4409f9 100644 --- a/ppcls/utils/pretrained.list +++ b/ppcls/utils/pretrained.list @@ -116,3 +116,4 @@ VGG16 VGG19 DarkNet53_ImageNet1k ResNet50_ACNet_deploy +CSPResNet50_leaky diff --git a/tools/download.py b/tools/download.py index d9fe1a8ee0..35cf77a725 100644 --- a/tools/download.py +++ b/tools/download.py @@ -24,6 +24,7 @@ def str2bool(v): parser = argparse.ArgumentParser() parser.add_argument('-a', '--architecture', type=str, default='ResNet50') parser.add_argument('-p', '--path', type=str, default='./pretrained/') + parser.add_argument('--postfix', type=str, default="tar") parser.add_argument('-d', '--decompress', type=str2bool, default=True) parser.add_argument('-l', '--list', type=str2bool, default=False) @@ -36,7 +37,8 @@ def main(): if args.list: model_zoo.list_models() else: - model_zoo.get(args.architecture, args.path, args.decompress) + model_zoo.get(args.architecture, args.path, args.decompress, + args.postfix) if __name__ == '__main__':