From c7a2fd626c1d6a8c2bd49abef0c564eab7a51745 Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Fri, 18 Oct 2019 10:34:02 +0800 Subject: [PATCH 1/7] Update model.py --- efficientnet_pytorch/model.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/efficientnet_pytorch/model.py b/efficientnet_pytorch/model.py index 3cb47d5..b98e6dd 100755 --- a/efficientnet_pytorch/model.py +++ b/efficientnet_pytorch/model.py @@ -200,14 +200,14 @@ def forward(self, inputs): return x @classmethod - def from_name(cls, model_name, override_params=None): + def _from_name(cls, model_name, override_params=None): cls._check_model_name_is_valid(model_name) blocks_args, global_params = get_model_params(model_name, override_params) return cls(blocks_args, global_params) @classmethod def from_pretrained(cls, model_name, num_classes=1000, in_channels = 3): - model = cls.from_name(model_name, override_params={'num_classes': num_classes}) + model = cls._from_name(model_name, override_params={'num_classes': num_classes}) load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) if in_channels != 3: Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) @@ -216,10 +216,12 @@ def from_pretrained(cls, model_name, num_classes=1000, in_channels = 3): return model @classmethod - def from_pretrained(cls, model_name, num_classes=1000): - model = cls.from_name(model_name, override_params={'num_classes': num_classes}) - load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) - + def from_name(cls, model_name, num_classes=1000, in_channels = 3): + model = cls._from_name(model_name, override_params={'num_classes': num_classes}) + if in_channels != 3: + Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) + out_channels = round_filters(32, model._global_params) + model._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) return model @classmethod From ccd0b58330a273062646b001e842e8f322c721f2 Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Fri, 18 Oct 2019 11:10:17 +0800 Subject: [PATCH 2/7] Update model.py added options to override dropout and drop_connect --- efficientnet_pytorch/model.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/efficientnet_pytorch/model.py b/efficientnet_pytorch/model.py index b98e6dd..87675fa 100755 --- a/efficientnet_pytorch/model.py +++ b/efficientnet_pytorch/model.py @@ -206,8 +206,13 @@ def _from_name(cls, model_name, override_params=None): return cls(blocks_args, global_params) @classmethod - def from_pretrained(cls, model_name, num_classes=1000, in_channels = 3): - model = cls._from_name(model_name, override_params={'num_classes': num_classes}) + def from_pretrained(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): + override_params={'num_classes': num_classes} + if 0 < dropout < 1: + override_params['dropout_rate'] = dropout + if 0 < drop_connect < 1: + override_params['drop_connect_rate'] = drop_connect + model = cls._from_name(model_name, override_params=override_params) load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) if in_channels != 3: Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) @@ -216,8 +221,13 @@ def from_pretrained(cls, model_name, num_classes=1000, in_channels = 3): return model @classmethod - def from_name(cls, model_name, num_classes=1000, in_channels = 3): - model = cls._from_name(model_name, override_params={'num_classes': num_classes}) + def from_name(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): + override_params={'num_classes': num_classes} + if 0 < dropout < 1: + override_params['dropout_rate'] = dropout + if 0 < drop_connect < 1: + override_params['drop_connect_rate'] = drop_connect + model = cls._from_name(model_name, override_params=override_params) if in_channels != 3: Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) out_channels = round_filters(32, model._global_params) From 991119f5542f31eceab145ff1955e12a529bbdce Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Fri, 18 Oct 2019 14:58:07 +0800 Subject: [PATCH 3/7] Update utils.py add mish to utils --- efficientnet_pytorch/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/efficientnet_pytorch/utils.py b/efficientnet_pytorch/utils.py index 198b3b4..25a11e1 100755 --- a/efficientnet_pytorch/utils.py +++ b/efficientnet_pytorch/utils.py @@ -55,6 +55,9 @@ class Swish(nn.Module): def forward(self, x): return x * torch.sigmoid(x) +class Mish(nn.Module): + def forward(self, x): + return x * torch.tanh(F.softplus(input)) def round_filters(filters, global_params): """ Calculate and round number of filters based on depth multiplier. """ From a3116517265414876f8645ab72acf0ad057775b5 Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Fri, 18 Oct 2019 15:05:09 +0800 Subject: [PATCH 4/7] Update model.py added mish as option in set_swish --- efficientnet_pytorch/model.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/efficientnet_pytorch/model.py b/efficientnet_pytorch/model.py index 87675fa..725d714 100755 --- a/efficientnet_pytorch/model.py +++ b/efficientnet_pytorch/model.py @@ -12,6 +12,7 @@ load_pretrained_weights, Swish, MemoryEfficientSwish, + Mish, ) class MBConvBlock(nn.Module): @@ -92,11 +93,15 @@ def forward(self, inputs, drop_connect_rate=None): x = drop_connect(x, p=drop_connect_rate, training=self.training) x = x + inputs # skip connection return x - - def set_swish(self, memory_efficient=True): + + def set_swish(self, act_="mem_swish"): """Sets swish function as memory efficient (for training) or standard (for export)""" - self._swish = MemoryEfficientSwish() if memory_efficient else Swish() - + if act_ == "swish": + self._swish = Swish() + elif act_ = "mish": + self._swish = Mish() + else: + self._swish = MemoryEfficientSwish() class EfficientNet(nn.Module): """ @@ -161,12 +166,16 @@ def __init__(self, blocks_args=None, global_params=None): self._fc = nn.Linear(out_channels, self._global_params.num_classes) self._swish = MemoryEfficientSwish() - def set_swish(self, memory_efficient=True): + def set_swish(self, act_="mem_swish"): """Sets swish function as memory efficient (for training) or standard (for export)""" - self._swish = MemoryEfficientSwish() if memory_efficient else Swish() + if act_ == "swish": + self._swish = Swish() + elif act_ = "mish": + self._swish = Mish() + else: + self._swish = MemoryEfficientSwish() for block in self._blocks: - block.set_swish(memory_efficient) - + block.set_swish(act_) def extract_features(self, inputs): """ Returns output of the final convolution layer """ From e2fab577e04180d3ad852c9447ab4985a6c6d0ef Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Fri, 18 Oct 2019 18:41:56 +0800 Subject: [PATCH 5/7] Update model.py fixed typo in set_swish --- efficientnet_pytorch/model.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/efficientnet_pytorch/model.py b/efficientnet_pytorch/model.py index 725d714..e70d464 100755 --- a/efficientnet_pytorch/model.py +++ b/efficientnet_pytorch/model.py @@ -98,7 +98,7 @@ def set_swish(self, act_="mem_swish"): """Sets swish function as memory efficient (for training) or standard (for export)""" if act_ == "swish": self._swish = Swish() - elif act_ = "mish": + elif act_ == "mish": self._swish = Mish() else: self._swish = MemoryEfficientSwish() @@ -170,7 +170,7 @@ def set_swish(self, act_="mem_swish"): """Sets swish function as memory efficient (for training) or standard (for export)""" if act_ == "swish": self._swish = Swish() - elif act_ = "mish": + elif act_ == "mish": self._swish = Mish() else: self._swish = MemoryEfficientSwish() @@ -217,9 +217,9 @@ def _from_name(cls, model_name, override_params=None): @classmethod def from_pretrained(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): override_params={'num_classes': num_classes} - if 0 < dropout < 1: + if 0 < dropout: override_params['dropout_rate'] = dropout - if 0 < drop_connect < 1: + if 0 < drop_connect: override_params['drop_connect_rate'] = drop_connect model = cls._from_name(model_name, override_params=override_params) load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) @@ -232,9 +232,9 @@ def from_pretrained(cls, model_name, num_classes=1000, in_channels=3, dropout=-1 @classmethod def from_name(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): override_params={'num_classes': num_classes} - if 0 < dropout < 1: + if 0 < dropout: override_params['dropout_rate'] = dropout - if 0 < drop_connect < 1: + if 0 < drop_connect: override_params['drop_connect_rate'] = drop_connect model = cls._from_name(model_name, override_params=override_params) if in_channels != 3: From 4a6b1f18ac9035a2d5595029f671d5f35c49fa04 Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Fri, 18 Oct 2019 18:42:30 +0800 Subject: [PATCH 6/7] Update utils.py fixed typo in Mish --- efficientnet_pytorch/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/efficientnet_pytorch/utils.py b/efficientnet_pytorch/utils.py index 25a11e1..899bf93 100755 --- a/efficientnet_pytorch/utils.py +++ b/efficientnet_pytorch/utils.py @@ -57,7 +57,7 @@ def forward(self, x): class Mish(nn.Module): def forward(self, x): - return x * torch.tanh(F.softplus(input)) + return x * torch.tanh(F.softplus(x)) def round_filters(filters, global_params): """ Calculate and round number of filters based on depth multiplier. """ From 40bea0b80eb6ec5489309b01e56d64accae7e4bb Mon Sep 17 00:00:00 2001 From: s-rog <55400948+s-rog@users.noreply.github.com> Date: Mon, 21 Oct 2019 14:17:45 +0800 Subject: [PATCH 7/7] Update model.py consolidated from_name and from_pretrained --- efficientnet_pytorch/model.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/efficientnet_pytorch/model.py b/efficientnet_pytorch/model.py index e70d464..eadf6ac 100755 --- a/efficientnet_pytorch/model.py +++ b/efficientnet_pytorch/model.py @@ -214,29 +214,32 @@ def _from_name(cls, model_name, override_params=None): blocks_args, global_params = get_model_params(model_name, override_params) return cls(blocks_args, global_params) - @classmethod - def from_pretrained(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): - override_params={'num_classes': num_classes} - if 0 < dropout: - override_params['dropout_rate'] = dropout - if 0 < drop_connect: - override_params['drop_connect_rate'] = drop_connect - model = cls._from_name(model_name, override_params=override_params) - load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) - if in_channels != 3: - Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) - out_channels = round_filters(32, model._global_params) - model._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) - return model +# @classmethod +# def from_pretrained(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): +# override_params={'num_classes': num_classes} +# if 0 < dropout: +# override_params['dropout_rate'] = dropout +# if 0 < drop_connect: +# override_params['drop_connect_rate'] = drop_connect +# model = cls._from_name(model_name, override_params=override_params) +# load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) +# if in_channels != 3: +# Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) +# out_channels = round_filters(32, model._global_params) +# model._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) +# return model @classmethod - def from_name(cls, model_name, num_classes=1000, in_channels=3, dropout=-1, drop_connect=-1): + def from_name(cls, model_name, num_classes=1000, pretrained=False, in_channels=3, dropout=-1, drop_connect=-1): override_params={'num_classes': num_classes} if 0 < dropout: override_params['dropout_rate'] = dropout if 0 < drop_connect: override_params['drop_connect_rate'] = drop_connect + print("Overriding default params:", override_params) model = cls._from_name(model_name, override_params=override_params) + if pretrained: + load_pretrained_weights(model, model_name, load_fc=(num_classes == 1000)) if in_channels != 3: Conv2d = get_same_padding_conv2d(image_size = model._global_params.image_size) out_channels = round_filters(32, model._global_params)