Beispiel #1
0
def timer(model):
    result = ''
    for i, layer in enumerate(model.layers):
        layer_name = layer.__class__.__name__
        if layer_name == 'InputLayer' or layer_name == 'Flatten' \
                or layer_name == 'MaxPooling3D' or layer_name == 'Activation' \
                or layer_name == 'MaxPooling2D' or layer_name == 'ZeroPadding2D' \
                or layer_name == 'Add' or layer_name == 'AveragePooling2D' \
                or layer_name == 'GlobalAveragePooling2D' or layer_name == 'Lambda'\
                or layer_name == 'Concatenate':
            continue

        # Because we split some of Convolution layers, which has multiple inputs
        # cannot use normal method for getting int_shape.
        try:
            shape = layer.input_shape
        except Exception:
            shape = layer.get_input_shape_at(0)

        assert not isinstance(shape[0], tuple), \
            '{:s} has bad input shape {:s}'.format(layer_name, str(layer.input_shape))

        input_shape = list(shape)[1:]
        data = np.random.random_sample(input_shape)
        input = InputLayer(input_shape)

        config = layer.get_config()

        if layer_name == 'Dense':
            _layer = Dense.from_config(config)
        elif layer_name == 'Conv3D':
            _layer = Conv3D.from_config(config)
        elif layer_name == 'Conv2D':
            _layer = Conv2D.from_config(config)
        elif layer_name == 'SeparableConv2D':
            _layer = SeparableConv2D.from_config(config)
        elif layer_name == 'DepthwiseConv2D':
            _layer = DepthwiseConv2D.from_config(config)
        else:
            raise Exception(layer_name, ' layer name not included')

        # Not the real model used for inference.
        _model = Sequential()
        _model.add(input)
        _model.add(_layer)

        # fake run because the model needs to be complied
        _model.predict(np.array([data]))

        start = time.time()
        for _ in range(50):
            _model.predict(np.array([data]))
        result += '{:>20s}: {:.3f} s\n'.format(layer.name,
                                               (time.time() - start) / 50)
    return result
Beispiel #2
0
def FCN_8s_pretrained(classes, in_shape, l2_reg, nopad=False, test=False):
    vgg16 = VGG16(include_top=False, weights="imagenet", input_shape=in_shape)
    inputs = Input(shape=in_shape)
    if nopad:
        x = inputs
    else:
        x = ZeroPadding2D(padding=(100, 100))(inputs)
    for layer in vgg16.layers[1:]:
        if "conv" in layer.name:
            W, b = layer.get_weights()
            config = layer.get_config()
            config["kernel_regularizer"] = l2(l2_reg)
            config["kernel_initializer"] = Constant(W)
            config["bias_initializer"] = Constant(b)
            conv = Conv2D.from_config(config)
            x = conv(x)
        elif "pool" in layer.name:
            x = MaxPooling2D()(x)

        if layer.name == "block3_pool":
            feat3 = x
        elif layer.name == "block4_pool":
            feat4 = x
    x = Conv2D(filters=4096,
               kernel_size=(7, 7),
               padding="valid",
               activation="relu",
               kernel_regularizer=l2(l2_reg),
               name="fc1")(x)
    x = Dropout(0.5)(x)
    x = Conv2D(filters=4096,
               kernel_size=(1, 1),
               padding="valid",
               activation="relu",
               kernel_regularizer=l2(l2_reg),
               name="fc2")(x)
    x = Dropout(0.5)(x)

    score5 = Conv2D(filters=classes,
                    kernel_size=(1, 1),
                    kernel_regularizer=l2(l2_reg),
                    activation="relu")(x)

    if nopad:
        score5 = Conv2DTranspose(filters=classes,
                                 kernel_size=(14, 14),
                                 strides=(1, 1),
                                 padding="valid",
                                 activation="linear",
                                 kernel_regularizer=l2(l2_reg),
                                 kernel_initializer=Constant(
                                     bilinear_upsample_weights(
                                         "full", classes)
                                 ))(score5)
    else:
        score5 = Conv2DTranspose(filters=classes,
                                 kernel_size=(4, 4),
                                 strides=(2, 2),
                                 padding="same",
                                 activation="linear",
                                 kernel_regularizer=l2(l2_reg),
                                 kernel_initializer=Constant(
                                     bilinear_upsample_weights(2, classes)
                                 ))(score5)

    # pool3 のfeature mapを次元圧縮
    score3 = Conv2D(filters=classes,
                    kernel_size=(1, 1),
                    kernel_regularizer=l2(l2_reg),
                    activation='relu')(feat3)
    # pool4のfeature mapを次元圧縮
    score4 = Conv2D(filters=classes,
                    kernel_size=(1, 1),
                    kernel_regularizer=l2(l2_reg),
                    activation="relu")(feat4)

    # merge p4 and p5
    score4 = CroppingLike2D(K.int_shape(score5))(score4)
    score45 = Add()([score4, score5])

    # p4+p5 を x2 upsampling
    if not nopad:
        score45 = ZeroPadding2D(padding=(1, 1))(score45)
    score45 = Conv2DTranspose(filters=classes,
                              kernel_size=(4, 4),
                              strides=(2, 2),
                              padding="same",
                              activation="linear",
                              kernel_regularizer=l2(l2_reg),
                              kernel_initializer=Constant(
                                  bilinear_upsample_weights(2, classes)
                              ))(score45)

    # p3とp45をmerge
    score3 = CroppingLike2D(K.int_shape(score45))(score3)
    score345 = Add()([score3, score45])

    # p3+p4+p5を x8 upsampling
    if not nopad:
        score345 = ZeroPadding2D(padding=(1, 1))(score345)
    x = Conv2DTranspose(filters=classes,
                        kernel_size=(16, 16),
                        strides=(8, 8),
                        padding="same",
                        activation="linear",
                        kernel_regularizer=l2(l2_reg),
                        kernel_initializer=Constant(
                            bilinear_upsample_weights(8, classes)
                        ))(score345)

    x = CroppingLike2D(K.int_shape(inputs))(x)
    if test:
        x = Activation("softmax")(x)
    model = Model(inputs=inputs, outputs=x)
    return model