tensorflow仅恢复变量

时间:2016-02-21 11:01:16

标签: tensorflow

我在Tensorflow中进行一些培训并使用保护程序保存整个会话:

# ... define model

# add a saver
saver = tf.train.Saver()

# ... run a session
    # ....
    # save the model
    save_path = saver.save(sess,fileSaver)

它工作正常,我可以使用完全相同的模型并调用:

成功恢复整个会话
saver.restore(sess, importSaverPath)

现在我想只修改优化器,同时保持模型的其余部分不变(计算图与优化器保持不变):

# optimizer used before
# optimizer = tf.train.AdamOptimizer
#    (learning_rate = learningRate).minimize(costPrediction)
# the new optimizer I want to use
optimizer = tf.train.RMSPropOptimizer
    (learning_rate = learningRate, decay = 0.9, momentum = 0.1,
    epsilon = 1e-5).minimize(costPrediction)

我还想从我保存的最后一个图形状态继续训练(即,我想恢复变量的状态并继续使用另一种训练算法)。当然我不能用:

saver.restore

,因为图表已经改变了。

所以我的问题是:当整个会话被保存时,是否有一种方法可以使用saver.restore命令(或者甚至可能以后使用,只有一部分变量)恢复变量?我在API文档和在线查找了这样的功能,但找不到任何可以帮助我使用它的示例/详细解释。

3 个答案:

答案 0 :(得分:2)

通过将变量列表作为var_list参数传递给Saver构造函数,可以恢复变量子集。但是,当您更改优化程序时,可能已创建其他变量(例如,动量累加器)和与先前优化程序关联的变量(如果有)将从模型中删除。因此,简单地使用旧的Saver对象进行恢复将无效,尤其是如果您使用默认构造函数构造它,该构造函数使用tf.all_variables作为var_list参数的参数。您必须在模型中创建的变量子集上构造Saver对象,然后restore才能生效。请注意,这会使新优化器创建的新变量保持未初始化状态,因此您必须显式初始化它们。

答案 1 :(得分:1)

我看到了同样的问题。灵感来自keveman'的答案。我的解决方案是:

  1. 定义新图表(此处只有新的优化程序相关变量与旧图表不同)。

  2. 使用tf.global_variables()获取所有变量。这将返回一个名为g_vars的var列表。

  3. 使用tf.contrib.framework.get_variables_by_suffix('一些变量过滤器')获取所有与优化器相关的变量。过滤器可以是RMSProp或RMSPRrop_ *。此函数返回一个名为exclude_vars的var列表。

  4. 在g_vars中获取变量,但不在exclude_vars中获取变量。只需使用

    vars = [如果项目不在exclude_vars中,则为g_vars中项目的项目]

  5. 这些变量是新旧图中的常见变量,现在可以从旧模型中恢复。

答案 2 :(得分:0)

您可以先从Saver个protobuf恢复原始MetaGraph,然后使用该保护程序安全地恢复所有旧变量。有关具体示例,您可以查看eval.py脚本:TensorFlow: How do I release a model without source code?