예제 #1
0
 def _dense(self, net, num_units, name=None, sparsity_technique='baseline'):
   return sparse_fully_connected(
       x=net,
       units=num_units,
       sparsity_technique=sparsity_technique,
       kernel_regularizer=self._regularizer,
       name=name)
예제 #2
0
    def model(inputs, is_training):
        """Creation of the model graph."""
        with tf.variable_scope(name, 'resnet_model'):
            inputs = conv2d_fixed_padding(
                inputs=inputs,
                filters=int(64 * width),
                kernel_size=7,
                strides=2,
                pruning_method=pruning_method
                if prune_first_layer else 'baseline',
                init_method=init_method if prune_first_layer else 'baseline',
                data_format=data_format,
                end_sparsity=end_sparsity,
                weight_decay=weight_decay,
                name='initial_conv')

            inputs = tf.identity(inputs, 'initial_conv')
            inputs = batch_norm_relu(inputs,
                                     is_training,
                                     data_format=data_format)

            inputs = tf.layers.max_pooling2d(inputs=inputs,
                                             pool_size=3,
                                             strides=2,
                                             padding='SAME',
                                             data_format=data_format,
                                             name='initial_max_pool')
            inputs = tf.identity(inputs, 'initial_max_pool')

            inputs = block_group(inputs=inputs,
                                 filters=int(64 * width),
                                 block_fn=block_fn,
                                 blocks=num_blocks[0],
                                 strides=1,
                                 is_training=is_training,
                                 name='block_group1',
                                 pruning_method=pruning_method,
                                 init_method=init_method,
                                 data_format=data_format,
                                 end_sparsity=end_sparsity,
                                 weight_decay=weight_decay)
            inputs = block_group(inputs=inputs,
                                 filters=int(128 * width),
                                 block_fn=block_fn,
                                 blocks=num_blocks[1],
                                 strides=2,
                                 is_training=is_training,
                                 name='block_group2',
                                 pruning_method=pruning_method,
                                 init_method=init_method,
                                 data_format=data_format,
                                 end_sparsity=end_sparsity,
                                 weight_decay=weight_decay)
            inputs = block_group(inputs=inputs,
                                 filters=int(256 * width),
                                 block_fn=block_fn,
                                 blocks=num_blocks[2],
                                 strides=2,
                                 is_training=is_training,
                                 name='block_group3',
                                 pruning_method=pruning_method,
                                 init_method=init_method,
                                 data_format=data_format,
                                 end_sparsity=end_sparsity,
                                 weight_decay=weight_decay)
            inputs = block_group(inputs=inputs,
                                 filters=int(512 * width),
                                 block_fn=block_fn,
                                 blocks=num_blocks[3],
                                 strides=2,
                                 is_training=is_training,
                                 name='block_group4',
                                 pruning_method=pruning_method,
                                 init_method=init_method,
                                 data_format=data_format,
                                 end_sparsity=end_sparsity,
                                 weight_decay=weight_decay)

            pool_size = (inputs.shape[1], inputs.shape[2])
            inputs = tf.layers.average_pooling2d(inputs=inputs,
                                                 pool_size=pool_size,
                                                 strides=1,
                                                 padding='VALID',
                                                 data_format=data_format,
                                                 name='final_avg_pool')
            inputs = tf.identity(inputs, 'final_avg_pool')
            multiplier = 4 if block_fn is bottleneck_block_ else 1
            fc_units = multiplier * int(512 * width)
            inputs = tf.reshape(inputs, [-1, fc_units])
            kernel_initializer = tf.random_normal_initializer(stddev=.01)
            # If init_method==sparse and not pruning, skip.
            if init_method != 'sparse' or prune_last_layer:
                kernel_initializer = _pick_initializer(kernel_initializer,
                                                       init_method,
                                                       pruning_method,
                                                       end_sparsity)
            kernel_regularizer = contrib_layers.l2_regularizer(weight_decay)
            inputs = sparse_fully_connected(
                x=inputs,
                units=num_classes,
                sparsity_technique=pruning_method
                if prune_last_layer else 'baseline',
                kernel_initializer=kernel_initializer,
                kernel_regularizer=kernel_regularizer,
                name='final_dense')

            inputs = tf.identity(inputs, 'final_dense')
        return inputs
