Пример #1
0
def binary_densenet(args,
                    input_shape,
                    num_classes,
                    input_tensor=None,
                    include_top=True):
    input = utils.get_input_layer(input_shape, input_tensor)

    if input_shape[0] and input_shape[0] < 50:
        x = keras.layers.Conv2D(
            args.initial_filters,
            kernel_size=3,
            padding="same",
            kernel_initializer="he_normal",
            use_bias=False,
        )(input)
    else:
        x = keras.layers.Conv2D(
            args.initial_filters,
            kernel_size=7,
            strides=2,
            padding="same",
            kernel_initializer="he_normal",
            use_bias=False,
        )(input)

        x = keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)
        x = keras.layers.Activation("relu")(x)
        x = keras.layers.MaxPool2D(3, strides=2, padding="same")(x)

    for block, layers_per_block in enumerate(args.layers):
        for _ in range(layers_per_block):
            x = densely_connected_block(x, args, args.dilation_rate[block])

        if block < len(args.layers) - 1:
            x = keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)
            if args.dilation_rate[block + 1] == 1:
                x = keras.layers.MaxPooling2D(2, strides=2)(x)
            x = keras.layers.Activation("relu")(x)
            x = keras.layers.Conv2D(
                round(x.shape.as_list()[-1] // args.reduction[block] / 32) *
                32,
                kernel_size=1,
                kernel_initializer="he_normal",
                use_bias=False,
            )(x)

    x = keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)

    if include_top:
        x = keras.layers.Activation("relu")(x)
        x = keras.layers.GlobalAvgPool2D()(x)
        x = keras.layers.Dense(num_classes,
                               activation="softmax",
                               kernel_initializer="he_normal")(x)
    return keras.Model(inputs=input, outputs=x, name=args.name)
Пример #2
0
def resnet_e(args, input_shape, num_classes, input_tensor=None, include_top=True):
    input = utils.get_input_layer(input_shape, input_tensor)

    if input_shape[0] and input_shape[0] < 50:
        x = keras.layers.Conv2D(
            args.initial_filters,
            kernel_size=3,
            padding="same",
            kernel_initializer="he_normal",
            use_bias=False,
        )(input)
    else:
        x = keras.layers.Conv2D(
            args.initial_filters,
            kernel_size=7,
            strides=2,
            padding="same",
            kernel_initializer="he_normal",
            use_bias=False,
        )(input)

        x = keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)
        x = keras.layers.Activation("relu")(x)
        x = keras.layers.MaxPool2D(3, strides=2, padding="same")(x)
        x = keras.layers.BatchNormalization(momentum=0.9, epsilon=1e-5)(x)

    for block, (layers, filters) in enumerate(zip(*args.spec)):
        # this tricks adds shortcut connections between original resnet blocks
        # we multiple number of blocks by 2, but add only one layer instead of two in each block
        for layer in range(layers * 2):
            strides = 1 if block == 0 or layer != 0 else 2
            x = residual_block(x, args, filters, strides=strides)

    if include_top:
        x = keras.layers.Activation("relu")(x)
        x = keras.layers.GlobalAvgPool2D()(x)
        x = keras.layers.Dense(
            num_classes, activation="softmax", kernel_initializer="glorot_normal"
        )(x)
    return keras.Model(inputs=input, outputs=x, name=args.name)
