Ejemplo n.º 1
0
    def __init__(self,
                 unit_name,
                 cardinality,
                 channels,
                 bn_mom,
                 act_type,
                 res_scale_fac,
                 use_se=True):
        """

        :param channels: Number of channels used in the conv-operations
        :param bn_mom: Batch normalization momentum
        :param act_type: Activation function to use
        :param unit_name: Unit name of the residual block (only used for description (string))
        """
        super(ResidualBlockX, self).__init__(unit_name + '_')
        self.act_type = act_type
        self.unit_name = unit_name
        self.res_scale_fac = res_scale_fac
        self.body = HybridSequential(prefix='')

        with self.name_scope():
            self.body.add(
                Conv2D(channels=channels,
                       kernel_size=3,
                       padding=1,
                       use_bias=False))
            self.body.add(BatchNorm(momentum=bn_mom))
            self.body.add(get_act(self.act_type))

            self.body.add(
                Conv2D(channels=channels,
                       kernel_size=3,
                       padding=1,
                       groups=cardinality,
                       use_bias=False))
            self.body.add(BatchNorm(momentum=bn_mom))

            if use_se is True:
                # apply squeeze excitation
                self.body.add(_SqueezeExcitation('se0', channels, 16,
                                                 act_type))

            self.act0 = get_act(act_type)
Ejemplo n.º 2
0
    def __init__(self,
                 unit_name,
                 cardinality,
                 channels,
                 bn_mom=0.9,
                 act_type='relu',
                 use_se=True,
                 res_scale_fac=0.2,
                 dim_match=True):
        """

        :param channels: Number of channels used in the conv-operations
        :param bn_mom: Batch normalization momentum
        :param act_type: Activation function to use
        :param unit_name: Unit name of the residual block (only used for description (string))
        """
        super(_ResidualBlockXBottleneck, self).__init__(prefix=unit_name + '_')
        self.unit_name = unit_name
        self.res_scale_fac = res_scale_fac

        self.use_se = use_se
        self.dim_match = dim_match
        self.body = HybridSequential(prefix='')

        with self.name_scope():
            self.body.add(get_act(act_type))
            self.body.add(
                Conv2D(int(channels // 2),
                       kernel_size=1,
                       padding=0,
                       use_bias=False))
            self.body.add(BatchNorm(momentum=bn_mom))
            self.body.add(get_act(act_type))
            self.body.add(
                Conv2D(int(channels // 2),
                       kernel_size=3,
                       padding=1,
                       groups=cardinality,
                       use_bias=False))
            self.body.add(BatchNorm(momentum=bn_mom))
            self.body.add(get_act(act_type))

            # add a 1x1 branch after concatenation
            self.body.add(
                Conv2D(channels=channels, kernel_size=1, use_bias=False))
            self.body.add(BatchNorm(momentum=bn_mom))

            if use_se is True:
                # apply squeeze excitation
                self.body.add(_SqueezeExcitation('se0', channels, 16,
                                                 act_type))

            self.act0 = get_act(act_type, prefix='%s1' % act_type)

            if self.dim_match is False:
                self.expander = HybridSequential(prefix='')
                self.expander.add(
                    Conv2D(channels=channels,
                           kernel_size=1,
                           use_bias=False,
                           prefix='expander_conv'))
                self.expander.add(BatchNorm())