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

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值