From a6adcf9ae135a14f009fe7d0c459ffc24b3d34d9 Mon Sep 17 00:00:00 2001 From: frgfm Date: Wed, 21 Oct 2020 17:45:02 +0200 Subject: [PATCH 1/9] style: Added annotation typing for densenet --- torchvision/models/densenet.py | 69 ++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 0f38dd254f9..2b05fd34877 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -7,6 +7,7 @@ from .utils import load_state_dict_from_url from torch import Tensor from torch.jit.annotations import List +from typing import Any __all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] @@ -20,7 +21,14 @@ class _DenseLayer(nn.Module): - def __init__(self, num_input_features, growth_rate, bn_size, drop_rate, memory_efficient=False): + def __init__( + self, + num_input_features: int, + growth_rate: int, + bn_size: int, + drop_rate: float, + memory_efficient: bool = False + ): super(_DenseLayer, self).__init__() self.add_module('norm1', nn.BatchNorm2d(num_input_features)), self.add_module('relu1', nn.ReLU(inplace=True)), @@ -35,41 +43,36 @@ def __init__(self, num_input_features, growth_rate, bn_size, drop_rate, memory_e self.drop_rate = float(drop_rate) self.memory_efficient = memory_efficient - def bn_function(self, inputs): - # type: (List[Tensor]) -> Tensor + def bn_function(self, inputs: List[Tensor]) -> Tensor: concated_features = torch.cat(inputs, 1) bottleneck_output = self.conv1(self.relu1(self.norm1(concated_features))) # noqa: T484 return bottleneck_output # todo: rewrite when torchscript supports any - def any_requires_grad(self, input): - # type: (List[Tensor]) -> bool + def any_requires_grad(self, input: List[Tensor]) -> bool: for tensor in input: if tensor.requires_grad: return True return False @torch.jit.unused # noqa: T484 - def call_checkpoint_bottleneck(self, input): - # type: (List[Tensor]) -> Tensor + def call_checkpoint_bottleneck(self, input: List[Tensor]) -> Tensor: def closure(*inputs): return self.bn_function(inputs) return cp.checkpoint(closure, *input) @torch.jit._overload_method # noqa: F811 - def forward(self, input): - # type: (List[Tensor]) -> (Tensor) + def forward(self, input: List[Tensor]) -> Tensor: pass @torch.jit._overload_method # noqa: F811 - def forward(self, input): - # type: (Tensor) -> (Tensor) + def forward(self, input: Tensor) -> Tensor: pass # torchscript does not yet support *args, so we overload method # allowing it to take either a List[Tensor] or single Tensor - def forward(self, input): # noqa: F811 + def forward(self, input: Tensor) -> Tensor: # noqa: F811 if isinstance(input, Tensor): prev_features = [input] else: @@ -93,7 +96,15 @@ def forward(self, input): # noqa: F811 class _DenseBlock(nn.ModuleDict): _version = 2 - def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate, memory_efficient=False): + def __init__( + self, + num_layers: int, + num_input_features: int, + bn_size: int, + growth_rate: int, + drop_rate: float, + memory_efficient: bool = False + ): super(_DenseBlock, self).__init__() for i in range(num_layers): layer = _DenseLayer( @@ -105,7 +116,7 @@ def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_ra ) self.add_module('denselayer%d' % (i + 1), layer) - def forward(self, init_features): + def forward(self, init_features: Tensor) -> Tensor: features = [init_features] for name, layer in self.items(): new_features = layer(features) @@ -114,7 +125,7 @@ def forward(self, init_features): class _Transition(nn.Sequential): - def __init__(self, num_input_features, num_output_features): + def __init__(self, num_input_features: int, num_output_features: int): super(_Transition, self).__init__() self.add_module('norm', nn.BatchNorm2d(num_input_features)) self.add_module('relu', nn.ReLU(inplace=True)) @@ -139,8 +150,16 @@ class DenseNet(nn.Module): but slower. Default: *False*. See `"paper" `_ """ - def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), - num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000, memory_efficient=False): + def __init__( + self, + growth_rate: int = 32, + block_config: Tuple[int] = (6, 12, 24, 16), + num_init_features: int = 64, + bn_size: int = 4, + drop_rate: float = 0, + num_classes: int = 1000, + memory_efficient: bool = False + ): super(DenseNet, self).__init__() @@ -188,7 +207,7 @@ def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), elif isinstance(m, nn.Linear): nn.init.constant_(m.bias, 0) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: features = self.features(x) out = F.relu(features, inplace=True) out = F.adaptive_avg_pool2d(out, (1, 1)) @@ -197,7 +216,7 @@ def forward(self, x): return out -def _load_state_dict(model, model_url, progress): +def _load_state_dict(model: nn.Module, model_url: str, progress: bool) -> None: # '.'s are no longer allowed in module names, but previous _DenseLayer # has keys 'norm.1', 'relu.1', 'conv.1', 'norm.2', 'relu.2', 'conv.2'. # They are also in the checkpoints in model_urls. This pattern is used @@ -215,15 +234,15 @@ def _load_state_dict(model, model_url, progress): model.load_state_dict(state_dict) -def _densenet(arch, growth_rate, block_config, num_init_features, pretrained, progress, - **kwargs): +def _densenet(arch: str, growth_rate: int, block_config: Tuple[int], num_init_features: int, + pretrained: bool, progress: bool, **kwargs: Any) -> DenseNet: model = DenseNet(growth_rate, block_config, num_init_features, **kwargs) if pretrained: _load_state_dict(model, model_urls[arch], progress) return model -def densenet121(pretrained=False, progress=True, **kwargs): +def densenet121(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> DenseNet: r"""Densenet-121 model from `"Densely Connected Convolutional Networks" `_ @@ -237,7 +256,7 @@ def densenet121(pretrained=False, progress=True, **kwargs): **kwargs) -def densenet161(pretrained=False, progress=True, **kwargs): +def densenet161(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> DenseNet: r"""Densenet-161 model from `"Densely Connected Convolutional Networks" `_ @@ -251,7 +270,7 @@ def densenet161(pretrained=False, progress=True, **kwargs): **kwargs) -def densenet169(pretrained=False, progress=True, **kwargs): +def densenet169(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> DenseNet: r"""Densenet-169 model from `"Densely Connected Convolutional Networks" `_ @@ -265,7 +284,7 @@ def densenet169(pretrained=False, progress=True, **kwargs): **kwargs) -def densenet201(pretrained=False, progress=True, **kwargs): +def densenet201(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> DenseNet: r"""Densenet-201 model from `"Densely Connected Convolutional Networks" `_ From a4794cc2dcbbea93d1f7ffc566b45ca7a3c27165 Mon Sep 17 00:00:00 2001 From: frgfm Date: Wed, 21 Oct 2020 23:09:27 +0200 Subject: [PATCH 2/9] fix: Fixed import --- torchvision/models/densenet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 2b05fd34877..da4659c8ea6 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -6,7 +6,7 @@ from collections import OrderedDict from .utils import load_state_dict_from_url from torch import Tensor -from torch.jit.annotations import List +from torch.jit.annotations import List, Tuple from typing import Any From d7f32317af9e536dbaeae8790ad1107f1a8f7193 Mon Sep 17 00:00:00 2001 From: frgfm Date: Thu, 22 Oct 2020 12:09:59 +0200 Subject: [PATCH 3/9] refactor: Removed un-necessary import --- torchvision/models/densenet.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index da4659c8ea6..59024df7e55 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -6,8 +6,7 @@ from collections import OrderedDict from .utils import load_state_dict_from_url from torch import Tensor -from torch.jit.annotations import List, Tuple -from typing import Any +from typing import Any, List, Tuple __all__ = ['DenseNet', 'densenet121', 'densenet169', 'densenet201', 'densenet161'] From a5dd590d34bf22a07535d274143556d21782a4cc Mon Sep 17 00:00:00 2001 From: frgfm Date: Thu, 22 Oct 2020 21:12:26 +0200 Subject: [PATCH 4/9] fix: Fixed constructor typing --- torchvision/models/densenet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 59024df7e55..3a169c72c21 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -27,7 +27,7 @@ def __init__( bn_size: int, drop_rate: float, memory_efficient: bool = False - ): + ) -> None: super(_DenseLayer, self).__init__() self.add_module('norm1', nn.BatchNorm2d(num_input_features)), self.add_module('relu1', nn.ReLU(inplace=True)), @@ -103,7 +103,7 @@ def __init__( growth_rate: int, drop_rate: float, memory_efficient: bool = False - ): + ) -> None: super(_DenseBlock, self).__init__() for i in range(num_layers): layer = _DenseLayer( @@ -158,7 +158,7 @@ def __init__( drop_rate: float = 0, num_classes: int = 1000, memory_efficient: bool = False - ): + ) -> None: super(DenseNet, self).__init__() From ea8bcbe9cadc5b7fcda5376322c326bb14119b17 Mon Sep 17 00:00:00 2001 From: frgfm Date: Thu, 22 Oct 2020 21:13:04 +0200 Subject: [PATCH 5/9] chore: Updated mypy.ini --- mypy.ini | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mypy.ini b/mypy.ini index 2a18d69e314..0d8444e13f8 100644 --- a/mypy.ini +++ b/mypy.ini @@ -16,10 +16,6 @@ ignore_errors = True ignore_errors = True -[mypy-torchvision.models.densenet.*] - -ignore_errors = True - [mypy-torchvision.models.quantization.*] ignore_errors = True From 98c5cd25817e7990b9f974723b3854e76e981bc9 Mon Sep 17 00:00:00 2001 From: frgfm Date: Fri, 23 Oct 2020 11:52:29 +0200 Subject: [PATCH 6/9] fix: Fixed tuple typing --- torchvision/models/densenet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 3a169c72c21..52191f67d34 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -152,7 +152,7 @@ class DenseNet(nn.Module): def __init__( self, growth_rate: int = 32, - block_config: Tuple[int] = (6, 12, 24, 16), + block_config: Tuple[int, int, int, int] = (6, 12, 24, 16), num_init_features: int = 64, bn_size: int = 4, drop_rate: float = 0, @@ -233,7 +233,7 @@ def _load_state_dict(model: nn.Module, model_url: str, progress: bool) -> None: model.load_state_dict(state_dict) -def _densenet(arch: str, growth_rate: int, block_config: Tuple[int], num_init_features: int, +def _densenet(arch: str, growth_rate: int, block_config: Tuple[int, int, int, int], num_init_features: int, pretrained: bool, progress: bool, **kwargs: Any) -> DenseNet: model = DenseNet(growth_rate, block_config, num_init_features, **kwargs) if pretrained: From 6065ce07a78666fe77ec846f8745861982e6f1ab Mon Sep 17 00:00:00 2001 From: frgfm Date: Fri, 23 Oct 2020 11:58:12 +0200 Subject: [PATCH 7/9] style: Ignored some mypy errors --- torchvision/models/densenet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 52191f67d34..76bff2f6cb8 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -65,13 +65,13 @@ def closure(*inputs): def forward(self, input: List[Tensor]) -> Tensor: pass - @torch.jit._overload_method # noqa: F811 + @torch.jit._overload_method # type: ignore[no-redef] # noqa: F811 def forward(self, input: Tensor) -> Tensor: pass # torchscript does not yet support *args, so we overload method # allowing it to take either a List[Tensor] or single Tensor - def forward(self, input: Tensor) -> Tensor: # noqa: F811 + def forward(self, input: Tensor) -> Tensor: # type: ignore[no-redef] # noqa: F811 if isinstance(input, Tensor): prev_features = [input] else: @@ -115,7 +115,7 @@ def __init__( ) self.add_module('denselayer%d' % (i + 1), layer) - def forward(self, init_features: Tensor) -> Tensor: + def forward(self, init_features: Tensor) -> Tensor: # type: ignore[override] features = [init_features] for name, layer in self.items(): new_features = layer(features) From 6c01e7167b1a6a2e2201bffccd56201fe8bebc70 Mon Sep 17 00:00:00 2001 From: frgfm Date: Wed, 4 Nov 2020 22:36:29 +0100 Subject: [PATCH 8/9] style: Fixed typing --- torchvision/models/densenet.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 76bff2f6cb8..14291d7c359 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -29,16 +29,22 @@ def __init__( memory_efficient: bool = False ) -> None: super(_DenseLayer, self).__init__() - self.add_module('norm1', nn.BatchNorm2d(num_input_features)), - self.add_module('relu1', nn.ReLU(inplace=True)), + self.norm1: nn.BatchNorm2d + self.add_module('norm1', nn.BatchNorm2d(num_input_features)) + self.relu1: nn.ReLU + self.add_module('relu1', nn.ReLU(inplace=True)) + self.conv1: nn.Conv2d self.add_module('conv1', nn.Conv2d(num_input_features, bn_size * growth_rate, kernel_size=1, stride=1, - bias=False)), - self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)), - self.add_module('relu2', nn.ReLU(inplace=True)), + bias=False)) + self.norm2: nn.BatchNorm2d + self.add_module('norm2', nn.BatchNorm2d(bn_size * growth_rate)) + self.relu2: nn.ReLU + self.add_module('relu2', nn.ReLU(inplace=True)) + self.conv2: nn.Conv2d self.add_module('conv2', nn.Conv2d(bn_size * growth_rate, growth_rate, kernel_size=3, stride=1, padding=1, - bias=False)), + bias=False)) self.drop_rate = float(drop_rate) self.memory_efficient = memory_efficient From 27ca7ee95833d86614d9e57e71bc5ca33e820467 Mon Sep 17 00:00:00 2001 From: frgfm Date: Thu, 5 Nov 2020 09:42:46 +0100 Subject: [PATCH 9/9] fix: Added missing constructor typing --- torchvision/models/densenet.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/torchvision/models/densenet.py b/torchvision/models/densenet.py index 14291d7c359..c251c034568 100644 --- a/torchvision/models/densenet.py +++ b/torchvision/models/densenet.py @@ -130,7 +130,7 @@ def forward(self, init_features: Tensor) -> Tensor: # type: ignore[override] class _Transition(nn.Sequential): - def __init__(self, num_input_features: int, num_output_features: int): + def __init__(self, num_input_features: int, num_output_features: int) -> None: super(_Transition, self).__init__() self.add_module('norm', nn.BatchNorm2d(num_input_features)) self.add_module('relu', nn.ReLU(inplace=True)) @@ -239,8 +239,15 @@ def _load_state_dict(model: nn.Module, model_url: str, progress: bool) -> None: model.load_state_dict(state_dict) -def _densenet(arch: str, growth_rate: int, block_config: Tuple[int, int, int, int], num_init_features: int, - pretrained: bool, progress: bool, **kwargs: Any) -> DenseNet: +def _densenet( + arch: str, + growth_rate: int, + block_config: Tuple[int, int, int, int], + num_init_features: int, + pretrained: bool, + progress: bool, + **kwargs: Any +) -> DenseNet: model = DenseNet(growth_rate, block_config, num_init_features, **kwargs) if pretrained: _load_state_dict(model, model_urls[arch], progress)