def operate(self): """Perform all jobs assigned to the surgeon. """ # Operate on each node in self.nodes by order of decreasing depth. sorted_nodes = sorted( self.nodes, reverse=True, key=lambda x: utils.get_node_depth(self.model, x)) for node in sorted_nodes: # Rebuild submodel up to this node sub_output_nodes = utils.get_node_inbound_nodes(node) outputs, output_masks = self._rebuild_graph( self.model.inputs, sub_output_nodes) # Perform surgery at this node kwargs = self._kwargs_map[node] self._mod_func_map[node](node, outputs, output_masks, **kwargs) # Finish rebuilding model output_nodes = [] for output in self.model.outputs: layer, node_index, tensor_index = output._keras_history output_nodes.append(get_inbound_nodes(layer)[node_index]) new_outputs, _ = self._rebuild_graph(self.model.inputs, output_nodes) new_model = self._model_cls(self.model.inputs, new_outputs) if self._copy: return utils.clean_copy(new_model, self._custom_objects) else: return new_model
def operate(self): """Perform all jobs assigned to the surgeon. """ # Operate on each node in self.nodes by order of decreasing depth. sorted_nodes = sorted( self.nodes, reverse=True, key=lambda x: utils.get_node_depth(self.model, x)) for node in sorted_nodes: # Rebuild submodel up to this node sub_output_nodes = utils.get__inbound_nodes(node) outputs, output_masks = self._rebuild_graph( self.model.inputs, sub_output_nodes) # Perform surgery at this node kwargs = self._kwargs_map[node] self._mod_func_map[node](node, outputs, output_masks, **kwargs) # Finish rebuilding model output_nodes = [ self.model.output_layers[i]._inbound_nodes[node_index] for i, node_index in enumerate(self.model.output_layers_node_indices) ] new_outputs, _ = self._rebuild_graph(self.model.inputs, output_nodes) new_model = Model(self.model.inputs, new_outputs) if self._copy: return utils.clean_copy(new_model) else: return new_model