示例#1
0
def sample_fbnet_se(theta_path, feature_dim=192, data=None, prefix='fbnet'):
    if len(prefix) > 0:
        prefix += '_'
    if data is None:
        data = mx.symbol.Variable(name="data")
    with open(theta_path, 'r') as f:
        lines = f.readlines()

    _unistage = 4
    tbs_idx = 0

    _n = [3, 4, 6, 3]
    _f = [64, 256, 512, 1024, 2048]
    _bottle_neck = [1, 1, 0, 0, 0]
    _se = [0, 0, 0, 1, 0]
    _kernel = [3, 3, 3, 3, 3]
    _group = [1, 2, 1, 1, 2]

    _block_size = len(_group)

    # data = mx.sym.BatchNorm(data=data, fix_gamma=False, eps=2e-5,
    #             momentum=0.9, name=prefix+'bn0')
    data = mx.sym.Convolution(data=data,
                              num_filter=_f[0],
                              kernel=(3, 3),
                              stride=(1, 1),
                              pad=(3, 3),
                              no_bias=True,
                              name=prefix + "conv0")
    data = mx.sym.BatchNorm(data=data,
                            fix_gamma=False,
                            eps=2e-5,
                            momentum=0.9,
                            name=prefix + 'bn1')
    data = mx.sym.Activation(data=data, act_type='relu', name=prefix + 'relu0')
    data = mx.symbol.Pooling(data=data,
                             kernel=(3, 3),
                             stride=(2, 2),
                             pad=(1, 1),
                             pool_type='max')

    for b_index in range(_unistage):

        num_layers = _n[b_index]
        num_filter = _f[b_index + 1]

        for l_index in range(num_layers):

            if l_index == 0:
                stride = 2
                dim_match = False
            else:
                stride = 1
                dim_match = True

            line = lines[tbs_idx]
            theta = [float(tmp) for tmp in line.strip().split(' ')[1:]]
            i_index = np.argmax(theta)
            tbs_idx += 1

            if b_index >= 3 and l_index >= 1 and i_index == _block_size:  # deformable_Conv part
                prefix = "layer_%d_%d_block_defConv" % (b_index, l_index)
                data = block_factory_se(input_symbol=data,
                                        name=prefix,
                                        num_filter=num_filter,
                                        group=1,
                                        stride=1,
                                        se=0,
                                        k_size=3,
                                        type='deform_conv')

            else:
                type = 'bottle_neck' if i_index <= 1 else 'resnet'
                prefix = "layer_%s_%d_%d_block_%d" % (type, b_index, l_index,
                                                      i_index)
                group = _group[i_index]
                kernel_size = _kernel[i_index]
                se = _se[i_index]

                data = block_factory_se(input_symbol=data,
                                        name=prefix,
                                        num_filter=num_filter,
                                        group=group,
                                        stride=stride,
                                        se=se,
                                        k_size=kernel_size,
                                        type=type,
                                        dim_match=dim_match)

    # avg pool part
    data = mx.symbol.Pooling(data=data,
                             global_pool=True,
                             kernel=(7, 7),
                             pool_type='avg',
                             name=prefix + "global_pool")

    data = mx.symbol.Flatten(data=data, name=prefix + 'flat_pool')
    data = mx.symbol.FullyConnected(data=data, num_hidden=feature_dim)
  def _build_Se(self):
    """Build symbol.
    """
    self._logger.info("Build symbol")
    data = self._data

    data = mx.sym.Convolution(data=data, num_filter=self._f[0], kernel=(3, 3), stride=(1, 1), pad=(1, 1),no_bias=True, name="conv0")
    data = mx.sym.BatchNorm(data=data, fix_gamma=False, eps=2e-5, momentum=0.9, name= 'bn0')
    data = mx.sym.Activation(data=data, act_type='relu', name='relu0')
    data = mx.symbol.Pooling(data=data, kernel=(3, 3), stride=(2, 2), pad=(1, 1), pool_type='max', name='pool0', 
                                 pooling_convention='full')

    for b_index in range(self._unistage):

      num_layers = self._n[b_index]
      num_filter = self._f[b_index+ 1]

      for l_index in range(num_layers):
        tmp_name = "layer_%d_%d_%s" % (b_index, l_index,self._theta_unique_name)
        tmp_gumbel_name = "layer_%d_%d_%s" % (b_index, l_index, "gumbel_random")
        self._theta_name.append(tmp_name)

        if b_index != 0 and  l_index ==0:
          stride =2
        else:
          stride =1
        dim_match = False if l_index == 0 else True
        block_list = []
        for i_index in range(self._block_size):
          
          type = 'bottle_neck' if i_index<=1 else 'resnet'
         
          prefix = "layer_%s_%d_%d_block_%d" % (type,b_index, l_index, i_index)
          #self._logger.info('layer_params %s'%prefix)
          group = self._group[i_index]
          kernel_size = self._kernel[i_index]
          se = self._se[i_index]

          block_out = block_factory_se(input_symbol = data,name= prefix,num_filter=num_filter,group=group,stride=stride,
                                       se= se,k_size=  kernel_size,type = type,dim_match= dim_match)

          block_out = mx.sym.expand_dims(block_out, axis=1)
          block_list.append(block_out)
         # TODO  deformable_Conv part
        if b_index>=3 and l_index>=1: 
          prefix = "layer_%d_%d_block_defConv" % (b_index, l_index)
          self._logger.warn("name %s "%prefix)

          theta_var = mx.sym.var(tmp_name, shape=(self._block_size + 1,))
          gumbel_var = mx.sym.var(tmp_gumbel_name, shape=(self._block_size + 1,))
          self._input_shapes[tmp_name] = (self._block_size + 1,)
          self._input_shapes[tmp_gumbel_name] = (self._block_size + 1,)
          # TODO
          block_out = block_factory_se(input_symbol=data, name=prefix, num_filter=num_filter, group=1,
                                       stride=2,se=1, k_size=3, type='deform_conv')
          
          block_out = mx.sym.expand_dims(block_out, axis=1)
          block_list.append(block_out)

          self._m_size.append(self._block_size+1)
        else:
          theta_var = mx.sym.var(tmp_name, shape=(self._block_size,))
          gumbel_var = mx.sym.var(tmp_gumbel_name, shape=(self._block_size,))
          self._m_size.append(self._block_size )
          self._input_shapes[tmp_name] = (self._block_size ,)
          self._input_shapes[tmp_gumbel_name] = (self._block_size ,)

        self._theta_vars.append(theta_var)
        self._gumbel_vars.append(gumbel_var)
        self._gumbel_var_names.append([tmp_gumbel_name, self._m_size[-1]])

        theta = mx.sym.broadcast_div(mx.sym.elemwise_add(theta_var, gumbel_var), self._temperature)

        m = mx.sym.repeat(mx.sym.reshape(mx.sym.softmax(theta), (1, -1)),
                          repeats=self._dev_batch_size, axis=0)
        self._m.append(m)
        m = mx.sym.reshape(m, (-2, 1, 1, 1))
        # TODO why stack wrong
        data = mx.sym.concat(*block_list, dim=1, name="layer_%d_%d_concat" % (b_index, l_index))
        data = mx.sym.broadcast_mul(data, m)
        data = mx.sym.sum(data, axis=1)

    # avg pool part
    data = mx.symbol.Pooling(data=data, global_pool=True,
                             kernel=(7, 7), pool_type='avg', name="global_pool")

    data = mx.symbol.Flatten(data=data, name='flat_pool')
    data = mx.symbol.FullyConnected(data=data, num_hidden=self._feature_dim)
    # fc part
    if self._model_type == 'softmax':
      data = mx.symbol.FullyConnected(name="output_fc",
                                      data=data, num_hidden=self._output_dim)
    elif self._model_type == 'amsoftmax':
      s = 30.0
      margin = 0.3
      data = mx.symbol.L2Normalization(data, mode='instance', eps=1e-8) * s
      w = mx.sym.Variable('fc_weight', init=mx.init.Xavier(magnitude=2),
                          shape=(self._output_dim, self._feature_dim), dtype=np.float32)
      norm_w = mx.symbol.L2Normalization(w, mode='instance', eps=1e-8)
      data = mx.symbol.AmSoftmax(data, weight=norm_w, num_hidden=self._output_dim,
                                 lower_class_idx=0, upper_class_idx=self._output_dim,
                                 verbose=False, margin=margin, s=s,
                                 label=self._label_index)
    elif self._model_type == 'arcface':
      s = 64.0
      margin = 0.5
      data = mx.symbol.L2Normalization(data, mode='instance', eps=1e-8) * s
      w = mx.sym.Variable('fc_weight', init=mx.init.Xavier(magnitude=2),
                          shape=(self._output_dim, self._feature_dim), dtype=np.float32)
      norm_w = mx.symbol.L2Normalization(w, mode='instance', eps=1e-8)
      data = mx.symbol.Arcface(data, weight=norm_w, num_hidden=self._output_dim,
                               lower_class_idx=0, upper_class_idx=self._output_dim,
                               verbose=False, margin=margin, s=s,
                               label=self._label_index)
    self._output = data
