页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

MetaGraph包含TensorFlow GraphDef以及在跨越进程边界时在图中运行计算所需的关联元数据。它也可以用于图形的长期存储。MetaGraph包含继续训练,执行评估或在先前训练过的图表上运行推断所需的信息。

用于导出和导入完整模型的API位于以下tf.train.Saver类中: tf.train.export_meta_graph 和tf.train.import_meta_graph

什么是MetaGraph?

包含在MetaGraph中的信息表示为 MetaGraphDef 协议缓冲区。它包含以下字段:

  • MetaInfoDef 用于元信息,例如版本和其他用户信息。
  • GraphDef 用于描述图。
  • SaverDef 为了节省
  • CollectionDef 图进一步描述了该模型的另外的组分,诸如 Variables, tf.train.QueueRunner等为了使Python对象被序列化和从MetaGraphDef,Python的类必须实现to_proto()和 from_proto()方法,以及与该系统中使用登记它们 register_proto_function

例如,

def to_proto(self, export_scope=None):

 
"""Converts a `Variable` to a `VariableDef` protocol buffer.

  Args:
    export_scope: Optional `string`. Name scope to remove.

  Returns:
    A `VariableDef` protocol buffer, or `None` if the `Variable` is not
    in the specified name scope.
  """

 
if (export_scope is None or
     
self._variable.name.startswith(export_scope)):
    var_def
= variable_pb2.VariableDef()
    var_def
.variable_name = ops.strip_name_scope(
       
self._variable.name, export_scope)
    var_def
.initializer_name = ops.strip_name_scope(
       
self.initializer.name, export_scope)
    var_def
.snapshot_name = ops.strip_name_scope(
       
self._snapshot.name, export_scope)
   
if self._save_slice_info:
      var_def
.save_slice_info_def.MergeFrom(self._save_slice_info.to_proto(
          export_scope
=export_scope))
   
return var_def
 
else:
   
return None

@staticmethod
def from_proto(variable_def, import_scope=None):
 
"""Returns a `Variable` object created from `variable_def`."""
 
return Variable(variable_def=variable_def, import_scope=import_scope)

ops
.register_proto_function(ops.GraphKeys.GLOBAL_VARIABLES,
                            proto_type
=variable_pb2.VariableDef,
                            to_proto
=Variable.to_proto,
                            from_proto
=Variable.from_proto)

 

将完整模型导出到MetaGraph

用于将运行模型导出为MetaGraph的API是export_meta_graph()

def export_meta_graph(filename=None, collection_list=None, as_text=False):
 
"""Writes `MetaGraphDef` to save_path/filename.

  Args:
    filename: Optional meta_graph filename including the path.
    collection_list: List of string keys to collect.
    as_text: If `True`, writes the meta_graph as an ASCII proto.

  Returns:
    A `MetaGraphDef` proto.
  """

collection可以包含用户希望能够唯一标识并轻松检索的任何Python对象。这些对象可以是图形中的特殊操作,例如train_op,或超参数,如“学习率”。用户可以指定他们要导出的集合列表。如果指定collection_list为no,则将导出模型中的所有集合。

API返回一个序列化协议缓冲区。如果filename指定,协议缓冲区也将被写入一个文件。

以下是一些典型的使用模式:

  • 导出默认运行图:
# Build the model
...
with tf.Session() as sess:
 
# Use the model
 
...
# Export the model to /tmp/my-model.meta.
meta_graph_def
= tf.train.export_meta_graph(filename='/tmp/my-model.meta')
  • 导出默认的运行图和只有集合的一个子集。
meta_graph_def = tf.train.export_meta_graph(
    filename
='/tmp/my-model.meta',
    collection_list
=["input_tensor", "output_tensor"])

MetaGraph也通过save()API 自动导出tf.train.Saver

 

导入MetaGraph

用于将MetaGraph文件导入图形的API是import_meta_graph()

以下是一些典型的使用模式:

  • 导入并继续训练,无需从头构建模型。
...
# Create a saver.
saver
= tf.train.Saver(...variables...)
# Remember the training_op we want to run by adding it to a collection.
tf
.add_to_collection('train_op', train_op)
sess
= tf.Session()
for step in xrange(1000000):
    sess
.run(train_op)
   
if step % 1000 == 0:
       
# Saves checkpoint, which by default also exports a meta_graph
       
# named 'my-model-global_step.meta'.
        saver
.save(sess, 'my-model', global_step=step)

后来我们可以继续从这个保存的训练,meta_graph而不是从头开始构建模型。

with tf.Session() as sess:
  new_saver
