Пример #1
0
    def __init__(self, ctx=mx.cpu(), warmup=5, runs=25, inputs=None):
        # Set the default Inputs
        default_parameters = {
            "data": (32, 3, 256),
            "data_initializer": nd.normal,
            "pool_size": 2,
            "strides": None,
            "padding": 0,
            "layout": "NCW",
            "run_backward": True,
            "dtype": "float32"
        }

        super().__init__(ctx=ctx,
                         warmup=warmup,
                         runs=runs,
                         default_parameters=default_parameters,
                         custom_parameters=inputs)

        self.data = get_mx_ndarray(ctx=self.ctx,
                                   in_tensor=self.inputs["data"],
                                   dtype=self.inputs["dtype"],
                                   initializer=self.inputs["data_initializer"],
                                   attach_grad=self.inputs["run_backward"])

        self.block = nn.AvgPool1D(pool_size=self.inputs["pool_size"],
                                  strides=self.inputs["strides"],
                                  padding=self.inputs["padding"],
                                  layout=self.inputs["layout"])
        self.block.initialize(ctx=self.ctx)
Пример #2
0
def test_pool():
    layers1d = [
        nn.MaxPool1D(),
        nn.MaxPool1D(3),
        nn.MaxPool1D(3, 2),
        nn.AvgPool1D(),
        nn.AvgPool1D(count_include_pad=False),
        nn.GlobalAvgPool1D(),
        ]
    for layer in layers1d:
        check_layer_forward(layer, (1, 2, 10))


    layers2d = [
        nn.MaxPool2D(),
        nn.MaxPool2D((3, 3)),
        nn.MaxPool2D(3, 2),
        nn.AvgPool2D(),
        nn.AvgPool2D(count_include_pad=False),
        nn.GlobalAvgPool2D(),
        ]
    for layer in layers2d:
        check_layer_forward(layer, (1, 2, 10, 10))

    layers3d = [
        nn.MaxPool3D(),
        nn.MaxPool3D((3, 3, 3)),
        nn.MaxPool3D(3, 2),
        nn.AvgPool3D(),
        nn.AvgPool3D(count_include_pad=False),
        nn.GlobalAvgPool3D(),
        ]
    for layer in layers3d:
        check_layer_forward(layer, (1, 2, 10, 10, 10))

    # test ceil_mode
    x = mx.nd.zeros((2, 2, 10, 10))

    layer = nn.MaxPool2D(3, ceil_mode=False)
    layer.collect_params().initialize()
    assert (layer(x).shape==(2, 2, 3, 3))

    layer = nn.MaxPool2D(3, ceil_mode=True)
    layer.collect_params().initialize()
    assert (layer(x).shape==(2, 2, 4, 4))
Пример #3
0
    def _make_layer(self,
                    stage_index,
                    block,
                    planes,
                    blocks,
                    strides=1,
                    dilation=1,
                    pre_dilation=1,
                    avg_down=False,
                    norm_layer=None,
                    last_gamma=False,
                    dropblock_prob=0,
                    input_size=224,
                    use_splat=False,
                    avd=False):
        downsample = None
        if strides != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.HybridSequential(prefix='down%d_' % stage_index)
            with downsample.name_scope():
                if avg_down:
                    if pre_dilation == 1:
                        downsample.add(
                            nn.AvgPool1D(pool_size=strides,
                                         strides=strides,
                                         ceil_mode=True,
                                         count_include_pad=False))
                    elif strides == 1:
                        downsample.add(
                            nn.AvgPool1D(pool_size=1,
                                         strides=1,
                                         ceil_mode=True,
                                         count_include_pad=False))
                    else:
                        downsample.add(
                            nn.AvgPool1D(pool_size=pre_dilation * strides,
                                         strides=strides,
                                         padding=1,
                                         ceil_mode=True,
                                         count_include_pad=False))
                    downsample.add(
                        nn.Conv1D(channels=planes * block.expansion,
                                  kernel_size=1,
                                  strides=1,
                                  use_bias=False,
                                  in_channels=self.inplanes))
                    downsample.add(
                        norm_layer(in_channels=planes * block.expansion,
                                   **self.norm_kwargs))
                else:
                    downsample.add(
                        nn.Conv1D(channels=planes * block.expansion,
                                  kernel_size=1,
                                  strides=strides,
                                  use_bias=False,
                                  in_channels=self.inplanes))
                    downsample.add(
                        norm_layer(in_channels=planes * block.expansion,
                                   **self.norm_kwargs))

        layers = nn.HybridSequential(prefix='layers%d_' % stage_index)
        with layers.name_scope():
            if dilation in (1, 2):
                layers.add(
                    block(planes,
                          cardinality=self.cardinality,
                          bottleneck_width=self.bottleneck_width,
                          strides=strides,
                          dilation=pre_dilation,
                          downsample=downsample,
                          previous_dilation=dilation,
                          norm_layer=norm_layer,
                          norm_kwargs=self.norm_kwargs,
                          last_gamma=last_gamma,
                          dropblock_prob=dropblock_prob,
                          input_size=input_size,
                          use_splat=use_splat,
                          avd=avd,
                          avd_first=self.avd_first,
                          radix=self.radix,
                          in_channels=self.inplanes,
                          split_drop_ratio=self.split_drop_ratio))
            elif dilation == 4:
                layers.add(
                    block(planes,
                          cardinality=self.cardinality,
                          bottleneck_width=self.bottleneck_width,
                          strides=strides,
                          dilation=pre_dilation,
                          downsample=downsample,
                          previous_dilation=dilation,
                          norm_layer=norm_layer,
                          norm_kwargs=self.norm_kwargs,
                          last_gamma=last_gamma,
                          dropblock_prob=dropblock_prob,
                          input_size=input_size,
                          use_splat=use_splat,
                          avd=avd,
                          avd_first=self.avd_first,
                          radix=self.radix,
                          in_channels=self.inplanes,
                          split_drop_ratio=self.split_drop_ratio))
            else:
                raise RuntimeError(
                    "=> unknown dilation size: {}".format(dilation))

            input_size = _update_input_size(input_size, strides)
            self.inplanes = planes * block.expansion
            for i in range(1, blocks):
                layers.add(
                    block(planes,
                          cardinality=self.cardinality,
                          bottleneck_width=self.bottleneck_width,
                          dilation=dilation,
                          previous_dilation=dilation,
                          norm_layer=norm_layer,
                          norm_kwargs=self.norm_kwargs,
                          last_gamma=last_gamma,
                          dropblock_prob=dropblock_prob,
                          input_size=input_size,
                          use_splat=use_splat,
                          avd=avd,
                          avd_first=self.avd_first,
                          radix=self.radix,
                          in_channels=self.inplanes,
                          split_drop_ratio=self.split_drop_ratio))

        return layers