示例#3
0
def speed_test_se(input_shape,
                  stride,
                  num_filter,
                  dim_match=False,
                  deform_conv=False,
                  ctx=mx.gpu(1)):

    data = mx.sym.var('data')
    block_list = []
    group_list = []
    se_list = []

    for block_idx in range(len(_g)):
        kernel_size = _k[block_idx]

        group = _g[block_idx]
        se = _se[block_idx]
        stride = stride

        prefix = "block_%d" % block_idx
        type = 'bottle_neck' if block_idx <= 1 else 'resnet'

        block_out = block_factory_se(input_symbol=data,
                                     name=prefix,
                                     num_filter=num_filter,
                                     group=group,
                                     stride=stride,
                                     se=se,
                                     k_size=kernel_size,
                                     type=type,
                                     dim_match=dim_match)

        block_out = mx.sym.expand_dims(block_out, axis=1)
        block_list.append(block_out)
        group_list.append(group)
        se_list.append(se)

    if deform_conv:  # deform_conv
        prefix = "block_deformable_2"
        block_out = block_factory_se(input_symbol=data,
                                     name=prefix,
                                     num_filter=num_filter,
                                     group=1,
                                     stride=1,
                                     se=0,
                                     k_size=3,
                                     type='deform_conv',
                                     dim_match=dim_match)

        block_out = mx.sym.expand_dims(block_out, axis=1)
        block_list.append(block_out)
        group_list.append(prefix)
        se_list.append("se")
    speed_list = []
    for i, sym in enumerate(block_list):

        mod = mx.mod.Module(symbol=sym,
                            context=[ctx],
                            data_names=['data'],
                            label_names=None)
        mod.bind(data_shapes=[['data', (1, ) + input_shape]],
                 for_training=False)
        mod.init_params(initializer=mx.init.Xavier(rnd_type='gaussian',
                                                   factor_type="out",
                                                   magnitude=2),
                        allow_missing=True,
                        allow_extra=True)

        data = mx.nd.random.normal(shape=(1, ) + input_shape, ctx=ctx)
        _dataiter = mx.io.NDArrayIter(data={'data': data}, batch_size=1)
        tmp_data = _dataiter.next()
        mod.forward(tmp_data)
        mod.get_outputs()[0].asnumpy()
        # tic
        start = time.time()
        for _ in range(times):
            mod.forward(tmp_data)
            y = mod.get_outputs()
            y[0].asnumpy()
        # toe
        end = time.time()
        speed = 1.0 * (end - start) / times * 1000
        speed_list.append(speed)
        msg = "Block[%d] group %s se %s  speed %f" % (i, group_list[i],
                                                      se_list[i], speed)
        print(msg)
    print(' '.join([str(t) for t in speed_list]))
