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