def _infer_metadata_entries_from_model(self, signature_name): """Infers metadata inputs and outputs.""" loaded_sig = self._loaded_model.signatures[signature_name] _, input_sig = loaded_sig.structured_input_signature output_sig = loaded_sig.structured_outputs input_mds = {} for name, tensor_spec in input_sig.items(): if tensor_spec.dtype.is_floating: input_mds[name] = explain_metadata.InputMetadata(name, name) else: input_mds[name] = explain_metadata.InputMetadata( name, name, modality=explain_metadata.Modality.CATEGORICAL) if not self._explain_output and len(output_sig) > 1: raise ValueError( "Signature has multiple outputs. You must specify which" " output to explain via 'outputs_to_explain' parameter.") for name in output_sig: if not self._explain_output or self._explain_output[0] == name: output_mds = { name: explain_metadata.OutputMetadata(name, name) } break else: raise ValueError("Specified output name cannot be found in given" " signature outputs.") return input_mds, output_mds
def _create_output_metadata_from_signature( signature_outputs: Dict[str, tf.Tensor], output_to_explain: Optional[str] = None ) -> Dict[str, explain_metadata.OutputMetadata]: """Creates OutputMetadata from signature outputs.""" return {key: explain_metadata.OutputMetadata(key, tensor.name) for key, tensor in signature_outputs.items() if not output_to_explain or output_to_explain == key}
def _create_output_metadata(self, output_dict: Dict[Text, tf.Tensor]): """Creates and returns a list of OutputMetadata. Args: output_dict: Dictionary from tf.feature_columns to list of dense tensors. Returns: A list of OutputMetadata. """ return [explain_metadata.OutputMetadata(name, tensor.name) for name, tensor in output_dict.items()]
def add_output_metadata(self, output_tensor, name=None): """Adds output tensor as output metadata. Only one output metadata can be added. Args: output_tensor: Output tensors to get the explanations for. Needs to be a tensor of float type, such as probabilities, logits. name: Unique friendly name for the output. """ if self._outputs: raise ValueError('Only one output can be added.') output_name = name if name else output_tensor.op.name self._outputs[output_tensor.name] = explain_metadata.OutputMetadata( name=output_name, output_tensor_name=output_tensor.name)
def set_output_metadata(self, output_name, new_name): """Updates an existing output metadata identified by output_name. Args: output_name: Name of the output that needs to be updated. new_name: New (unique) friendly name for the output. Raises: ValueError: If output with the given name doesn't exist. """ if output_name not in self._outputs: raise ValueError("Output with name '%s' does not exist." % output_name) if output_name == new_name: return old_output = self._outputs.pop(output_name) self._outputs[new_name] = explain_metadata.OutputMetadata( new_name, old_output.output_tensor_name)