def graph(param, step=None, name=None): """Writes a TensorFlow graph to the summary interface. The graph summary is, strictly speaking, not a summary. Conditions like `tf.summary.should_record_summaries` do not apply. Only a single graph can be associated with a particular run. If multiple graphs are written, then only the last one will be considered by TensorBoard. When not using eager execution mode, the user should consider passing the `graph` parameter to `tf.compat.v1.summary.initialize` instead of calling this function. Otherwise special care needs to be taken when using the graph to record the graph. Args: param: A `tf.Tensor` containing a serialized graph proto. When eager execution is enabled, this function will automatically coerce `tf.Graph`, `tf.compat.v1.GraphDef`, and string types. step: The global step variable. This doesn't have useful semantics for graph summaries, but is used anyway, due to the structure of event log files. This defaults to the global step. name: A name for the operation (optional). Returns: The created `tf.Operation` or a `tf.no_op` if summary writing has not been enabled for this context. Raises: TypeError: If `param` isn't already a `tf.Tensor` in graph mode. """ if not context.executing_eagerly() and not isinstance(param, ops.Tensor): raise TypeError( "graph() needs a tf.Tensor (e.g. tf.placeholder) in graph " "mode, but was: %s" % type(param)) writer = _summary_state.writer if writer is None: return control_flow_ops.no_op() with ops.device("cpu:0"): if isinstance(param, (ops.Graph, graph_pb2.GraphDef)): tensor = ops.convert_to_tensor(_serialize_graph(param), dtypes.string) else: tensor = array_ops.identity(param) return gen_summary_ops.write_graph_summary(writer._resource, _choose_step(step), tensor, name=name) # pylint: disable=protected-access
def graph(param, step=None, name=None): """Writes a TensorFlow graph to the summary interface. The graph summary is, strictly speaking, not a summary. Conditions like `tf.summary.should_record_summaries` do not apply. Only a single graph can be associated with a particular run. If multiple graphs are written, then only the last one will be considered by TensorBoard. When not using eager execution mode, the user should consider passing the `graph` parameter to `tf.contrib.summary.initialize` instead of calling this function. Otherwise special care needs to be taken when using the graph to record the graph. Args: param: A `tf.Tensor` containing a serialized graph proto. When eager execution is enabled, this function will automatically coerce `tf.Graph`, `tf.GraphDef`, and string types. step: The global step variable. This doesn't have useful semantics for graph summaries, but is used anyway, due to the structure of event log files. This defaults to the global step. name: A name for the operation (optional). Returns: The created `tf.Operation` or a `tf.no_op` if summary writing has not been enabled for this context. Raises: TypeError: If `param` isn't already a `tf.Tensor` in graph mode. """ if not context.executing_eagerly() and not isinstance(param, ops.Tensor): raise TypeError("graph() needs a tf.Tensor (e.g. tf.placeholder) in graph " "mode, but was: %s" % type(param)) writer = context.context().summary_writer_resource if writer is None: return control_flow_ops.no_op() with ops.device("cpu:0"): if isinstance(param, (ops.Graph, graph_pb2.GraphDef)): tensor = ops.convert_to_tensor(_serialize_graph(param), dtypes.string) else: tensor = array_ops.identity(param) return gen_summary_ops.write_graph_summary( writer, _choose_step(step), tensor, name=name)
def graph(graph_data): """Writes a TensorFlow graph summary. Write an instance of `tf.Graph` or `tf.compat.v1.GraphDef` as summary only in an eager mode. Please prefer to use the trace APIs (`tf.summary.trace_on`, `tf.summary.trace_off`, and `tf.summary.trace_export`) when using `tf.function` which can automatically collect and record graphs from executions. Usage Example: ```py writer = tf.summary.create_file_writer("/tmp/mylogs") @tf.function def f(): x = constant_op.constant(2) y = constant_op.constant(3) return x**y with writer.as_default(): tf.summary.graph(f.get_concrete_function().graph) # Another example: in a very rare use case, when you are dealing with a TF v1 # graph. graph = tf.Graph() with graph.as_default(): c = tf.constant(30.0) with writer.as_default(): tf.summary.graph(graph) ``` Args: graph_data: The TensorFlow graph to write, as a `tf.Graph` or a `tf.compat.v1.GraphDef`. Returns: True on success, or False if no summary was written because no default summary writer was available. Raises: ValueError: `graph` summary API is invoked in a graph mode. """ if not context.executing_eagerly(): raise ValueError("graph() cannot be invoked inside a graph context.") writer = _summary_state.writer if writer is None: return constant_op.constant(False) with ops.device("cpu:0"): if not should_record_summaries(): return constant_op.constant(False) if isinstance(graph_data, (ops.Graph, graph_pb2.GraphDef)): tensor = ops.convert_to_tensor( _serialize_graph(graph_data), dtypes.string) else: raise ValueError("Argument 'graph_data' is not tf.Graph or " "tf.compat.v1.GraphDef. Received graph_data=" f"{graph_data} of type {type(graph_data).__name__}.") gen_summary_ops.write_graph_summary( writer._resource, # pylint: disable=protected-access # Graph does not have step. Set to 0. 0, tensor, ) return constant_op.constant(True)