コード例 #1
0
def conv2d_fixed_padding(inputs,
                         filters,
                         kernel_size,
                         strides,
                         pruning_method='baseline',
                         data_format='channels_first',
                         weight_decay=0.,
                         name=None):
    """Strided 2-D convolution with explicit padding.

  The padding is consistent and is based only on `kernel_size`, not on the
  dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone).

  Args:
    inputs:  Input tensor, float32 or bfloat16 of size [batch, channels, height,
      width].
    filters: Int specifying number of filters for the first two convolutions.
    kernel_size: Int designating size of kernel to be used in the convolution.
    strides: Int specifying the stride. If stride >1, the input is downsampled.
    pruning_method: String that specifies the pruning method used to identify
      which weights to remove.
    data_format: String that specifies either "channels_first" for [batch,
      channels, height,width] or "channels_last" for [batch, height, width,
      channels].
    weight_decay: Weight for the l2 regularization loss.
    name: String that specifies name for model layer.

  Returns:
    The output activation tensor of size [batch, filters, height_out, width_out]

  Raises:
    ValueError: If the data_format provided is not a valid string.
  """
    if strides > 1:
        inputs = resnet_model.fixed_padding(inputs,
                                            kernel_size,
                                            data_format=data_format)
        padding = 'VALID'
    else:
        padding = 'SAME'

    kernel_initializer = tf.variance_scaling_initializer()

    kernel_regularizer = contrib_layers.l2_regularizer(weight_decay)
    return sparse_conv2d(x=inputs,
                         units=filters,
                         activation=None,
                         kernel_size=[kernel_size, kernel_size],
                         use_bias=False,
                         kernel_initializer=kernel_initializer,
                         kernel_regularizer=kernel_regularizer,
                         bias_initializer=None,
                         biases_regularizer=None,
                         sparsity_technique=pruning_method,
                         normalizer_fn=None,
                         strides=[strides, strides],
                         padding=padding,
                         data_format=data_format,
                         name=name)
コード例 #2
0
def depthwise_conv2d_fixed_padding(inputs,
                                   kernel_size,
                                   stride,
                                   data_format='channels_first',
                                   name=None):
    """Depthwise Strided 2-D convolution with explicit padding.

  The padding is consistent and is based only on `kernel_size`, not on the
  dimensions of `inputs` (as opposed to using `tf.layers.conv2d` alone).

  Args:
    inputs:  Input tensor, float32 or bfloat16 of size [batch, channels, height,
      width].
    kernel_size: Int designating size of kernel to be used in the convolution.
    stride: Int specifying the stride. If stride >1, the input is downsampled.
    data_format: String that specifies either "channels_first" for [batch,
      channels, height,width] or "channels_last" for [batch, height, width,
      channels].
    name: String that specifies name for model layer.

  Returns:
    The output activation tensor of size [batch, filters, height_out, width_out]

  Raises:
    ValueError: If the data_format provided is not a valid string.
  """
    if stride > 1:
        inputs = resnet_model.fixed_padding(inputs,
                                            kernel_size,
                                            data_format=data_format)
    padding = 'SAME' if stride == 1 else 'VALID'

    if data_format == 'channels_last':
        data_format_channels = 'NHWC'
    elif data_format == 'channels_first':
        data_format_channels = 'NCHW'
    else:
        raise ValueError('Not a valid channel string:', data_format)

    return contrib_layers.separable_conv2d(inputs=inputs,
                                           num_outputs=None,
                                           kernel_size=kernel_size,
                                           stride=stride,
                                           padding=padding,
                                           data_format=data_format_channels,
                                           activation_fn=None,
                                           weights_regularizer=None,
                                           biases_initializer=None,
                                           biases_regularizer=None,
                                           scope=name)
コード例 #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