Unverified Commit 59c97420 authored by F-G Fernandez's avatar F-G Fernandez Committed by GitHub
Browse files

Added annotation typing to googlenet (#2858)

* style: Added annotation typing for googlenet

* fix: Removed duplicate typing

* refactor: Moved factory function after class definition to fix typing

* fix: Fixed annotation typing

* refactor: Removed un-necessary import

* fix: Fixed typing

* refactor: Moved back up helper function and quote typed it
parent 8263c8a1
...@@ -3,9 +3,9 @@ from collections import namedtuple ...@@ -3,9 +3,9 @@ from collections import namedtuple
import torch import torch
import torch.nn as nn import torch.nn as nn
import torch.nn.functional as F import torch.nn.functional as F
from torch.jit.annotations import Optional, Tuple
from torch import Tensor from torch import Tensor
from .utils import load_state_dict_from_url from .utils import load_state_dict_from_url
from typing import Optional, Tuple, List, Callable, Any
__all__ = ['GoogLeNet', 'googlenet', "GoogLeNetOutputs", "_GoogLeNetOutputs"] __all__ = ['GoogLeNet', 'googlenet', "GoogLeNetOutputs", "_GoogLeNetOutputs"]
...@@ -23,7 +23,7 @@ GoogLeNetOutputs.__annotations__ = {'logits': Tensor, 'aux_logits2': Optional[Te ...@@ -23,7 +23,7 @@ GoogLeNetOutputs.__annotations__ = {'logits': Tensor, 'aux_logits2': Optional[Te
_GoogLeNetOutputs = GoogLeNetOutputs _GoogLeNetOutputs = GoogLeNetOutputs
def googlenet(pretrained=False, progress=True, **kwargs): def googlenet(pretrained: bool = False, progress: bool = True, **kwargs: Any) -> "GoogLeNet":
r"""GoogLeNet (Inception v1) model architecture from r"""GoogLeNet (Inception v1) model architecture from
`"Going Deeper with Convolutions" <http://arxiv.org/abs/1409.4842>`_. `"Going Deeper with Convolutions" <http://arxiv.org/abs/1409.4842>`_.
...@@ -52,8 +52,8 @@ def googlenet(pretrained=False, progress=True, **kwargs): ...@@ -52,8 +52,8 @@ def googlenet(pretrained=False, progress=True, **kwargs):
model.load_state_dict(state_dict) model.load_state_dict(state_dict)
if not original_aux_logits: if not original_aux_logits:
model.aux_logits = False model.aux_logits = False
model.aux1 = None model.aux1 = None # type: ignore[assignment]
model.aux2 = None model.aux2 = None # type: ignore[assignment]
return model return model
return GoogLeNet(**kwargs) return GoogLeNet(**kwargs)
...@@ -62,8 +62,14 @@ def googlenet(pretrained=False, progress=True, **kwargs): ...@@ -62,8 +62,14 @@ def googlenet(pretrained=False, progress=True, **kwargs):
class GoogLeNet(nn.Module): class GoogLeNet(nn.Module):
__constants__ = ['aux_logits', 'transform_input'] __constants__ = ['aux_logits', 'transform_input']
def __init__(self, num_classes=1000, aux_logits=True, transform_input=False, init_weights=None, def __init__(
blocks=None): self,
num_classes: int = 1000,
aux_logits: bool = True,
transform_input: bool = False,
init_weights: Optional[bool] = None,
blocks: Optional[List[Callable[..., nn.Module]]] = None
) -> None:
super(GoogLeNet, self).__init__() super(GoogLeNet, self).__init__()
if blocks is None: if blocks is None:
blocks = [BasicConv2d, Inception, InceptionAux] blocks = [BasicConv2d, Inception, InceptionAux]
...@@ -104,8 +110,8 @@ class GoogLeNet(nn.Module): ...@@ -104,8 +110,8 @@ class GoogLeNet(nn.Module):
self.aux1 = inception_aux_block(512, num_classes) self.aux1 = inception_aux_block(512, num_classes)
self.aux2 = inception_aux_block(528, num_classes) self.aux2 = inception_aux_block(528, num_classes)
else: else:
self.aux1 = None self.aux1 = None # type: ignore[assignment]
self.aux2 = None self.aux2 = None # type: ignore[assignment]
self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.dropout = nn.Dropout(0.2) self.dropout = nn.Dropout(0.2)
...@@ -114,7 +120,7 @@ class GoogLeNet(nn.Module): ...@@ -114,7 +120,7 @@ class GoogLeNet(nn.Module):
if init_weights: if init_weights:
self._initialize_weights() self._initialize_weights()
def _initialize_weights(self): def _initialize_weights(self) -> None:
for m in self.modules(): for m in self.modules():
if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear): if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear):
import scipy.stats as stats import scipy.stats as stats
...@@ -127,8 +133,7 @@ class GoogLeNet(nn.Module): ...@@ -127,8 +133,7 @@ class GoogLeNet(nn.Module):
nn.init.constant_(m.weight, 1) nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0) nn.init.constant_(m.bias, 0)
def _transform_input(self, x): def _transform_input(self, x: Tensor) -> Tensor:
# type: (Tensor) -> Tensor
if self.transform_input: if self.transform_input:
x_ch0 = torch.unsqueeze(x[:, 0], 1) * (0.229 / 0.5) + (0.485 - 0.5) / 0.5 x_ch0 = torch.unsqueeze(x[:, 0], 1) * (0.229 / 0.5) + (0.485 - 0.5) / 0.5
x_ch1 = torch.unsqueeze(x[:, 1], 1) * (0.224 / 0.5) + (0.456 - 0.5) / 0.5 x_ch1 = torch.unsqueeze(x[:, 1], 1) * (0.224 / 0.5) + (0.456 - 0.5) / 0.5
...@@ -136,8 +141,7 @@ class GoogLeNet(nn.Module): ...@@ -136,8 +141,7 @@ class GoogLeNet(nn.Module):
x = torch.cat((x_ch0, x_ch1, x_ch2), 1) x = torch.cat((x_ch0, x_ch1, x_ch2), 1)
return x return x
def _forward(self, x): def _forward(self, x: Tensor) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]:
# type: (Tensor) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]
# N x 3 x 224 x 224 # N x 3 x 224 x 224
x = self.conv1(x) x = self.conv1(x)
# N x 64 x 112 x 112 # N x 64 x 112 x 112
...@@ -199,8 +203,7 @@ class GoogLeNet(nn.Module): ...@@ -199,8 +203,7 @@ class GoogLeNet(nn.Module):
else: else:
return x # type: ignore[return-value] return x # type: ignore[return-value]
def forward(self, x): def forward(self, x: Tensor) -> GoogLeNetOutputs:
# type: (Tensor) -> GoogLeNetOutputs
x = self._transform_input(x) x = self._transform_input(x)
x, aux1, aux2 = self._forward(x) x, aux1, aux2 = self._forward(x)
aux_defined = self.training and self.aux_logits aux_defined = self.training and self.aux_logits
...@@ -214,8 +217,17 @@ class GoogLeNet(nn.Module): ...@@ -214,8 +217,17 @@ class GoogLeNet(nn.Module):
class Inception(nn.Module): class Inception(nn.Module):
def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj, def __init__(
conv_block=None): self,
in_channels: int,
ch1x1: int,
ch3x3red: int,
ch3x3: int,
ch5x5red: int,
ch5x5: int,
pool_proj: int,
conv_block: Optional[Callable[..., nn.Module]] = None
) -> None:
super(Inception, self).__init__() super(Inception, self).__init__()
if conv_block is None: if conv_block is None:
conv_block = BasicConv2d conv_block = BasicConv2d
...@@ -238,7 +250,7 @@ class Inception(nn.Module): ...@@ -238,7 +250,7 @@ class Inception(nn.Module):
conv_block(in_channels, pool_proj, kernel_size=1) conv_block(in_channels, pool_proj, kernel_size=1)
) )
def _forward(self, x): def _forward(self, x: Tensor) -> List[Tensor]:
branch1 = self.branch1(x) branch1 = self.branch1(x)
branch2 = self.branch2(x) branch2 = self.branch2(x)
branch3 = self.branch3(x) branch3 = self.branch3(x)
...@@ -247,14 +259,19 @@ class Inception(nn.Module): ...@@ -247,14 +259,19 @@ class Inception(nn.Module):
outputs = [branch1, branch2, branch3, branch4] outputs = [branch1, branch2, branch3, branch4]
return outputs return outputs
def forward(self, x): def forward(self, x: Tensor) -> Tensor:
outputs = self._forward(x) outputs = self._forward(x)
return torch.cat(outputs, 1) return torch.cat(outputs, 1)
class InceptionAux(nn.Module): class InceptionAux(nn.Module):
def __init__(self, in_channels, num_classes, conv_block=None): def __init__(
self,
in_channels: int,
num_classes: int,
conv_block: Optional[Callable[..., nn.Module]] = None
) -> None:
super(InceptionAux, self).__init__() super(InceptionAux, self).__init__()
if conv_block is None: if conv_block is None:
conv_block = BasicConv2d conv_block = BasicConv2d
...@@ -263,7 +280,7 @@ class InceptionAux(nn.Module): ...@@ -263,7 +280,7 @@ class InceptionAux(nn.Module):
self.fc1 = nn.Linear(2048, 1024) self.fc1 = nn.Linear(2048, 1024)
self.fc2 = nn.Linear(1024, num_classes) self.fc2 = nn.Linear(1024, num_classes)
def forward(self, x): def forward(self, x: Tensor) -> Tensor:
# aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14 # aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14
x = F.adaptive_avg_pool2d(x, (4, 4)) x = F.adaptive_avg_pool2d(x, (4, 4))
# aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4 # aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4
...@@ -283,12 +300,17 @@ class InceptionAux(nn.Module): ...@@ -283,12 +300,17 @@ class InceptionAux(nn.Module):
class BasicConv2d(nn.Module): class BasicConv2d(nn.Module):
def __init__(self, in_channels, out_channels, **kwargs): def __init__(
self,
in_channels: int,
out_channels: int,
**kwargs: Any
) -> None:
super(BasicConv2d, self).__init__() super(BasicConv2d, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs) self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
self.bn = nn.BatchNorm2d(out_channels, eps=0.001) self.bn = nn.BatchNorm2d(out_channels, eps=0.001)
def forward(self, x): def forward(self, x: Tensor) -> Tensor:
x = self.conv(x) x = self.conv(x)
x = self.bn(x) x = self.bn(x)
return F.relu(x, inplace=True) return F.relu(x, inplace=True)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment