我在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文档和在线查找了这样的功能,但找不到任何可以帮助我使用它的示例/详细解释。
答案 0 :(得分:2)
通过将变量列表作为var_list
参数传递给Saver
构造函数,可以恢复变量子集。但是,当您更改优化程序时,可能已创建其他变量(例如,动量累加器)和与先前优化程序关联的变量(如果有)将从模型中删除。因此,简单地使用旧的Saver
对象进行恢复将无效,尤其是如果您使用默认构造函数构造它,该构造函数使用tf.all_variables
作为var_list
参数的参数。您必须在模型中创建的变量子集上构造Saver
对象,然后restore
才能生效。请注意,这会使新优化器创建的新变量保持未初始化状态,因此您必须显式初始化它们。
答案 1 :(得分:1)
我看到了同样的问题。灵感来自keveman'的答案。我的解决方案是:
定义新图表(此处只有新的优化程序相关变量与旧图表不同)。
使用tf.global_variables()获取所有变量。这将返回一个名为g_vars的var列表。
使用tf.contrib.framework.get_variables_by_suffix('一些变量过滤器')获取所有与优化器相关的变量。过滤器可以是RMSProp或RMSPRrop_ *。此函数返回一个名为exclude_vars的var列表。
在g_vars中获取变量,但不在exclude_vars中获取变量。只需使用
vars = [如果项目不在exclude_vars中,则为g_vars中项目的项目]
这些变量是新旧图中的常见变量,现在可以从旧模型中恢复。
答案 2 :(得分:0)
您可以先从Saver
个protobuf恢复原始MetaGraph
,然后使用该保护程序安全地恢复所有旧变量。有关具体示例,您可以查看eval.py
脚本:TensorFlow: How do I release a model without source code?