TensorFlow恢复变量时为何尝试读取未指定的检查点key?
为什么TensorFlow会尝试恢复未请求的检查点key?
这问题我碰到过好多次,大概率是计算图不一致或者Saver的默认行为在搞鬼,结合你提到的《机器学习》示例,我给你拆解几个常见原因:
恢复时的计算图里多了个叫
spikes_1的变量:比如你在定义模型时,不小心重复创建了同名的spikes变量(比如两次调用了定义spikes的代码块),TensorFlow会自动给重复的变量加后缀(_1、_2这类)。这时候如果你用默认的tf.train.Saver()(不指定要恢复的变量列表),Saver会尝试恢复当前图里的所有变量——包括这个意外出现的spikes_1,但你的检查点里只存了原本的spikes,自然就报NotFoundError了。保存和恢复时的变量命名规则变了:比如保存时你直接用
spikes作为变量名,但恢复时不小心把变量放到了某个命名作用域(tf.name_scope或tf.variable_scope)里,导致变量的完整名称变成了xxx/spikes_1之类的,和检查点里的key完全对不上。Saver的变量映射没做对:如果你手动指定了要恢复的变量,但可能不小心漏写或者映射错误?不过你提到是“未指定的key”,所以更可能是第一种情况——默认Saver自动捕获了图里的所有变量,包括那个你没意识到的
spikes_1。
对应的解决办法也很直接:
- 先打印当前计算图里的所有变量名,确认是不是真的存在
spikes_1:for var in tf.global_variables(): print(var.name) - 如果确实多了这个变量,检查代码里是不是重复定义了
spikes,删掉冗余的定义即可; - 或者在创建Saver时明确指定要恢复的变量,不要用默认的全部恢复:
saver = tf.train.Saver({"spikes": spikes}) # 只恢复指定的spikes变量
这样就能避免Saver去尝试恢复那些你没打算从检查点读取的变量了。
内容的提问来源于stack exchange,提问作者orome
相关产品推荐
相关产品推荐

