Exemple #1
0
def conv(input_shape,
         num_classes,
         dense_classifier=False,
         pretrained=False,
         L=3,
         N=32,
         nonlinearity=nn.ReLU()):
    channels, width, height = input_shape

    # Convolutional feature extractor
    modules = []
    modules.append(layers.Conv2d(channels, N, kernel_size=3, padding=3 // 2))
    modules.append(nonlinearity)
    for i in range(L - 2):
        modules.append(layers.Conv2d(N, N, kernel_size=3, padding=3 // 2))
        modules.append(nonlinearity)

    # Linear classifier
    modules.append(nn.Flatten())
    if dense_classifier:
        modules.append(nn.Linear(N * width * height, num_classes))
    else:
        modules.append(layers.Linear(N * width * height, num_classes))
    model = nn.Sequential(*modules)

    # Pretrained model
    if pretrained:
        print("WARNING: this model does not have pretrained weights.")

    return model
Exemple #2
0
    def __init__(self, in_channels, out_channels, stride=1, base_width=64):
        super().__init__()
        width = int(out_channels * (base_width / 64.))
        self.residual_function = nn.Sequential(
            layers.Conv2d(in_channels, width, kernel_size=1, bias=False),
            layers.BatchNorm2d(width),
            nn.ReLU(inplace=True),
            layers.Conv2d(width,
                          width,
                          stride=stride,
                          kernel_size=3,
                          padding=1,
                          bias=False),
            layers.BatchNorm2d(width),
            nn.ReLU(inplace=True),
            layers.Conv2d(width,
                          out_channels * BottleNeck.expansion,
                          kernel_size=1,
                          bias=False),
            layers.BatchNorm2d(out_channels * BottleNeck.expansion),
        )

        self.shortcut = layers.Identity2d(in_channels)

        if stride != 1 or in_channels != out_channels * BottleNeck.expansion:
            self.shortcut = nn.Sequential(
                layers.Conv2d(in_channels,
                              out_channels * BottleNeck.expansion,
                              stride=stride,
                              kernel_size=1,
                              bias=False),
                layers.BatchNorm2d(out_channels * BottleNeck.expansion))
    def __init__(self, f_in: int, f_out: int, downsample=False):
        super(Block, self).__init__()

        stride = 2 if downsample else 1
        self.conv1 = layers.Conv2d(f_in,
                                   f_out,
                                   kernel_size=3,
                                   stride=stride,
                                   padding=1,
                                   bias=False)
        self.bn1 = layers.BatchNorm2d(f_out)
        self.conv2 = layers.Conv2d(f_out,
                                   f_out,
                                   kernel_size=3,
                                   stride=1,
                                   padding=1,
                                   bias=False)
        self.bn2 = layers.BatchNorm2d(f_out)

        # No parameters for shortcut connections.
        if downsample or f_in != f_out:
            self.shortcut = nn.Sequential(
                layers.Conv2d(f_in, f_out, kernel_size=1, stride=2,
                              bias=False), layers.BatchNorm2d(f_out))
        else:
            self.shortcut = layers.Identity2d(f_in)
Exemple #4
0
    def __init__(self, in_channels, out_channels, stride=1, base_width=64):
        super().__init__()

        #residual function
        self.residual_function = nn.Sequential(
            layers.Conv2d(in_channels,
                          out_channels,
                          kernel_size=3,
                          stride=stride,
                          padding=1,
                          bias=False), layers.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True),
            layers.Conv2d(out_channels,
                          out_channels * BasicBlock.expansion,
                          kernel_size=3,
                          padding=1,
                          bias=False),
            layers.BatchNorm2d(out_channels * BasicBlock.expansion))

        #shortcut
        self.shortcut = layers.Identity2d(in_channels)

        #the shortcut output dimension is not the same with residual function
        #use 1*1 convolution to match the dimension
        if stride != 1 or in_channels != BasicBlock.expansion * out_channels:
            self.shortcut = nn.Sequential(
                layers.Conv2d(in_channels,
                              out_channels * BasicBlock.expansion,
                              kernel_size=1,
                              stride=stride,
                              bias=False),
                layers.BatchNorm2d(out_channels * BasicBlock.expansion))
    def __init__(self,
                 in_channels,
                 out_channels,
                 stride=1,
                 base_width=64,
                 batch_norm=True):
        super().__init__()

        self.batch_norm = batch_norm

        # residual function
        layer_list = [
            layers.Conv2d(
                in_channels,
                out_channels,
                kernel_size=3,
                stride=stride,
                padding=1,
                bias=False,
            ),
        ]
        if self.batch_norm:
            layer_list.append(layers.BatchNorm2d(out_channels))
        layer_list += [
            nn.ReLU(inplace=True),
            layers.Conv2d(
                out_channels,
                out_channels * BasicBlock.expansion,
                kernel_size=3,
                padding=1,
                bias=False,
            ),
        ]
        if self.batch_norm:
            layer_list.append(
                layers.BatchNorm2d(out_channels * BasicBlock.expansion))
        self.residual_function = nn.Sequential(*layer_list)

        # shortcut
        self.shortcut = layers.Identity2d(in_channels)

        # the shortcut output dimension is not the same with residual function
        # use 1*1 convolution to match the dimension
        if stride != 1 or in_channels != BasicBlock.expansion * out_channels:
            layer_list = [
                layers.Conv2d(
                    in_channels,
                    out_channels * BasicBlock.expansion,
                    kernel_size=1,
                    stride=stride,
                    bias=False,
                )
            ]
            if self.batch_norm:
                layer_list.append(
                    layers.BatchNorm2d(out_channels * BasicBlock.expansion))
            self.shortcut = nn.Sequential(*layer_list)
    def __init__(self,
                 in_channels,
                 out_channels,
                 stride=1,
                 base_width=64,
                 batch_norm=True):
        super().__init__()

        self.batch_norm = batch_norm

        width = int(out_channels * (base_width / 64.0))
        layer_list = [
            layers.Conv2d(in_channels, width, kernel_size=1, bias=False),
        ]
        if self.batch_norm:
            layer_list.append(layers.BatchNorm2d(width))
        layer_list += [
            nn.ReLU(inplace=True),
            layers.Conv2d(width,
                          width,
                          stride=stride,
                          kernel_size=3,
                          padding=1,
                          bias=False),
        ]
        if self.batch_norm:
            layer_list.append(layers.BatchNorm2d(width))
        layer_list += [
            nn.ReLU(inplace=True),
            layers.Conv2d(width,
                          out_channels * BottleNeck.expansion,
                          kernel_size=1,
                          bias=False),
        ]
        if self.batch_norm:
            layer_list.append(
                layers.BatchNorm2d(out_channels * BottleNeck.expansion))
        self.residual_function = nn.Sequential(*layer_list)

        self.shortcut = layers.Identity2d(in_channels)

        if stride != 1 or in_channels != out_channels * BottleNeck.expansion:
            layer_list = [
                layers.Conv2d(
                    in_channels,
                    out_channels * BottleNeck.expansion,
                    stride=stride,
                    kernel_size=1,
                    bias=False,
                ),
            ]
            if self.batch_norm:
                layer_list.append(
                    layers.BatchNorm2d(out_channels * BottleNeck.expansion))
            self.shortcut = nn.Sequential(*layer_list)
def conv1x1(in_planes, out_planes, stride=1):
    """1x1 convolution"""
    return layers.Conv2d(in_planes,
                         out_planes,
                         kernel_size=1,
                         stride=stride,
                         bias=False)
Exemple #8
0
    def __init__(self, plan, num_classes, dense_classifier):
        super(ResNet, self).__init__()

        # Initial convolution.
        current_filters = plan[0][0]
        self.conv = layers.Conv2d(
            3, current_filters, kernel_size=3, stride=1, padding=1, bias=False
        )
        self.bn = layers.BatchNorm2d(current_filters)

        # The subsequent blocks of the ResNet.
        blocks = []
        for segment_index, (filters, num_blocks) in enumerate(plan):
            for block_index in range(num_blocks):
                downsample = segment_index > 0 and block_index == 0
                blocks.append(Block(current_filters, filters, downsample))
                current_filters = filters

        self.blocks = nn.Sequential(*blocks)

        self.fc = layers.Linear(plan[-1][0], num_classes)
        if dense_classifier:
            self.fc = nn.Linear(plan[-1][0], num_classes)

        self._initialize_weights()
Exemple #9
0
 def __init__(self, in_filters, out_filters):
     super(ConvBNModule, self).__init__()
     self.conv = layers.Conv2d(in_filters,
                               out_filters,
                               kernel_size=3,
                               padding=1)
     self.bn = layers.BatchNorm2d(out_filters)
Exemple #10
0
    def __init__(self,
                 block,
                 num_block,
                 base_width,
                 num_classes=200,
                 dense_classifier=False):
        super().__init__()

        self.in_channels = 64

        self.conv1 = nn.Sequential(
            layers.Conv2d(3, 64, kernel_size=3, padding=1, bias=False),
            layers.BatchNorm2d(64), nn.ReLU(inplace=True))
        #we use a different inputsize than the original paper
        #so conv2_x's stride is 1
        self.conv2_x = self._make_layer(block, 64, num_block[0], 1, base_width)
        self.conv3_x = self._make_layer(block, 128, num_block[1], 2,
                                        base_width)
        self.conv4_x = self._make_layer(block, 256, num_block[2], 2,
                                        base_width)
        self.conv5_x = self._make_layer(block, 512, num_block[3], 2,
                                        base_width)
        self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = layers.Linear(512 * block.expansion, num_classes)
        if dense_classifier:
            self.fc = nn.Linear(512 * block.expansion, num_classes)
        self._initialize_weights()
def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1):
    """3x3 convolution with padding"""
    return layers.Conv2d(in_planes,
                         out_planes,
                         kernel_size=3,
                         stride=stride,
                         padding=dilation,
                         groups=groups,
                         bias=False,
                         dilation=dilation)
def make_layers(cfg, batch_norm=False):
    layer_list = []
    in_channels = 3
    for v in cfg:
        if v == 'M':
            layer_list += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = layers.Conv2d(in_channels, v, kernel_size=3, padding=1)
            if batch_norm:
                layer_list += [
                    conv2d,
                    layers.BatchNorm2d(v),
                    nn.ReLU(inplace=True)
                ]
            else:
                layer_list += [conv2d, nn.ReLU(inplace=True)]
            in_channels = v
    return nn.Sequential(*layer_list)
def make_layers(cfg, batch_norm=False):
    layer_list = []

    input_channel = 3
    for l in cfg:
        if l == 'M':
            layer_list += [nn.MaxPool2d(kernel_size=2, stride=2)]
            continue

        layer_list += [
            layers.Conv2d(input_channel, l, kernel_size=3, padding=1)
        ]

        if batch_norm:
            layer_list += [layers.BatchNorm2d(l)]

        layer_list += [nn.ReLU(inplace=True)]
        input_channel = l

    return nn.Sequential(*layer_list)
    def __init__(self,
                 block,
                 layer_list,
                 num_classes=1000,
                 zero_init_residual=False,
                 groups=1,
                 width_per_group=64,
                 replace_stride_with_dilation=None,
                 norm_layer=None):
        super(ResNet, self).__init__()
        if norm_layer is None:
            norm_layer = layers.BatchNorm2d
        self._norm_layer = norm_layer

        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 = layers.Conv2d(3,
                                   self.inplanes,
                                   kernel_size=7,
                                   stride=2,
                                   padding=3,
                                   bias=False)
        self.bn1 = norm_layer(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, layer_list[0])
        self.layer2 = self._make_layer(block,
                                       128,
                                       layer_list[1],
                                       stride=2,
                                       dilate=replace_stride_with_dilation[0])
        self.layer3 = self._make_layer(block,
                                       256,
                                       layer_list[2],
                                       stride=2,
                                       dilate=replace_stride_with_dilation[1])
        self.layer4 = self._make_layer(block,
                                       512,
                                       layer_list[3],
                                       stride=2,
                                       dilate=replace_stride_with_dilation[2])
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.fc = layers.Linear(512 * block.expansion, num_classes)

        for m in self.modules():
            if isinstance(m, layers.Conv2d):
                nn.init.kaiming_normal_(m.weight,
                                        mode='fan_out',
                                        nonlinearity='relu')
            elif isinstance(m, (layers.BatchNorm2d, nn.GroupNorm)):
                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)