Beispiel #1
0
def get_drop_block_model():
    model = keras.models.Sequential()
    model.add(
        DropBlock2D(input_shape=(28, 28, 1),
                    block_size=7,
                    keep_prob=0.8,
                    name='Input-Dropout'))
    model.add(
        keras.layers.Conv2D(filters=64,
                            kernel_size=3,
                            activation='relu',
                            padding='same',
                            name='Conv-1'))
    model.add(keras.layers.MaxPool2D(pool_size=2, name='Pool-1'))
    model.add(DropBlock2D(block_size=5, keep_prob=0.8, name='Dropout-1'))
    model.add(
        keras.layers.Conv2D(filters=32,
                            kernel_size=3,
                            activation='relu',
                            padding='same',
                            name='Conv-2'))
    model.add(keras.layers.MaxPool2D(pool_size=2, name='Pool-2'))
    model.add(DropBlock2D(block_size=3, keep_prob=0.8, name='Dropout-2'))
    model.add(keras.layers.Flatten(name='Flatten'))
    model.add(keras.layers.Dense(units=256, activation='relu', name='Dense'))
    model.add(keras.layers.Dropout(rate=0.2, name='Dense-Dropout'))
    model.add(
        keras.layers.Dense(units=10, activation='softmax', name='Softmax'))
    model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'],
    )
    return model
Beispiel #2
0
    def test_mask_shape(self):
        input_layer = keras.layers.Input(shape=(10, 10, 3))
        drop_block_layer = DropBlock2D(block_size=3,
                                       keep_prob=0.7)(input_layer,
                                                      training=True)
        model = keras.models.Model(inputs=input_layer,
                                   outputs=drop_block_layer)
        model.compile(optimizer='adam', loss='mse', metrics={})
        model_path = os.path.join(tempfile.gettempdir(),
                                  'keras_drop_block_%f.h5' % random.random())
        model.save(model_path)
        model = keras.models.load_model(
            model_path,
            custom_objects={'DropBlock2D': DropBlock2D},
        )
        model.summary()
        inputs = np.ones((1, 10, 10, 3))
        outputs = model.predict(inputs)
        for i in range(3):
            print((outputs[0, :, :, i] > 0.0).astype(dtype='int32'))
        inputs = np.ones((1000, 10, 10, 3))
        outputs = model.predict(inputs)
        keep_prob = 1.0 * np.sum(outputs > 0.0) / np.prod(np.shape(outputs))
        print(keep_prob)
        self.assertTrue(0.65 < keep_prob < 0.8, keep_prob)

        input_layer = keras.layers.Input(shape=(3, 10, 10))
        drop_block_layer = DropBlock2D(block_size=3,
                                       keep_prob=0.7,
                                       data_format='channels_first')(
                                           input_layer, training=True)
        model = keras.models.Model(inputs=input_layer,
                                   outputs=drop_block_layer)
        model.compile(optimizer='adam', loss='mse', metrics={})
        model_path = os.path.join(tempfile.gettempdir(),
                                  'keras_drop_block_%f.h5' % random.random())
        model.save(model_path)
        model = keras.models.load_model(
            model_path,
            custom_objects={'DropBlock2D': DropBlock2D},
        )
        model.summary()
        inputs = np.ones((1, 3, 10, 10))
        outputs = model.predict(inputs)
        for i in range(3):
            print((outputs[0, i, :, :] > 0.0).astype(dtype='int32'))
        inputs = np.ones((1000, 3, 10, 10))
        outputs = model.predict(inputs)
        keep_prob = 1.0 * np.sum(outputs > 0.0) / np.prod(np.shape(outputs))
        print(keep_prob)
        self.assertTrue(0.65 < keep_prob < 0.8, keep_prob)
 def test_sync_channels(self):
     input_layer = keras.layers.Input(shape=(10, 10, 3))
     drop_block_layer = keras.layers.Lambda(
         lambda x: DropBlock2D(
             block_size=3, keep_prob=0.7, sync_channels=True)
         (x, training=True), )(input_layer)
     model = keras.models.Model(inputs=input_layer,
                                outputs=drop_block_layer)
     model.compile(optimizer='adam', loss='mse', metrics={})
     model_path = os.path.join(tempfile.gettempdir(),
                               'keras_drop_block_%f.h5' % random.random())
     model.save(model_path)
     model = keras.models.load_model(
         model_path,
         custom_objects={'DropBlock2D': DropBlock2D},
     )
     model.summary()
     inputs = np.ones((1, 10, 10, 3))
     outputs = model.predict(inputs)
     for i in range(1, 3):
         self.assertTrue(
             np.allclose(outputs[0, :, :, 0], outputs[0, :, :, i]))
     inputs = np.ones((1000, 10, 10, 3))
     outputs = model.predict(inputs)
     keep_prob = 1.0 * np.sum(outputs > 0.0) / np.prod(np.shape(outputs))
     self.assertTrue(0.6 < keep_prob < 0.8, keep_prob)