示例#4
0
  def _Sample(self,theat_filepath,train_iter,val_iter):
    self._logger.info("Sample symbol")
    data = self._data

    data = mx.sym.Convolution(data=data, num_filter=self._f[0], kernel=(3, 3), stride=(1, 1), pad=(1, 1),no_bias=True, name="conv0")
    data = mx.sym.BatchNorm(data=data, fix_gamma=False, eps=2e-5, momentum=0.9, name= 'bn0')
    data = mx.sym.Activation(data=data, act_type='relu', name='relu0')
    data = mx.symbol.Pooling(data=data, kernel=(3, 3), stride=(2, 2), pad=(1, 1), pool_type='max', name='pool0', 
                                 pooling_convention='full')
    f_index = 0
    for b_index in range(self._unistage):

      num_layers = self._n[b_index]
      num_filter = self._f[b_index+ 1]

      for l_index in range(num_layers):

        if b_index != 0 and  l_index ==0:
          stride =2
        else:
          stride =1
        dim_match = False if l_index == 0 else True

        with open(theat_filepath) as f:
          theta_result = f.readlines()
        i_index = np.argmax(theta_result[f_index].strip().split(' ')[1:])

        type = 'bottle_neck' if i_index<=1 else 'resnet'
        prefix = "layer_%s_%d_%d_block_0" % (type,b_index, l_index)
        group = self._group[i_index]
        kernel_size = self._kernel[i_index]
        se = self._se[i_index]
        if i_index<=4:
          data = block_factory_se(input_symbol = data,name= prefix,num_filter=num_filter,group=group,stride=stride,
                                       se= se,k_size=  kernel_size,type = type,dim_match= dim_match)
        # TODO  deformable_Conv part
        else:
          data = block_factory_se(input_symbol=data, name=prefix, num_filter=num_filter, group=1,
                                       stride=2,se=1, k_size=3, type='deform_conv')
         
        f_index+=1

        if b_index>=3 and l_index>=1: 
          pass

    data = mx.symbol.Pooling(data=data, global_pool=True,
                             kernel=(7, 7), pool_type='avg', name="global_pool")
    data = mx.symbol.Flatten(data=data, name='flat_pool')
    data = mx.symbol.FullyConnected(data=data, num_hidden=self._feature_dim)
    # fc part
    if self._model_type == 'softmax':
      data = mx.symbol.FullyConnected(name="output_fc",
                                      data=data, num_hidden=self._output_dim)
    elif self._model_type == 'amsoftmax':
      s = 30.0
      margin = 0.3
      data = mx.symbol.L2Normalization(data, mode='instance', eps=1e-8) * s
      w = mx.sym.Variable('fc_weight', init=mx.init.Xavier(magnitude=2),
                          shape=(self._output_dim, self._feature_dim), dtype=np.float32)
      norm_w = mx.symbol.L2Normalization(w, mode='instance', eps=1e-8)
      data = mx.symbol.AmSoftmax(data, weight=norm_w, num_hidden=self._output_dim,
                                 lower_class_idx=0, upper_class_idx=self._output_dim,
                                 verbose=False, margin=margin, s=s,
                                 label=self._label_index)
    elif self._model_type == 'arcface':
      s = 64.0
      margin = 0.5
      data = mx.symbol.L2Normalization(data, mode='instance', eps=1e-8) * s
      w = mx.sym.Variable('fc_weight', init=mx.init.Xavier(magnitude=2),
                          shape=(self._output_dim, self._feature_dim), dtype=np.float32)
      norm_w = mx.symbol.L2Normalization(w, mode='instance', eps=1e-8)
      data = mx.symbol.Arcface(data, weight=norm_w, num_hidden=self._output_dim,
                               lower_class_idx=0, upper_class_idx=self._output_dim,
                               verbose=False, margin=margin, s=s,
                               label=self._label_index)
    self._output = data

    self._fbnet_model = mx.mod.Module(symbol=self._output, context=mx.cpu())

    self._fbnet_model.fit(train_iter, eval_data=val_iter,   
                optimizer='sgd', 
                optimizer_params={'learning_rate': 0.08,
                                    'wd':0.0005},  
                eval_metric='acc',  
                batch_end_callback=mx.callback.Speedometer(100, 100),
                num_epoch=10)  
    
    # Using Test_Iter test acc 
    acc = mx.metric.Accuracy()
    self._fbnet_model .score(val_iter, acc)
    print(acc)