def generate_conv_model(model):

    model = model.get_layer(index=1)

    inp = (model.inputs[0].shape.dims[1].value,
           model.inputs[0].shape.dims[2].value,
           model.inputs[0].shape.dims[3].value)

    H = Input(inp)
    inp = H

    for layer_idx in range(1, len(model.layers)):

        layer = model.get_layer(index=layer_idx)
        config = layer.get_config()

        if isinstance(layer, MaxPooling2D):
            H = MaxPooling2D.from_config(config)(H)

        if isinstance(layer, Dropout):
            H = Dropout.from_config(config)(H)

        if isinstance(layer, Activation):
            H = Activation.from_config(config)(H)

        if isinstance(layer, BatchNormalization):
            weights = layer.get_weights()
            H = BatchNormalization(weights=weights)(H)

        elif isinstance(layer, Conv2D):
            weights = layer.get_weights()

            config['filters'] = weights[1].shape[0]
            H = Conv2D(activation=config['activation'],
                       activity_regularizer=config['activity_regularizer'],
                       bias_constraint=config['bias_constraint'],
                       bias_regularizer=config['bias_regularizer'],
                       data_format=config['data_format'],
                       dilation_rate=config['dilation_rate'],
                       filters=config['filters'],
                       kernel_constraint=config['kernel_constraint'],
                       kernel_regularizer=config['kernel_regularizer'],
                       kernel_size=config['kernel_size'],
                       name=config['name'],
                       padding=config['padding'],
                       strides=config['strides'],
                       trainable=config['trainable'],
                       use_bias=config['use_bias'],
                       weights=weights)(H)

    return Model(inp, H)
Beispiel #2
0
    def rebuild_model(self, kernel_list=None):
        ## args

        ##  list of kernels to remove.

        inp = (self.model.inputs[0].shape.dims[1].value,
               self.model.inputs[0].shape.dims[2].value,
               self.model.inputs[0].shape.dims[3].value)

        H = Input(inp)
        inp = H

        for i in range(len(self.model.layers)):
            layer = self.model.get_layer(index=i)
            config = layer.get_config()

            if isinstance(layer, MaxPooling2D):
                H = MaxPooling2D.from_config(config)(H)

            if isinstance(layer, Dropout):
                H = Dropout.from_config(config)(H)

            if isinstance(layer, Activation):
                H = Activation.from_config(config)(H)
            elif isinstance(layer, Conv2D):
                weights = layer.get_weights()

                if i == self.target_layer:
                    weights[0] = np.delete(weights[0], kernel_list, axis=3)
                    if (len(weights) == 2):
                        weights[1] = np.delete(weights[1], kernel_list, 0)
                else:
                    if i == self.changed_layer:
                        weights[0] = np.delete(weights[0], kernel_list, axis=2)

                config['filters'] = weights[0].shape[3]

                H = Conv2D(
                    activation=config['activation'],
                    activity_regularizer=config['activity_regularizer'],
                    bias_constraint=config['bias_constraint'],
                    bias_regularizer=config['bias_regularizer'],
                    data_format=config['data_format'],
                    dilation_rate=config['dilation_rate'],
                    filters=config['filters'],
                    kernel_constraint=config['kernel_constraint'],
                    # config=config['config'],
                    # scale=config['scale'],
                    kernel_regularizer=config['kernel_regularizer'],
                    kernel_size=config['kernel_size'],
                    name=config['name'],
                    padding=config['padding'],
                    strides=config['strides'],
                    trainable=config['trainable'],
                    use_bias=config['use_bias'],
                    weights=weights)(H)

            elif isinstance(layer, Flatten):
                H = Flatten()(H)

            elif isinstance(layer, Dense):
                weights = layer.get_weights()
                if i == self.changed_layer:

                    shape = self.model.layers[i - 1].input_shape
                    new_weights = np.zeros(
                        (shape[1] * shape[2] * (shape[3] - len(kernel_list)),
                         weights[0].shape[1]))

                    for j in range(weights[0].shape[1]):
                        new_weights[:, j] = np.delete(
                            weights[0][:, j].reshape(
                                (shape[1], shape[2], shape[3])), kernel_list,
                            2).reshape(-1)
                    weights[0] = new_weights
                    config['units'] = weights[0].shape[1]
                H = Dense(units=config['units'],
                          activation=config['activation'],
                          activity_regularizer=config['activity_regularizer'],
                          bias_constraint=config['bias_constraint'],
                          bias_regularizer=config['bias_regularizer'],
                          kernel_constraint=config['kernel_constraint'],
                          kernel_regularizer=config['kernel_regularizer'],
                          name=config['name'],
                          trainable=config['trainable'],
                          use_bias=config['use_bias'],
                          weights=weights)(H)

        ## it returns the model changed
        return Model(inp, H)
def rebuild_net(model=None, layer_filters=[]):
    n_discarded_filters = 0
    total_filters = 0
    model = model
    inp = (model.inputs[0].shape.dims[1].value,
           model.inputs[0].shape.dims[2].value,
           model.inputs[0].shape.dims[3].value)

    H = Input(inp)
    inp = H
    idx_previous = []

    for i in range(1, len(model.layers)):

        layer = model.get_layer(index=i)
        config = layer.get_config()

        if isinstance(layer, MaxPooling2D):
            H = MaxPooling2D.from_config(config)(H)

        if isinstance(layer, Dropout):
            H = Dropout.from_config(config)(H)

        if isinstance(layer, Activation):
            H = Activation.from_config(config)(H)

        if isinstance(layer, BatchNormalization):
            weights = layer.get_weights()
            weights[0] = np.delete(weights[0], idx_previous)
            weights[1] = np.delete(weights[1], idx_previous)
            weights[2] = np.delete(weights[2], idx_previous)
            weights[3] = np.delete(weights[3], idx_previous)
            H = BatchNormalization(weights=weights)(H)

        elif isinstance(layer, Conv2D):
            weights = layer.get_weights()

            n_filters = weights[0].shape[3]
            total_filters = total_filters + n_filters

            idxs = [item for item in layer_filters if item[0] == i][0][1]

            weights[0] = np.delete(weights[0], idxs, axis=3)
            weights[1] = np.delete(weights[1], idxs)
            n_discarded_filters += len(idxs)
            if len(idx_previous) != 0:
                weights[0] = np.delete(weights[0], idx_previous, axis=2)

            config['filters'] = weights[1].shape[0]
            H = Conv2D(
                activation=config['activation'],
                activity_regularizer=config['activity_regularizer'],
                bias_constraint=config['bias_constraint'],
                bias_regularizer=config['bias_regularizer'],
                data_format=config['data_format'],
                dilation_rate=config['dilation_rate'],
                filters=config['filters'],
                kernel_constraint=config['kernel_constraint'],
                # config=config['config'],
                # scale=config['scale'],
                kernel_regularizer=config['kernel_regularizer'],
                kernel_size=config['kernel_size'],
                name=config['name'],
                padding=config['padding'],
                strides=config['strides'],
                trainable=config['trainable'],
                use_bias=config['use_bias'],
                weights=weights)(H)

        idx_previous = idxs
    print('Percentage of discarded filters {}'.format(n_discarded_filters /
                                                      float(total_filters)))
    return Model(inp, H)