예제 #1
0
 def __init__(self,
              num_input_features,
              growth_rate,
              bn_size,
              drop_rate,
              norm_type='Unknown'):
     super(_DenseLayer, self).__init__()
     self.add_module('norm1', get_norm(norm_type, num_input_features)),
     self.add_module('relu1', nn.ReLU(inplace=True)),
     self.add_module(
         'conv1',
         nn.Conv2d(num_input_features,
                   bn_size * growth_rate,
                   kernel_size=1,
                   stride=1,
                   bias=False)),
     self.add_module('norm2', get_norm(norm_type, bn_size * growth_rate)),
     self.add_module('relu2', nn.ReLU(inplace=True)),
     self.add_module(
         'conv2',
         nn.Conv2d(bn_size * growth_rate,
                   growth_rate,
                   kernel_size=3,
                   stride=1,
                   padding=1,
                   bias=False)),
     self.drop_rate = drop_rate
예제 #2
0
    def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), num_init_features=64,
                 norm_type='Unknown', bn_size=4, drop_rate=0, num_classes=1000, use_se=True):

        super(DenseNet, self).__init__()

        # First convolution
        self.features = nn.Sequential(OrderedDict([('conv0',
                                                    nn.Conv2d(3, num_init_features, kernel_size=7,
                                                              stride=2, padding=3, bias=False)), (
                                                   'norm0', get_norm(norm_type, num_init_features)),
                                                   ('relu0', nn.ReLU(inplace=True)), ('pool0',
                                                                                      nn.MaxPool2d(
                                                                                          kernel_size=3,
                                                                                          stride=2,
                                                                                          padding=1)), ]))

        if use_se:
            # Add SELayer at first convolution
            self.features.add_module("SELayer_0a", SEModule(channels=num_init_features))

        # Each denseblock
        num_features = num_init_features
        for i, num_layers in enumerate(block_config):
            if use_se:
                # Add a SELayer
                self.features.add_module("SELayer_%da" % (i + 1), SEModule(channels=num_features))

            block = _DenseBlock(num_layers=num_layers, num_input_features=num_features,
                                norm_type=norm_type, bn_size=bn_size, growth_rate=growth_rate,
                                drop_rate=drop_rate)
            self.features.add_module('denseblock%d' % (i + 1), block)
            num_features = num_features + num_layers * growth_rate
            if i != len(block_config) - 1:
                if use_se:
                    # Add a SELayer behind each transition block
                    self.features.add_module("SELayer_%db" % (i + 1),
                                             SEModule(channels=num_features))

                trans = _Transition(num_input_features=num_features,
                                    num_output_features=num_features // 2, norm_type=norm_type)
                self.features.add_module('transition%d' % (i + 1), trans)
                num_features = num_features // 2

        # Final batch norm
        self.features.add_module('norm5', get_norm(norm_type, num_features))

        # Linear layer
        self.classifier = nn.Linear(num_features, num_classes)
        self.num_features = num_features

        # Official init from torch repo.
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight)
            elif isinstance(m, nn.BatchNorm2d):
                nn.init.constant_(m.weight, 1)
                nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.constant_(m.bias, 0)
예제 #3
0
 def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,
              base_width=64, dilation=1, norm_type='Unknown'):
     super(Bottleneck, self).__init__()
     width = int(planes * (base_width / 64.)) * groups
     # Both self.conv2 and self.downsample layers downsample the input when stride != 1
     self.conv1 = conv1x1(inplanes, width)
     self.bn1 = get_norm(norm_type, width)
     self.conv2 = conv3x3(width, width, stride, groups, dilation)
     self.bn2 = get_norm(norm_type, width)
     self.conv3 = conv1x1(width, planes * self.expansion)
     self.bn3 = get_norm(norm_type, planes * self.expansion)
     self.relu = nn.ReLU(inplace=True)
     self.downsample = downsample
     self.stride = stride
예제 #4
0
 def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1,
              base_width=64, dilation=1, norm_type='Unknown'):
     super(BasicBlock, self).__init__()
     if groups != 1 or base_width != 64:
         raise ValueError('BasicBlock only supports groups=1 and base_width=64')
     if dilation > 1:
         raise NotImplementedError("Dilation > 1 not supported in BasicBlock")
     # Both self.conv1 and self.downsample layers downsample the input when stride != 1
     self.conv1 = conv3x3(inplanes, planes, stride)
     self.bn1 = get_norm(norm_type, planes)
     self.relu = nn.ReLU(inplace=True)
     self.conv2 = conv3x3(planes, planes)
     self.bn2 = get_norm(norm_type, planes)
     self.downsample = downsample
     self.stride = stride