Beispiel #4
0
    def decoder(self, features=[8], name="decoder") -> KM.Model:
        """Creates a decoder model object

        Args:
            features (list, optional): list of features in successive hidden layers. Defaults to [8].
            name (str, optional): name for the model object. Defaults to "decoder".

        Returns:
            KM.Model: Decoder model
        """
        input_tensor = KL.Input(shape=(2, 2, features[0]))

        decoded = input_tensor

        for i, feature_num in enumerate(features[1:], start=1):
            decoded = deconv_block(decoded, feature_num,
                                   name + f"_deconv_{len(features)-i}")

        # Final reconstruction back to the original image size
        decoded = KL.Conv2DTranspose(
            3,
            (4, 4),
            strides=(2, 2),
            padding="same",
            kernel_initializer="he_normal",
            use_bias=True,
            activation="tanh",
            name=name + f"_out",
        )(decoded)
        decoded = DropBlock2D(block_size=5, keep_prob=0.8)(decoded)
        return KM.Model(inputs=input_tensor, outputs=decoded, name=name)
Beispiel #5
0
    def test_training(self):
        input_layer = keras.layers.Input(shape=(10, 10, 3))
        drop_block_layer = DropBlock2D(block_size=3,
                                       keep_prob=0.7)(input_layer)
        model = keras.models.Model(inputs=input_layer,
                                   outputs=drop_block_layer)
        model.compile(optimizer='adam', loss='mse', metrics={})
        model_path = os.path.join(tempfile.gettempdir(),
                                  'keras_drop_block_%f.h5' % random.random())
        model.save(model_path)
        model = keras.models.load_model(
            model_path,
            custom_objects={'DropBlock2D': DropBlock2D},
        )
        model.summary()
        inputs = np.ones((1, 10, 10, 3))
        outputs = model.predict(inputs)
        self.assertTrue(np.allclose(inputs, outputs))

        input_layer = keras.layers.Input(shape=(3, 10, 10))
        drop_block_layer = DropBlock2D(
            block_size=3, keep_prob=0.7,
            data_format='channels_first')(input_layer)
        model = keras.models.Model(inputs=input_layer,
                                   outputs=drop_block_layer)
        model.compile(optimizer='adam', loss='mse', metrics={})
        model_path = os.path.join(tempfile.gettempdir(),
                                  'keras_drop_block_%f.h5' % random.random())
        model.save(model_path)
        model = keras.models.load_model(
            model_path,
            custom_objects={'DropBlock2D': DropBlock2D},
        )
        model.summary()
        inputs = np.ones((1, 3, 10, 10))
        outputs = model.predict(inputs)
        self.assertTrue(np.allclose(inputs, outputs))
y_train, y_test = np.expand_dims(y_train, axis=-1), np.expand_dims(y_test, axis=-1)

train_num = round(x_train.shape[0])
x_train, x_valid = x_train[:train_num, ...], x_train[train_num:, ...]
y_train, y_valid = y_train[:train_num, ...], y_train[train_num:, ...] 

# Design the model
model = Sequential()
model.add(ZeroPadding2D(input_shape=(28, 28, 1), name='Input'))

model.add(Conv2D(filters=32, strides=(1, 1), kernel_size=3, activation='relu', padding='same', name='Conv-1'))
model.add(BatchNormalization())
model.add(Conv2D(filters=32, strides=(1, 1), kernel_size=3, activation='relu', padding='same', name='Conv-2'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=2, name='Pool-1'))
model.add(DropBlock2D(block_size=7, keep_prob=0.8, name='Dropout-1'))

model.add(Conv2D(filters=64, strides=(1, 1), kernel_size=3, activation='relu', padding='same', name='Conv-3'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=2, name='Pool-2'))
model.add(DropBlock2D(block_size=7, keep_prob=0.8, name='Dropout-2'))

model.add(Conv2D(filters=64, strides=(1, 1), kernel_size=3, activation='relu', padding='same', name='Conv-4'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=2, name='Pool-3'))
model.add(DropBlock2D(block_size=7, keep_prob=0.8, name='Dropout-3'))

model.add(Conv2D(filters=128, strides=(1, 1), kernel_size=3, activation='relu', padding='same', name='Conv-5'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=2, name='Pool-4'))
model.add(DropBlock2D(block_size=7, keep_prob=0.8, name='Dropout-4'))
Beispiel #7
0
x_train, x_test, y_train, y_test = train_test_split(data,
                                                    labels,
                                                    test_size=0.3)

base_model = VGG16(weights='imagenet',
                   include_top=False,
                   input_shape=(32, 32, 3),
                   pooling='avg')

b2 = Model(inputs=base_model.input,
           outputs=base_model.get_layer('block3_pool').output)
fc1 = b2.layers[-3]
fc2 = b2.layers[-2]
predictions = b2.layers[-1]

dropout1 = DropBlock2D(block_size=3, keep_prob=0.8)
dropout2 = DropBlock2D(block_size=3, keep_prob=0.8)

x = dropout1(fc1.output)
x = fc2(x)
x = dropout2(x)
x = predictions(x)
x = Flatten()(x)
vgg_conv = Model(inputs=base_model.input, outputs=x)

