# Copyright 2015 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """Utility functions for reading/writing graphs.""" import os import os.path import sys from google.protobuf import text_format from tensorflow.python.framework import byte_swap_tensor from tensorflow.python.framework import ops from tensorflow.python.lib.io import file_io from tensorflow.python.util.tf_export import tf_export @tf_export('io.write_graph', v1=['io.write_graph', 'train.write_graph']) def write_graph(graph_or_graph_def, logdir, name, as_text=True): """Writes a graph proto to a file. The graph is written as a text proto unless `as_text` is `False`. ```python v = tf.Variable(0, name='my_variable') sess = tf.compat.v1.Session() tf.io.write_graph(sess.graph_def, '/tmp/my-model', 'train.pbtxt') ``` or ```python v = tf.Variable(0, name='my_variable') sess = tf.compat.v1.Session() tf.io.write_graph(sess.graph, '/tmp/my-model', 'train.pbtxt') ``` Args: graph_or_graph_def: A `Graph` or a `GraphDef` protocol buffer. logdir: Directory where to write the graph. This can refer to remote filesystems, such as Google Cloud Storage (GCS). name: Filename for the graph. as_text: If `True`, writes the graph as an ASCII proto. Returns: The path of the output proto file. """ if isinstance(graph_or_graph_def, ops.Graph): graph_def = graph_or_graph_def.as_graph_def() else: graph_def = graph_or_graph_def if sys.byteorder == 'big': if hasattr(graph_def, 'node'): byte_swap_tensor.swap_tensor_content_in_graph_node( graph_def, 'big', 'little' ) else: byte_swap_tensor.swap_tensor_content_in_graph_function( graph_def, 'big', 'little' ) # gcs does not have the concept of directory at the moment. if not logdir.startswith('gs:'): file_io.recursive_create_dir(logdir) path = os.path.join(logdir, name) if as_text: file_io.atomic_write_string_to_file(path, text_format.MessageToString( graph_def, float_format='')) else: file_io.atomic_write_string_to_file( path, graph_def.SerializeToString(deterministic=True)) return path