예제 #5
0
    def __init__(self, block, layers, num_classes=1000, norm_type='Unknown',
                 zero_init_residual=False, groups=1, width_per_group=64,
                 replace_stride_with_dilation=None, norm_layer=None):
        super(ResNetFPN, self).__init__()

        self.inplanes = 64
        self.dilation = 1
        if replace_stride_with_dilation is None:
            # each element in the tuple indicates if we should replace
            # the 2x2 stride with a dilated convolution instead
            replace_stride_with_dilation = [False, False, False]
        if len(replace_stride_with_dilation) != 3:
            raise ValueError("replace_stride_with_dilation should be None "
                             "or a 3-element tuple, got {}".format(replace_stride_with_dilation))
        self.groups = groups
        self.base_width = width_per_group
        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3,
                               bias=False)
        self.bn1 = get_norm(norm_type, self.inplanes)
        self.relu = nn.ReLU(inplace=True)
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.layer1 = self._make_layer(block, 64, layers[0],
                                       norm_type=norm_type)
        self.layer2 = self._make_layer(block, 128, layers[1], stride=2,
                                       dilate=replace_stride_with_dilation[0],
                                       norm_type=norm_type)
        self.layer3 = self._make_layer(block, 256, layers[2], stride=2,
                                       dilate=replace_stride_with_dilation[1],
                                       norm_type=norm_type)
        self.layer4 = self._make_layer(block, 512, layers[3], stride=2,
                                       dilate=replace_stride_with_dilation[2],
                                       norm_type=norm_type)
        self.layer5 = self._make_layer(block, 512, layers[4], stride=2,
                                       norm_type=norm_type)

        self.up2 = nn.ConvTranspose2d(self.inplanes, self.inplanes, 2, stride=2, padding=0,
                                      bias=False)

        self.merge1 = conv3x3(self.inplanes, self.inplanes)

        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = nn.Linear(self.inplanes, num_classes)
        self.num_features = self.inplanes

        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
            elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm, nn.InstanceNorm2d)):
                nn.init.constant_(m.weight, 1)
                nn.init.constant_(m.bias, 0)

        # Zero-initialize the last BN in each residual branch,
        # so that the residual branch starts with zeros, and each residual block behaves like an identity.
        # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
        if zero_init_residual:
            for m in self.modules():
                if isinstance(m, Bottleneck):
                    nn.init.constant_(m.bn3.weight, 0)
                elif isinstance(m, BasicBlock):
                    nn.init.constant_(m.bn2.weight, 0)
예제 #6
0
 def __init__(self,
              in_channels,
              out_channels,
              norm_type='Unknown',
              **kwargs):
     super(BasicConv2d, self).__init__()
     self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
     self.norm = get_norm(norm_type, out_channels, eps=0.001)
예제 #7
0
 def __init__(self, num_input_features, num_output_features, norm_type='Unknown'):
     super(_Transition, self).__init__()
     self.add_module('norm', get_norm(norm_type, num_input_features))
     self.add_module('relu', nn.ReLU(inplace=True))
     self.add_module('conv',
                     nn.Conv2d(num_input_features, num_output_features, kernel_size=1, stride=1,
                               bias=False))
     self.add_module('pool', nn.AvgPool2d(kernel_size=2, stride=2))
예제 #8
0
    def __init__(self,
                 in_ch,
                 out_ch,
                 kernel_size=3,
                 stride=1,
                 padding=0,
                 bias=True,
                 norm_type='Unknown'):
        super(Conv2dNormRelu, self).__init__()

        self.conv = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, kernel_size, stride, padding, bias=bias),
            get_norm(norm_type, out_ch), nn.ReLU(inplace=True))
예제 #9
0
def make_layers(cfg, batch_norm=False, norm_type='Unknown'):
    layers = []
    in_channels = 3
    for v in cfg:
        if v == 'M':
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            if batch_norm:
                layers += [
                    conv2d,
                    get_norm(norm_type, v),
                    nn.ReLU(inplace=True)
                ]
            else:
                layers += [conv2d, nn.ReLU(inplace=True)]
            in_channels = v
    return nn.Sequential(*layers)
예제 #10
0
    def _make_layer(self, block, planes, blocks, stride=1, dilate=False, norm_type='Unknown'):
        downsample = None
        previous_dilation = self.dilation
        if dilate:
            self.dilation *= stride
            stride = 1
        if stride != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.Sequential(
                conv1x1(self.inplanes, planes * block.expansion, stride),
                get_norm(norm_type, planes * block.expansion),
            )

        layers = []
        layers.append(block(self.inplanes, planes, stride, downsample, self.groups,
                            self.base_width, previous_dilation, norm_type))
        self.inplanes = planes * block.expansion
        for _ in range(1, blocks):
            layers.append(block(self.inplanes, planes, groups=self.groups,
                                base_width=self.base_width, dilation=self.dilation,
                                norm_type=norm_type))

        return nn.Sequential(*layers)