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)
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())