//  [python]
def create_classifier(self, input_conv4, input_conv6, input_b7, input_conv9, seg_logits, feature_base = 16, keep_prob = 0.75, cls_bn = True, cls_trainable = True):
        """
        domain discriminator for MRI features and CT features
        """
        with tf.variable_scope('cls_0') as scope:
            flat_input_conv4 = PS(input_conv4, r=8, n_channel=2, batch_size=self.batch_size)  # 2
            flat_input_conv4 = tf.tile(flat_input_conv4, [1, 1, 1, 3]) # 6 in total
            flat_input_conv6 = PS(input_conv6, r=8, n_channel=4, batch_size=self.batch_size)  # 10 in total
            flat_input_b7 = PS(input_b7, r=8, n_channel=8, batch_size=self.batch_size)  # 18 in total
            flat_input_conv9 = PS(input_conv9, r = 8, n_channel = 8, batch_size = self.batch_size) # 26 in total

            input_comp = simple_concat2d(flat_input_conv4, flat_input_conv6) # 10
            input_comp = simple_concat2d(input_comp, flat_input_b7) # 18
            input_comp = simple_concat2d(input_comp, flat_input_conv9) # 26
            input_comp = simple_concat2d(input_comp, seg_logits) # 31 in total
            input_comp = simple_concat2d(input_comp, tf.expand_dims(tf.cast(tf.argmax(seg_logits, 3), tf.float32), 3))  # 1

        with tf.variable_scope('cls_1') as scope:
            wr1_1c = sharable_weight_variable( shape = [3, 3, feature_base * 2, feature_base * 4], trainable = cls_trainable  , name = "Variable" )
            wr1_2c = sharable_weight_variable( shape = [3, 3, feature_base * 4, feature_base * 4], trainable = cls_trainable  , name = "Variable_1" )
            block1_1c = residual_block( input_comp, wr1_1c, wr1_2c, keep_prob = keep_prob, inc_dim = True, is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_1'   , leak = True   )
            wr1_3d = sharable_weight_variable( shape = [3,3, feature_base * 4, feature_base * 4], trainable = cls_trainable, name = "Variable_2"  )
            out1c = conv_bn_relu2d( block1_1c, wr1_3d, keep_prob, strides = [1,2,2,1], is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_1_3', leak = True  )
            self.cls_weights.append( wr1_1c  )
            self.cls_weights.append( wr1_2c  )
            self.cls_weights.append( wr1_3d  )

        with tf.variable_scope('cls_2') as scope:
            wr2_1c = sharable_weight_variable( shape = [3, 3, feature_base * 4, feature_base *8], trainable = cls_trainable  , name = "Variable" )
            wr2_2c = sharable_weight_variable( shape = [3, 3, feature_base * 8, feature_base *8], trainable = cls_trainable  , name = "Variable_1" )
            block2_1c = residual_block( out1c, wr2_1c, wr2_2c, keep_prob = keep_prob, inc_dim = True, is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_2'   , leak = True   )
            wr2_3d = sharable_weight_variable( shape = [5,5, feature_base * 8, feature_base * 8], trainable = cls_trainable, name = "Variable_2"  )
            out2c = conv_bn_relu2d( block2_1c, wr2_3d, keep_prob, strides = [1,2,2,1], is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_2_3', leak = True  )
            self.cls_weights.append( wr2_1c  )
            self.cls_weights.append( wr2_2c  )
            self.cls_weights.append( wr2_3d  )
            self.debug_out2c = out2c
            self.debug_wr2_2c = wr2_2c

        with tf.variable_scope('cls_3') as scope:
            wr3_1c = sharable_weight_variable( shape = [3, 3, feature_base * 8, feature_base *16], trainable = cls_trainable  , name = "Variable" )
            wr3_2c = sharable_weight_variable( shape = [3, 3, feature_base * 16, feature_base *16], trainable = cls_trainable  , name = "Variable_1" )
            block3_1c = residual_block( out2c, wr3_1c, wr3_2c,  keep_prob = keep_prob, inc_dim = True, is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_3'   , leak = True   )
            wr3_3d = sharable_weight_variable( shape = [3,3, feature_base * 16, feature_base * 16], trainable = cls_trainable, name = "Variable_2"  )
            out3c = conv_bn_relu2d( block3_1c, wr3_3d, keep_prob, strides = [1,2,2,1], is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_3_3', leak = True  )
            self.cls_weights.append( wr3_1c  )
            self.cls_weights.append( wr3_2c  )
            self.cls_weights.append( wr3_3d  )

        with tf.variable_scope('cls_4') as scope:
            wr4_1c = sharable_weight_variable( shape = [3, 3, feature_base * 16, feature_base *32], trainable = cls_trainable  , name = "Variable" )
            wr4_2c = sharable_weight_variable( shape = [3, 3, feature_base * 32, feature_base *32], trainable = cls_trainable  , name = "Variable_1" )
            block4_1c = residual_block( out3c, wr4_1c, wr4_2c,  keep_prob = keep_prob, inc_dim = True, is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_4'   , leak = True   )
            wr4_3d = sharable_weight_variable( shape = [3,3, feature_base * 32, feature_base * 32], trainable = cls_trainable, name = "Variable_2"  )
            out4c = conv_bn_relu2d( block4_1c, wr4_3d, keep_prob, strides = [1,2,2,1], is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_4_3', leak = True  )
            self.cls_weights.append( wr4_1c  )
            self.cls_weights.append( wr4_2c  )
            self.cls_weights.append( wr4_3d  )

        with tf.variable_scope('cls_5') as scope:
            wr5_1c = sharable_weight_variable( shape = [3, 3, feature_base * 32, feature_base *32], trainable = cls_trainable  , name = "Variable" )
            wr5_2c = sharable_weight_variable( shape = [3, 3, feature_base * 32, feature_base *32], trainable = cls_trainable  , name = "Variable_1" )
            block5_1c = residual_block( out4c, wr5_1c, wr5_2c,  keep_prob = keep_prob, is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_5'   , leak = True   )
            wr5_3d = sharable_weight_variable( shape = [5,5, feature_base * 32, feature_base * 32], trainable = cls_trainable, name = "Variable_2"  )
            out5c = conv_bn_relu2d( block5_1c, wr5_3d, keep_prob, strides = [1,4,4,1], is_train = cls_bn, bn_trainable = cls_trainable, scope = 'cls_5_3', leak = True  )
            self.cls_weights.append( wr5_1c  )
            self.cls_weights.append( wr5_2c  )
            self.cls_weights.append( wr5_3d  )

        with tf.variable_scope('cls_6') as scope:
            wr6_1c = sharable_weight_variable( shape = [3, 3, feature_base * 32, feature_base *32], trainable = cls_trainable  , name = "Variable" )
            conv_6c = conv_bn_relu2d(out5c, wr6_1c, strides = [1,2,2,1], keep_prob = keep_prob, padding = "SYMMETRIC", scope = 'cls_6', is_train = cls_bn, bn_trainable = cls_trainable, leak = True)
            self.cls_weights.append( wr6_1c  )

        with tf.variable_scope('cls_out') as scope:
            wc_out = sharable_weight_variable( shape = [ feature_base* 32 * 4,1 ], trainable = cls_trainable , name = "Variable"  )
            out6c_flat = tf.reshape(conv_6c, [-1, feature_base * 32 * 4])
            cls_logits = tf.matmul(out6c_flat, wc_out)
            self.cls_weights.append(wc_out)

        return cls_logits