for layer in vgg_conv.layers:
    layer.trainable = False
vgg_conv.layers[-3].trainable = True
vgg_conv.layers[-4].trainable = True
vgg_conv.layers[-5].trainable = True
vgg_conv.summary()
def identity_block(X, f, filters, stage, block):

    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    # Retrieve Filters
    F1, F2, F3 = filters

    # Save the input value. You'll need this later to add back to the main path.
    X_shortcut = X
    if stage == 4:
        dilation = 2

    elif stage == 5:
        if block == 'b' or block == 'c':
            dilation = 4
        elif block == 'd':
            dilation = 2
        else:
            dilation = 1
    else:
        dilation = 1
    # First component of main path
    X = AtrousConvolution2D(filters=F1,
                            kernel_size=(1, 1),
                            strides=(1, 1),
                            padding='valid',
                            name=conv_name_base + '2a',
                            kernel_initializer=glorot_uniform(seed=0))(X)
    if stage == 4 or stage == 5:
        X = DropBlock2D(block_size=7, keep_prob=0.9)(X)
    X = BatchNormalization(axis=3, name=bn_name_base + '2a')(X)
    X = Activation('relu')(X)

    # Second component of main path (≈3 lines)
    X = AtrousConvolution2D(filters=F2,
                            kernel_size=(f, f),
                            atrous_rate=(dilation, dilation),
                            padding='same',
                            name=conv_name_base + '2b',
                            kernel_initializer=glorot_uniform(seed=0))(X)
    if stage == 4 or stage == 5:
        X = DropBlock2D(block_size=7, keep_prob=0.9)(X)
    X = BatchNormalization(axis=3, name=bn_name_base + '2b')(X)
    X = Activation('relu')(X)

    # Third component of main path (≈2 lines)
    X = AtrousConvolution2D(filters=F3,
                            kernel_size=(1, 1),
                            strides=(1, 1),
                            padding='valid',
                            name=conv_name_base + '2c',
                            kernel_initializer=glorot_uniform(seed=0))(X)
    if stage == 4 or stage == 5:
        X = DropBlock2D(block_size=7, keep_prob=0.9)(X)
    X = BatchNormalization(axis=3, name=bn_name_base + '2c')(X)

    if stage == 5:
        if block == 'e':
            X = Add()([X, X_shortcut])
            X = Activation('relu')(X)
        else:
            X = Activation('relu')(X)
    return X
def convolutional_block(X, f, filters, stage, block, s=2):

    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    # Retrieve Filters
    F1, F2, F3 = filters

    # Save the input value
    X_shortcut = X
    if stage == 4 or stage == 5:
        dilation = 2
    else:
        dilation = 1
    ##### MAIN PATH #####
    # First component of main path
    X = AtrousConvolution2D(F1, (1, 1),
                            strides=(s, s),
                            name=conv_name_base + '2a',
                            kernel_initializer=glorot_uniform(seed=0))(X)
    if stage == 4 or stage == 5:
        X = DropBlock2D(block_size=7, keep_prob=0.9)(X)
    X = BatchNormalization(axis=3, name=bn_name_base + '2a')(X)
    X = Activation('relu')(X)

    # Second component of main path (≈3 lines)
    X = AtrousConvolution2D(filters=F2,
                            kernel_size=(f, f),
                            atrous_rate=(dilation, dilation),
                            padding='same',
                            name=conv_name_base + '2b',
                            kernel_initializer=glorot_uniform(seed=0))(X)
    if stage == 4 or stage == 5:
        X = DropBlock2D(block_size=7, keep_prob=0.9)(X)
    X = BatchNormalization(axis=3, name=bn_name_base + '2b')(X)
    X = Activation('relu')(X)

    # Third component of main path (≈2 lines)
    X = AtrousConvolution2D(filters=F3,
                            kernel_size=(1, 1),
                            strides=(1, 1),
                            padding='valid',
                            name=conv_name_base + '2c',
                            kernel_initializer=glorot_uniform(seed=0))(X)
    if stage == 4 or stage == 5:
        X = DropBlock2D(block_size=7, keep_prob=0.9)(X)
    X = BatchNormalization(axis=3, name=bn_name_base + '2c')(X)

    ##### SHORTCUT PATH #### (≈2 lines)
    X_shortcut = AtrousConvolution2D(
        filters=F3,
        kernel_size=(1, 1),
        strides=(s, s),
        padding='valid',
        name=conv_name_base + '1',
        kernel_initializer=glorot_uniform(seed=0))(X_shortcut)
    if stage == 4 or stage == 5:
        X_shortcut = DropBlock2D(block_size=7, keep_prob=0.9)(X_shortcut)
    X_shortcut = BatchNormalization(axis=3,
                                    name=bn_name_base + '1')(X_shortcut)

    # Final step: Add shortcut value to main path, and pass it through a RELU activation (≈2 lines)
    X = Add()([X, X_shortcut])
    X = Activation('relu')(X)

    return X