如果需要解释的话,就是每当你在TensorFlow中创建一个操作时,都会向图中添加一个新节点。在同一张图中,没有两个节点可以拥有相同的名称。你可以为任何你创建的节点定义名称,但如果你不指定名称,TensorFlow会以确定性的方式(即不随机,而是始终具有相同的顺序)为你选择一个名称。如果你添加两个数字,它可能是Add
,但如果你进行另一个加法运算,由于没有两个节点可以拥有相同的名称,它可能是像Add_2
这样的东西。一旦在图中创建了一个节点,其名称就无法更改。许多函数会依次创建几个子节点;例如,tf.layers.batch_normalization
会创建一些内部变量beta
和gamma
。
保存和恢复的工作方式如下:
- 创建代表所需模型的图。该图包含将由saver保存的变量。
- 初始化、训练或执行其他操作,模型中的变量被分配一些值。
- 调用saver上的
save
方法,将变量的值保存到文件中。
- 现在,在不同的图中重新创建模型(它可以是完全不同的Python会话,也可以是与第一个图共存的另一个图)。模型必须以与第一个相同的方式创建。
- 调用saver上的
restore
方法,检索变量的值。
为了使这个过程工作,第一张图和第二张图中变量的名称必须完全相同。
在你的例子中,TensorFlow抱怨变量batch_normalization_585/beta
。看起来你已经在同一张图中调用了tf.layers.batch_normalization
将近600次,因此你有那么多的beta
变量挂在那里。我怀疑你实际上不需要那么多,所以我猜你只是在尝试API并最终得到了那么多的副本。
这是一个应该可以工作的草稿:
import tensorflow as tf
def make_model():
input = tf.placeholder(...)
phase = tf.placeholder(...)
input_norm = tf.layers.batch_normalization(input, training=phase))
output = ...
saver = tf.train.Saver()
return input, output, phase, saver
g1 = tf.Graph()
with g1.as_default():
input, output, phase, saver = make_model()
with tf.Session() as sess:
saver.save(sess, savedir + "ckpt")
g2 = tf.Graph()
with g2.as_default():
input, output, phase, saver = make_model()
with tf.Session() as sess:
saver.restore(sess, savedir + "ckpt")
通常情况下不是将两个图并排放置,而是在另一个 Python 会话中重新创建相同的图。最重要的是在两种情况下以相同的方式(因此使用相同的节点名称)创建模型。
tf.import_meta_graph
的文档,这里需要你的checkpoint的.meta文件作为输入,然后只需使用checkpoint文件还原会话。 - Ishant Mrinaltf.import_meta_graph
已经卡了将近30分钟了。我按照文档做了,但似乎错过了什么东西。 - ALeex