Пример #4
0
 def __init__(self,
              channels,
              cardinality=1,
              bottleneck_width=64,
              strides=1,
              dilation=1,
              downsample=None,
              previous_dilation=1,
              norm_layer=None,
              norm_kwargs=None,
              last_gamma=False,
              dropblock_prob=0,
              input_size=None,
              use_splat=False,
              radix=2,
              avd=False,
              avd_first=False,
              in_channels=None,
              split_drop_ratio=0,
              **kwargs):
     super(Bottleneck, self).__init__()
     group_width = int(channels * (bottleneck_width / 64.)) * cardinality
     norm_kwargs = norm_kwargs if norm_kwargs is not None else {}
     self.dropblock_prob = dropblock_prob
     self.use_splat = use_splat
     self.avd = avd and (strides > 1 or previous_dilation != dilation)
     self.avd_first = avd_first
     if self.dropblock_prob > 0:
         self.dropblock1 = DropBlock(dropblock_prob, 3, group_width,
                                     *input_size)
         if self.avd:
             if avd_first:
                 input_size = _update_input_size(input_size, strides)
             self.dropblock2 = DropBlock(dropblock_prob, 3, group_width,
                                         *input_size)
             if not avd_first:
                 input_size = _update_input_size(input_size, strides)
         else:
             input_size = _update_input_size(input_size, strides)
             self.dropblock2 = DropBlock(dropblock_prob, 3, group_width,
                                         *input_size)
         self.dropblock3 = DropBlock(dropblock_prob, 3, channels * 4,
                                     *input_size)
     self.conv1 = nn.Conv1D(channels=group_width,
                            kernel_size=1,
                            use_bias=False,
                            in_channels=in_channels)
     self.bn1 = norm_layer(in_channels=group_width, **norm_kwargs)
     self.relu1 = nn.Activation('relu')
     if self.use_splat:
         self.conv2 = SplitAttentionConv(channels=group_width,
                                         kernel_size=3,
                                         strides=1 if self.avd else strides,
                                         padding=dilation,
                                         dilation=dilation,
                                         groups=cardinality,
                                         use_bias=False,
                                         in_channels=group_width,
                                         norm_layer=norm_layer,
                                         norm_kwargs=norm_kwargs,
                                         radix=radix,
                                         drop_ratio=split_drop_ratio,
                                         **kwargs)
     else:
         self.conv2 = nn.Conv1D(channels=group_width,
                                kernel_size=3,
                                strides=1 if self.avd else strides,
                                padding=dilation,
                                dilation=dilation,
                                groups=cardinality,
                                use_bias=False,
                                in_channels=group_width,
                                **kwargs)
         self.bn2 = norm_layer(in_channels=group_width, **norm_kwargs)
         self.relu2 = nn.Activation('relu')
     self.conv3 = nn.Conv1D(channels=channels * 4,
                            kernel_size=1,
                            use_bias=False,
                            in_channels=group_width)
     if not last_gamma:
         self.bn3 = norm_layer(in_channels=channels * 4, **norm_kwargs)
     else:
         self.bn3 = norm_layer(in_channels=channels * 4,
                               gamma_initializer='zeros',
                               **norm_kwargs)
     if self.avd:
         self.avd_layer = nn.AvgPool1D(3, strides, padding=1)
     self.relu3 = nn.Activation('relu')
     self.downsample = downsample
     self.dilation = dilation
     self.strides = strides