您的位置:首页 > 其它

Tensorflow Saver & restore 以及报错问题 NotFoundError: "x_x" not found in checkpoint

2018-03-20 12:46 1236 查看
根据 莫烦Python 的教程 保存模型参数

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 20 10:01:04 2018

@author: lyh
"""

import tensorflow as tf
import numpy as np
#save

W = tf.Variable([[1,2,3],[3,4,5]],dtype=tf.float32,name="weight")

init = tf.global_variables_initializer()
saver = tf.train.Saver()

with tf.Session() as sess:
sess.run(init)
save_path = saver.save(sess,"mynet/save_net.ckpt")
print("Save to path:" + save_path)

#load
W = tf.Variable(np.arange(6).reshape((2,3)),dtype=tf.float32,name="weight")
#不需要init
saver = tf.train.Saver()
with tf.Session() as sess:
saver.restore(sess,save_path)
print("weight:" + sess.run(W))


然后出现以下错误:NotFoundError: Tensor name “weight_1” not found in checkpoint files mynet/save_net.ckpt



浏览网上相关讨论,尝试 restart kernel (Spyder 编辑器)以及 更改 tf.train.Saver(write_version=tf.train.SaverDef.V1) 为 V1 版本均无法正常 restore。

原因

真正的原因是,我写的代码 保存和加载 在前后进行,在前后两次定义了

W = tf.Variable(xxx,name="weight")


相当于 在TensorFlow 图的堆栈创建了两次 name = “weight” 的变量,第二个(第n个)的实际 name 会变成 “weight_1” (“weight_n-1”),之后我们在保存 checkpoint 中实际搜索的是 “weight_n-1” 这个变量 而不是 “weight” ,因此就会出错。

解决方案:

(1)在加载过程中,定义 name 相同的变量前面加

tf.reset_default_graph() 清除默认图的堆栈,并设置全局图为默认图

(2)正常场景下,不会保存模型之后,马上加载(或在同一程序中加载),就不会出现这个情况,或者保存完之后 restart kernel (Spyder 中),再进行参数加载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