TensorFlow1.12变量赋值后保存再加载值未更新问题
TensorFlow 1.x 变量赋值后保存再加载值异常问题解答
问题原因
- 你在恢复模型参数的逻辑中,先调用
saver.restore()加载了 checkpoint 中存储的修改后变量值3,随后又执行了sess.run(tf.global_variables_initializer())。 - 全局初始化操作会将图中所有变量重置为定义时指定的初始值(即定义
w时设置的2),直接覆盖了刚刚恢复的正确值,最终导致加载得到的是初始值而非修改后的值。
解决方法
删除模型恢复流程中多余的sess.run(tf.global_variables_initializer())语句即可。saver.restore()操作已经完成了变量的赋值,不需要再做全局初始化。
修改后的参考代码(仅展示加载部分)
model_path = "./test_1.meta" g = tf.Graph() with g.as_default(): sess = tf.Session(graph=g) saver = tf.train.import_meta_graph(model_path, clear_devices=True) saver.restore(sess, model_path.replace('.meta', '')) # 移除了多余的全局变量初始化调用 gb = tf.global_variables() print(gb) w = gb[0] y = sess.run(w) print('loaded value', y)
修改后运行输出将为('loaded value', 3),符合预期。
扩展说明
如果你的场景中同时存在需要从 checkpoint 恢复的旧变量,和自己新增的不需要恢复的新变量,不要调用全局初始化,改为使用tf.variables_initializer(需要初始化的变量列表)仅对新增变量做初始化即可,避免覆盖恢复的变量值。
内容的提问来源于stack exchange,提问作者Ryan Halabi
相关产品推荐
相关产品推荐