Пример #3
0
def binary_alexnet(hparams,
                   input_shape,
                   num_classes,
                   input_tensor=None,
                   include_top=True):
    """
    Implementation of ["Binarized Neural Networks"](https://papers.nips.cc/paper/6573-binarized-neural-networks)
    by Hubara et al., NIPS, 2016.
    """
    kwhparams = dict(
        input_quantizer="ste_sign",
        kernel_quantizer="ste_sign",
        kernel_constraint="weight_clip",
        use_bias=False,
    )

    def conv_block(
        x,
        features,
        kernel_size,
        strides=1,
        pool=False,
        first_layer=False,
        no_inflation=False,
    ):
        x = lq.layers.QuantConv2D(
            features * (1 if no_inflation else hparams.inflation_ratio),
            kernel_size=kernel_size,
            strides=strides,
            padding="same",
            input_quantizer=None if first_layer else "ste_sign",
            kernel_quantizer="ste_sign",
            kernel_constraint="weight_clip",
            use_bias=False,
        )(x)
        if pool:
            x = tf.keras.layers.MaxPool2D(pool_size=3, strides=2)(x)
        x = tf.keras.layers.BatchNormalization(scale=False, momentum=0.9)(x)
        return x

    def dense_block(x, units):
        x = lq.layers.QuantDense(units, **kwhparams)(x)
        x = tf.keras.layers.BatchNormalization(scale=False, momentum=0.9)(x)
        return x

    # get input
    img_input = utils.get_input_layer(input_shape, input_tensor)

    # feature extractor
    out = conv_block(img_input,
                     features=64,
                     kernel_size=11,
                     strides=4,
                     pool=True,
                     first_layer=True)
    out = conv_block(out, features=192, kernel_size=5, pool=True)
    out = conv_block(out, features=384, kernel_size=3)
    out = conv_block(out, features=384, kernel_size=3)
    out = conv_block(out,
                     features=256,
                     kernel_size=3,
                     pool=True,
                     no_inflation=True)

    # classifier
    if include_top:
        out = tf.keras.layers.Flatten()(out)
        out = dense_block(out, units=4096)
        out = dense_block(out, units=4096)
        out = dense_block(out, num_classes)
        out = tf.keras.layers.Activation("softmax")(out)

    return tf.keras.Model(inputs=img_input, outputs=out, name="binary_alexnet")
Пример #4
0
def dorefa_net(hparams,
               input_shape,
               num_classes,
               input_tensor=None,
               include_top=True):
    def conv_block(x,
                   filters,
                   kernel_size,
                   strides=1,
                   pool=False,
                   pool_padding="same"):
        x = lq.layers.QuantConv2D(
            filters,
            kernel_size=kernel_size,
            strides=strides,
            padding="same",
            input_quantizer=hparams.input_quantizer,
            kernel_quantizer=hparams.kernel_quantizer,
            kernel_constraint=None,
            use_bias=False,
        )(x)
        x = tf.keras.layers.BatchNormalization(scale=False,
                                               momentum=0.9,
                                               epsilon=1e-4)(x)
        if pool:
            x = tf.keras.layers.MaxPool2D(pool_size=3,
                                          strides=2,
                                          padding=pool_padding)(x)
        return x

    def fully_connected_block(x, units):
        x = lq.layers.QuantDense(
            units,
            input_quantizer=hparams.input_quantizer,
            kernel_quantizer=hparams.kernel_quantizer,
            kernel_constraint=None,
            use_bias=False,
        )(x)
        x = tf.keras.layers.BatchNormalization(scale=False,
                                               momentum=0.9,
                                               epsilon=1e-4)(x)
        return x

    # get input
    img_input = utils.get_input_layer(input_shape, input_tensor)

    # feature extractor
    out = tf.keras.layers.Conv2D(96,
                                 kernel_size=12,
                                 strides=4,
                                 padding="valid",
                                 use_bias=True)(img_input)
    out = conv_block(out, filters=256, kernel_size=5, pool=True)
    out = conv_block(out, filters=384, kernel_size=3, pool=True)
    out = conv_block(out, filters=384, kernel_size=3)
    out = conv_block(out,
                     filters=256,
                     kernel_size=3,
                     pool_padding="valid",
                     pool=True)

    # classifier
    if include_top:
        out = tf.keras.layers.Flatten()(out)
        out = fully_connected_block(out, units=4096)
        out = fully_connected_block(out, units=4096)
        out = tf.keras.layers.Activation("clip_by_value_activation")(out)
        out = tf.keras.layers.Dense(num_classes, use_bias=True)(out)
        out = tf.keras.layers.Activation("softmax")(out)

    return tf.keras.Model(inputs=img_input, outputs=out, name="dorefanet")
