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)
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)