Python 在预定义的图形对象上使用tf.train.Saver对象
TL;DR:为什么我们不能使用类似于Python 在预定义的图形对象上使用tf.train.Saver对象,python,tensorflow,graph,Python,Tensorflow,Graph,TL;DR:为什么我们不能使用类似于tf.saver.Save(graph=graph\u obj)的东西来定义一个saver对象 标题主要说明了这一切。。。好的,为了将一个saver对象链接到您的图形,您需要这样定义它 将tf.Graph()作为默认值()作为g_def: x\u input\u fun=tf.placeholder(dtype=tf.float32,name='input') y_output_fun=tf.placeholder(dtype=tf.float32,name
tf.saver.Save(graph=graph\u obj)
的东西来定义一个saver对象
标题主要说明了这一切。。。好的,为了将一个saver对象链接到您的图形,您需要这样定义它
将tf.Graph()作为默认值()作为g_def:
x\u input\u fun=tf.placeholder(dtype=tf.float32,name='input')
y_output_fun=tf.placeholder(dtype=tf.float32,name='output')
w_weights_fun=tf.get_变量('weight_set',dtype=tf.float32,shape=(5,5))
output=tf.matmul(x_input_fun,w_weights_fun,name='pred')
损耗=tf.subtract(输出,y\u输出,name='loss')
self.opti=tf.train.AdamOptimizer(丢失,name='opti')
g_def.将_添加到_集合(tf.GraphKeys.TRAIN_OP,self.opti)
#现在,当我们执行saver.save(…)时,saver链接到此图
saver=tf.train.saver()
如果要将其链接到默认图形,只需说出tf.train.Saver()
(当然,如果其中有可训练/可保存的变量)
但是为什么我们不能像这样做:tf.train.Saver(graph=g_def)
这对我来说会更自然。当我们从一个检查点恢复一个模型时,类似的情况(对我来说)也适用。。。即使我们执行下面的代码
将tf.Session(graph=tf.graph())作为sess的:
saver=tf.train.import\u meta\u graph('some\u meta\u file.meta')
saver.restore(sess'./一些元文件')
然后,tf.default\u graph()
仍然从导入的元文件中获得了节点。我能想到它如何运作的原因。。。但现在为什么
编辑:
我在检查导入图的节点时犯了如下错误。我运行了这个代码
将tf.Session(graph=tf.graph())作为sess的:
saver=tf.train.import\u meta\u graph('some\u meta\u file.meta')
saver.restore(sess'./一些元文件')
打印(sess.graph==tf.get\u default\u graph())
因为我想确保默认图不包含我刚刚导入到会话图中的节点。但是,这个tf.get_default_graph()当然是。。相对的。。因此,在此会话中,默认图形实际上是导入的图形
因此,这也使得saver对象的工作更具逻辑性。由于此对象将始终保存/获取tf.get_default_graph()的内容。为了保存或还原任何内容,
tf.train.Saver
需要一个会话,并且会话绑定到特定的图形实例(如您的示例中)。这意味着,如果没有会话,保存程序实际上毫无意义。我想这是不在saver中使用显式图形绑定的主要动机
我想您可能会感兴趣的是以下内容中的defer\u build
属性:
defer\u build
:如果True
,则推迟将保存和还原操作添加到build()
调用。在这种情况下,应在完成图形或使用保护程序之前调用build()
通过这种方式,您可以创建一个不绑定到任何图形的
tf.train.Saver
,并在以后为特定的tf.graph
实例调用build()。该块使用提供的图形