Пример #5
0
def birealnet(args, input_shape, num_classes, input_tensor=None, include_top=True):
    def residual_block(x, double_filters=False, filters=None):
        assert not (double_filters and filters)

        # compute dimensions
        in_filters = x.get_shape().as_list()[-1]
        out_filters = filters or in_filters if not double_filters else 2 * in_filters

        shortcut = x
        if in_filters != out_filters:
            shortcut = tf.keras.layers.AvgPool2D(2, strides=2, padding="same")(shortcut)
            shortcut = tf.keras.layers.Conv2D(
                out_filters,
                1,
                kernel_initializer=args.kernel_initializer,
                use_bias=False,
            )(shortcut)
            shortcut = tf.keras.layers.BatchNormalization(momentum=0.8)(shortcut)

        x = lq.layers.QuantConv2D(
            out_filters,
            3,
            strides=1 if out_filters == in_filters else 2,
            padding="same",
            input_quantizer=args.input_quantizer,
            kernel_quantizer=args.kernel_quantizer,
            kernel_initializer=args.kernel_initializer,
            kernel_constraint=args.kernel_constraint,
            use_bias=False,
        )(x)
        x = tf.keras.layers.BatchNormalization(momentum=0.8)(x)
        return tf.keras.layers.add([x, shortcut])

    img_input = utils.get_input_layer(input_shape, input_tensor)

    # layer 1
    out = tf.keras.layers.Conv2D(
        args.filters,
        7,
        strides=2,
        kernel_initializer=args.kernel_initializer,
        padding="same",
        use_bias=False,
    )(img_input)
    out = tf.keras.layers.BatchNormalization(momentum=0.8)(out)
    out = tf.keras.layers.MaxPool2D(3, strides=2, padding="same")(out)

    # layer 2
    out = residual_block(out, filters=args.filters)

    # layer 3 - 5
    for _ in range(3):
        out = residual_block(out)

    # layer 6 - 17
    for _ in range(3):
        out = residual_block(out, double_filters=True)
        for _ in range(3):
            out = residual_block(out)

    # layer 18
    if include_top:
        out = tf.keras.layers.GlobalAvgPool2D()(out)
        out = tf.keras.layers.Dense(num_classes, activation="softmax")(out)

    return tf.keras.Model(inputs=img_input, outputs=out, name="birealnet18")
Пример #6
0
def xnornet(hparams,
            input_shape,
            num_classes,
            input_tensor=None,
            include_top=True):
    kwargs = dict(
        kernel_quantizer=hparams.kernel_quantizer,
        input_quantizer=hparams.input_quantizer,
        kernel_constraint=hparams.kernel_constraint,
        use_bias=hparams.use_bias,
        kernel_regularizer=hparams.kernel_regularizer,
    )
    img_input = utils.get_input_layer(input_shape, input_tensor)

    x = tf.keras.layers.Conv2D(
        96,
        (11, 11),
        strides=(4, 4),
        padding="same",
        use_bias=hparams.use_bias,
        input_shape=input_shape,
        kernel_regularizer=hparams.kernel_regularizer,
    )(img_input)

    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-5)(x)
    x = tf.keras.layers.Activation("relu")(x)
    x = tf.keras.layers.MaxPool2D(pool_size=(3, 3), strides=(2, 2))(x)
    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-4)(x)
    x = lq.layers.QuantConv2D(256, (5, 5), padding="same", **kwargs)(x)
    x = tf.keras.layers.MaxPool2D(pool_size=(3, 3), strides=(2, 2))(x)
    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-4)(x)
    x = lq.layers.QuantConv2D(384, (3, 3), padding="same", **kwargs)(x)
    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-4)(x)
    x = lq.layers.QuantConv2D(384, (3, 3), padding="same", **kwargs)(x)
    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-4)(x)
    x = lq.layers.QuantConv2D(256, (3, 3), padding="same", **kwargs)(x)
    x = tf.keras.layers.MaxPool2D(pool_size=(3, 3), strides=(2, 2))(x)
    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-4)(x)
    x = lq.layers.QuantConv2D(4096, (6, 6), padding="valid", **kwargs)(x)
    x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                           scale=hparams.bn_scale,
                                           epsilon=1e-4)(x)

    if include_top:
        # Equivilent to a dense layer
        x = lq.layers.QuantConv2D(4096, (1, 1),
                                  strides=(1, 1),
                                  padding="valid",
                                  **kwargs)(x)
        x = tf.keras.layers.BatchNormalization(momentum=hparams.bn_momentum,
                                               scale=hparams.bn_scale,
                                               epsilon=1e-3)(x)
        x = tf.keras.layers.Activation("relu")(x)
        x = tf.keras.layers.Flatten()(x)
        x = tf.keras.layers.Dense(
            num_classes,
            use_bias=False,
            kernel_regularizer=hparams.kernel_regularizer)(x)
        x = tf.keras.layers.Activation("softmax")(x)

    # Ensure that the model takes into account
    # any potential predecessors of `input_tensor`.
    if input_tensor is not None:
        inputs = tf.keras.utils.get_source_inputs(input_tensor)
    else:
        inputs = img_input

    return tf.keras.models.Model(inputs, x, name="xnornet")