图(graph):你希望会话处理的图。对于初学者来说,棘手的事情是:TF 中总存在一个默认的图,其中所有操作的设置都是默认的,所以你的操作范围总在一个「默认的图」中。 配置(config):你可以使用 ConfigProto 配置 TF。查看本文最后的链接资源以获取更多详细信息。 Saver 可以处理图的元数据和变量数据的保存和加载(又称恢复)。它需要知道的唯一的事情是:需要使用哪个图和变量? 默认情况下,Saver 会处理默认的图及其所有包含的变量,但是你可以创建尽可能多的 Saver 来控制你想要的任何图或子图的变量。这里是一个例子: import tensorflow as tf import os dir = os.path.dirname(os.path.realpath(__file__)) # First, you design your mathematical operations # We are the default graph scope # Let's design a variable v1 = tf.Variable(1. , name="v1") v2 = tf.Variable(2. , name="v2") # Let's design an operation a = tf.add(v1, v2) # Let's create a Saver object # By default, the Saver handles every Variables related to the default graph all_saver = tf.train.Saver() # But you can precise which vars you want to save under which name v2_saver = tf.train.Saver({"v2": v2}) # By default the Session handles the default graph and all its included variables with tf.Session() as sess: # Init v and v2 sess.run(tf.global_variables_initializer()) # Now v1 holds the value 1.0 and v2 holds the value 2.0 # We can now save all those values all_saver.save(sess, dir + '/data-all.chkp') # or saves only v2 v2_saver.save(sess, dir + '/data-v2.chkp') 如果查看你的文件夹,它实际上每创建 3 个文件调用一次保存操作并创建一个检查点(checkpoint)文件,我会在附录中讲述更多的细节。你可以简单理解为权重被保存到 .chkp.data 文件中,你的图和元数据被保存到 .chkp.meta 文件中。 恢复操作和其它元数据 一个重要的信息是,Saver 将保存与你的图相关联的任何元数据。这意味着加载元检查点还将恢复与图相关联的所有空变量、操作和集合(例如,它将恢复训练优化器)。 当你恢复一个元检查点时,实际上是将保存的图加载到当前默认的图中。现在你可以通过它来加载任何包含的内容,如张量、操作或集合。 import tensorflow as tf # Let's load a previously saved meta graph in the default graph # This function returns a Saver saver = tf.train.import_meta_graph('results/model.ckpt-1000.meta') # We can now access the default graph where all our metadata has been loaded graph = tf.get_default_graph() # Finally we can retrieve tensors, operations, collections, etc. global_step_tensor = graph.get_tensor_by_name('loss/global_step:0') train_op = graph.get_operation_by_name('loss/train_op') hyperparameters = tf.get_collection('hyperparameters') 恢复权重 请记住,实际的权重只存在于一个会话中。这意味着「恢复」操作必须能够访问会话以恢复图内的权重。理解恢复操作的最好方法是将其简单地当作一种初始化。 with tf.Session() as sess: # To initialize values with saved data saver.restore(sess, 'results/model.ckpt.data-1000-00000-of-00001') print(sess.run(global_step_tensor)) # returns 1000 在新图中使用预训练图 现在你知道了如何保存和加载,你可能已经明白如何去操作。然而,这里有一些技巧能够帮助你走得更快。 一个图的输出可以是另一个图的输入吗? 是的,但有一个缺点:我还不知道使梯度流(gradient flow)在图之间容易传递的一种方法,因为你将必须评估第一个图,获得结果,并将其馈送到下一个图。 这样一直下去是可以的,直到你需要重新训练第一个图。在这种情况下,你将需要将输入梯度馈送到第一个图的训练步骤…… 我可以在一个图中混合所有这些不同的图吗? (责任编辑:本港台直播) |