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

根据 莫烦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 中),再进行参数加载。

猜你喜欢

转载自blog.csdn.net/machinerandy/article/details/79624010
今日推荐