예제 #3
0
    def model(inputs, is_training):
        """Creation of the model graph."""
        with tf.variable_scope(name, 'resnet_model'):
            inputs = resnet_model.fixed_padding(inputs,
                                                kernel_size=3,
                                                data_format=data_format)
            padding = 'VALID'

            kernel_initializer = tf.variance_scaling_initializer()
            kernel_regularizer = contrib_layers.l2_regularizer(weight_decay)

            inputs = tf.layers.conv2d(inputs=inputs,
                                      filters=_make_divisible(32 * width),
                                      kernel_size=3,
                                      strides=2,
                                      padding=padding,
                                      use_bias=False,
                                      kernel_initializer=kernel_initializer,
                                      kernel_regularizer=kernel_regularizer,
                                      data_format=data_format,
                                      name='initial_conv')

            inputs = tf.identity(inputs, 'initial_conv')
            inputs = resnet_model.batch_norm_relu(inputs,
                                                  is_training,
                                                  data_format=data_format)

            mb_block = functools.partial(mbv1_block_,
                                         is_training=is_training,
                                         width=width,
                                         pruning_method=pruning_method,
                                         data_format=data_format,
                                         weight_decay=weight_decay)

            inputs = mb_block(inputs, filters=64, stride=1, block_id=0)

            inputs = mb_block(inputs, filters=128, stride=2, block_id=1)
            inputs = mb_block(inputs, filters=128, stride=1, block_id=2)

            inputs = mb_block(inputs, filters=256, stride=2, block_id=3)
            inputs = mb_block(inputs, filters=256, stride=1, block_id=4)

            inputs = mb_block(inputs, filters=512, stride=2, block_id=5)
            inputs = mb_block(inputs, filters=512, stride=1, block_id=6)
            inputs = mb_block(inputs, filters=512, stride=1, block_id=7)
            inputs = mb_block(inputs, filters=512, stride=1, block_id=8)
            inputs = mb_block(inputs, filters=512, stride=1, block_id=9)
            inputs = mb_block(inputs, filters=512, stride=1, block_id=10)

            inputs = mb_block(inputs, filters=1024, stride=2, block_id=11)
            inputs = mb_block(inputs, filters=1024, stride=1, block_id=12)

            last_block_filters = _make_divisible(int(1024 * width), 8)

            if data_format == 'channels_last':
                pool_size = (inputs.shape[1], inputs.shape[2])
            elif data_format == 'channels_first':
                pool_size = (inputs.shape[2], inputs.shape[3])

            inputs = tf.layers.average_pooling2d(inputs=inputs,
                                                 pool_size=pool_size,
                                                 strides=1,
                                                 padding='VALID',
                                                 data_format=data_format,
                                                 name='final_avg_pool')
            inputs = tf.identity(inputs, 'final_avg_pool')
            inputs = tf.reshape(inputs, [-1, last_block_filters])

            kernel_initializer = tf.variance_scaling_initializer()
            kernel_regularizer = contrib_layers.l2_regularizer(weight_decay)
            if prune_last_layer:
                inputs = sparse_fully_connected(
                    x=inputs,
                    units=num_classes,
                    sparsity_technique=pruning_method
                    if prune_last_layer else 'baseline',
                    kernel_initializer=kernel_initializer,
                    kernel_regularizer=kernel_regularizer,
                    name='final_dense')
            else:
                inputs = tf.layers.dense(inputs=inputs,
                                         units=num_classes,
                                         activation=None,
                                         use_bias=True,
                                         kernel_initializer=kernel_initializer,
                                         kernel_regularizer=kernel_regularizer,
                                         name='final_dense')

            inputs = tf.identity(inputs, 'final_dense')
        return inputs