= tf.train.import_meta_graph('my-save-dir/my-model-10000.meta')
  new_saver
.restore(sess, 'my-save-dir/my-model-10000')
 
# tf.get_collection() returns a list. In this example we only want the
 
# first one.
  train_op
= tf.get_collection('train_op')[0]
 
for step in xrange(1000000):
    sess
.run(train_op)
  • 导入并扩展图。

例如,我们可以先建立一个推理图,然后将其导出为元图:

# Creates an inference graph.
# Hidden 1
images
= tf.constant(1.2, tf.float32, shape=[100, 28])
with tf.name_scope("hidden1"):
  weights
= tf.Variable(
      tf
.truncated_normal([28, 128],
                          stddev
=1.0 / math.sqrt(float(28))),
      name
="weights")
  biases
= tf.Variable(tf.zeros([128]),
                       name
="biases")
  hidden1
= tf.nn.relu(tf.matmul(images, weights) + biases)
# Hidden 2
with tf.name_scope("hidden2"):
  weights
= tf.Variable(
      tf
.truncated_normal([128, 32],
                          stddev
=1.0 / math.sqrt(float(128))),
      name
="weights")
  biases
= tf.Variable(tf.zeros([32]),
                       name
="biases")
  hidden2
= tf.nn.relu(tf.matmul(hidden1, weights) + biases)
# Linear
with tf.name_scope("softmax_linear"):
  weights
= tf.Variable(
      tf
.truncated_normal([32, 10],
                          stddev
=1.0 / math.sqrt(float(32))),
      name
="weights")
  biases
= tf.Variable(tf.zeros([10]),
                       name
="biases")
  logits
= tf.matmul(hidden2, weights) + biases
  tf
.add_to_collection("logits", logits)

init_all_op
= tf.global_variables_initializer()

with tf.Session() as sess:
 
# Initializes all the variables.
  sess
.run(init_all_op)
 
# Runs to logit.
  sess
.run(logits)
 
# Creates a saver.
  saver0
= tf.train.Saver()
  saver0
.save(sess, 'my-save-dir/my-model-10000')
 
# Generates MetaGraphDef.
  saver0
.export_meta_graph('my-save-dir/my-model-10000.meta')

然后再将其导入培训图表。

with tf.Session() as sess:
  new_saver
= tf.train.import_meta_graph('my-save-dir/my-model-10000.meta')
  new_saver
.restore(sess, 'my-save-dir/my-model-10000')
 
# Addes loss and train.
  labels
= tf.constant(0, tf.int32, shape=[100], name="labels")
  batch_size
= tf.size(labels)
  labels
= tf.expand_dims(labels, 1)
  indices
= tf.expand_dims(tf.range(0, batch_size), 1)
  concated
= tf.concat([indices, labels], 1)
  onehot_labels
= tf.sparse_to_dense(
      concated
, tf.stack([batch_size, 10]), 1.0, 0.0)
  logits
= tf.get_collection("logits")[0]
  cross_entropy
= tf.nn.softmax_cross_entropy_with_logits(
      labels
=onehot_labels, logits=logits, name="xentropy")
  loss
= tf.reduce_mean(cross_entropy, name="xentropy_mean")

  tf
.summary.scalar('loss', loss)
 
# Creates the gradient descent optimizer with the given learning rate.
  optimizer
= tf.train.GradientDescentOptimizer(0.01)

 
# Runs train_op.
  train_op
= optimizer.minimize(loss)
  sess
.run(train_op)
  • 使用预设设备导入图形。

有时出口的元图表来自进口商没有的培训环境。例如,该模型可能已经在GPU上或在具有副本的分布式环境中进行了培训。导入这些模型时,可以清除图表中的设备设置,以便我们可以在本地可用的设备上运行它。这可以通过调用来实现import_meta_graphclear_devices 选项设置为True

with tf.Session() as sess:
  new_saver
= tf.train.import_meta_graph('my-save-dir/my-model-10000.meta',
      clear_devices
=True)
  new_saver
.restore(sess, 'my-save-dir/my-model-10000')
 
...
  • 在默认图形中导入。

有时您可能希望 使用默认图表运行export_meta_graphimport_meta_graph使用codelab。在这种情况下,您需要tf.reset_default_graph()在运行导入之前首先调用默认图形。

meta_graph_def = tf.train.export_meta_graph()
...
tf
.reset_default_graph()
...
tf
.train.import_meta_graph(meta_graph_def)
...
  • 检索超参数
filename = ".".join([tf.train.latest_checkpoint(train_dir), "meta"])
tf
.train.import_meta_graph(filename)
hparams
= tf.get_collection("hparams")

 

  • 无标签