我是一个有张量流的初学者,所以请原谅这是一个愚蠢的问题,答案是显而易见的。
我创建了一个Tensorflow图,从X和y的占位符开始,我优化了一些代表我的模型的张量。图的一部分是可以计算预测矢量的东西,例如,用于线性回归,如
y_model = tf.add(tf.mul(X,w),d)
y_vals = sess.run(y_model,feed_dict={....})
训练结束后,我对w和d有可接受的值,现在我想保存我的模型以供日后使用。然后,在另一个python会话中,我想恢复模型,以便我可以再次运行
## Starting brand new python session
import tensorflow as tf
## somehow restor the graph and the values here: how????
## so that I can run this:
y_vals = sess.run(y_model,feed_dict={....})
获取一些不同的数据并获取y值。
我希望这种方式能够存储和恢复用于计算占位符的y值的图形 - 只要占位符获得正确的数据,这应该在没有用户的情况下透明地工作(一个谁应用模型)需要知道图形是什么样的)。
据我所知tf.train.Saver()。save(..)只保存变量,但我也想保存图形。我认为tf.train.export_meta_graph在这里可能是相关的,但我不明白如何正确使用它,文档对我来说有点神秘,并且示例甚至不使用export_meta_graph。
答案 0 :(得分:7)
从docs开始,试试这个:
# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
sess.run(init_op)
# Do some work with the model.
..
# Save the variables to disk.
save_path = saver.save(sess, "/tmp/model.ckpt")
print("Model saved in file: %s" % save_path)
您可以指定路径。
如果您想恢复模型,请尝试:
with tf.Session() as sess:
saver = tf.train.import_meta_graph('/tmp/model.ckpt.meta')
saver.restore(sess, "/tmp/model.ckpt")
答案 1 :(得分:5)
import tensorflow as tf
# Create some placeholder variables
x_pl = tf.placeholder(..., name="x")
y_pl = tf.placeholder(..., name="y")
# Add some operation to the Graph
add_op = tf.add(x, y)
with tf.Session() as sess:
# Add variable initializer
init = tf.global_variables_initializer()
# Add ops to save variables to checkpoints
# Unless var_list is specified Saver will save ALL named variables
# in Graph
# Optionally set maximum of 3 latest models to be saved
saver = tf.train.Saver(max_to_keep=3)
# Run variable initializer
sess.run(init)
for i in range(no_steps):
# Feed placeholders with some data and run operation
sess.run(add_op, feed_dict={x_pl: i+1, y_pl: i+5})
saver.save(sess, "path/to/checkpoint/model.ckpt", global_step=i)
这将保存以下文件:
1)元图
.meta
档案:
MetaGraph的MetaGraphDef协议缓冲区表示,它保存完整的Tf Graph结构,即描述数据流的GraphDef以及与之相关的所有元数据,例如:所有变量,操作,集合等。
导入图形结构将重新创建Graph及其所有变量,然后可以从检查点文件中恢复这些变量的相应值
如果您不想恢复图形,但是您可以通过重新执行构建模型n.b的Python代码来重建MetaGraphDef中的所有信息。您必须首先重新创建EXACT SAME变量,然后才能从检查点恢复其值
由于并不总是需要Meta Graph文件,您可以使用saver.save
write_meta_graph=False
中写文件
2)检查点文件
.data
档案:
tf.train.Saver()
中概述的所有已保存变量的值的二进制文件(默认为所有变量) .index
档案:
描述所有张量及其元数据检查点文件的不可变表:
保存最新检查点文件的记录
import tensorflow as tf
latest_checkpoint = tf.train.latest_checkpoint("path/to/checkpoint")
# Load latest checkpoint Graph via import_meta_graph:
# - construct protocol buffer from file content
# - add all nodes to current graph and recreate collections
# - return Saver
saver = tf.train.import_meta_graph(latest_checkpoint + '.meta')
# Start session
with tf.Session() as sess:
# Restore previously trained variables from disk
print("Restoring Model: {}".format("path/to/checkpoint"))
saver.restore(sess, latest_checkpoint)
# Retrieve protobuf graph definition
graph = tf.get_default_graph()
print("Restored Operations from MetaGraph:")
for op in graph.get_operations():
print(op.name)
# Access restored placeholder variables
x_pl = graph.get_tensor_by_name("x_pl:0")
y_pl = graph.get_tensor_by_name("y_pl:0")
# Access restored operation to re run
accuracy_op = graph.get_tensor_by_name("accuracy_op:0")
这只是一个基础知识的简单示例,对于工作实现,请参阅here。
答案 2 :(得分:1)
要保存图表,您需要冻结图表。 以下是冻结图表的python脚本: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py
以下是冻结图表的代码段:
from tensorflow.python.tools import freeze_graph
freeze_graph.freeze_graph(input_graph_path, input_saver_def_path,
input_binary, checkpoint_path, output_node
restore_op_name, filename_tensor_name,
output_frozen_graph_name, True, "")
其中输出节点对应于输出张量变量。
output = tf.nn.softmax(outer_layer_name,name="output")