def apply_to_model(self, model, reference_weights, percentage): initial_weights_vector = utils.weights_to_vector(reference_weights) current_weights_vector = utils.weights_to_vector( utils.get_model_weights(model)) diff_vector = np.abs(initial_weights_vector - current_weights_vector) mask_vector = self._ranker(diff_vector, percentage) last_idx = 0 layer_masks = [] reinitialized_layers = [] for layer in model.layers: if len(layer.get_weights()) > 0: kernel, bias = layer.get_weights()[0], layer.get_weights()[1] kernel_mask = mask_vector[last_idx:last_idx + kernel.size].reshape(kernel.shape) last_idx += kernel.size bias_mask = mask_vector[last_idx:last_idx + bias.size].reshape( bias.shape) last_idx += bias.size kernel_reinitialized = self._kernel_initializer(kernel.shape) bias_reinitialized = self._bias_initializer(bias.shape) new_kernel = np.copy(kernel) new_bias = np.copy(bias) new_kernel[kernel_mask] = kernel_reinitialized[kernel_mask] new_bias[bias_mask] = bias_reinitialized[bias_mask] layer.set_weights((new_kernel, new_bias)) layer_masks.append([kernel_mask, bias_mask]) reinitialized_layers.append( [kernel_reinitialized, bias_reinitialized]) else: layer_masks.append(None) reinitialized_layers.append(None) return layer_masks, reinitialized_layers
def apply_to_model(self, model, reference_weights, percentage): weights_vector = utils.weights_to_vector( utils.get_model_weights(model)) mask_vector = self._ranker(weights_vector, percentage) last_idx = 0 layer_masks = [] reinitialized_layers = [] for i in range(len(model.layers)): layer = model.layers[i] if len(layer.get_weights()) > 0: kernel, bias = layer.get_weights()[0], layer.get_weights()[1] kernel_mask = mask_vector[last_idx:last_idx + kernel.size].reshape(kernel.shape) last_idx += kernel.size bias_mask = mask_vector[last_idx:last_idx + bias.size].reshape( bias.shape) last_idx += bias.size kernel_reinitialized = self._kernel_initializer(kernel.shape) bias_reinitialized = self._bias_initializer(bias.shape) new_kernel = np.copy(reference_weights[i][0]) new_bias = np.copy(reference_weights[i][1]) new_kernel[kernel_mask] = kernel_reinitialized[kernel_mask] new_bias[bias_mask] = bias_reinitialized[bias_mask] layer.set_weights((new_kernel, new_bias)) layer_masks.append([kernel_mask, bias_mask]) reinitialized_layers.append( [kernel_reinitialized, bias_reinitialized]) else: layer_masks.append(None) reinitialized_layers.append(None)
def __init__(self, model, reinitializer, mask=None, percentage=None): super().__init__(model, reinitializer, mask, percentage) self._reference_weights = utils.get_model_weights(self._model)
def reinitialize(self, percentage=None): if percentage is None: percentage = self._percentage self._reinitializer.apply_to_model(self._model, self._reference_weights, percentage) self._reference_weights = utils.get_model_weights(self._model)