tensorflow模型加载时,出现“Key Variable_xxx not found in checkpoint”的问题

 

在使用tensorflow保存模型后,想要加载模型,用来对测试数据进行测试时,出现了“Key Variable not fonund in checkpoint"问题。

谷歌了一下,发现有一篇博客已经解答了这个问题,链接在参考博客上。为了看看我的问题和他的问题是不是一样的,我按照该博客的方法,在加载模型的代码中进行如下修改。

import tensorflow as tf
from tensorflow.python import pywrap_tensorflow

saver = tf.train.Saver()
reader = pywrap_tensorflow.NewCheckpointReader(model_checkpoint_path)#model_checkpoint_path是保存模型的路径加上模型名
var_to_shape_map = reader.get_variable_to_shape_map()
for key in var_to_shape_map:
    print("tensor name:",key)
    saver.restore(sess, model_checkpoint_path)

 输出的结果:

发现确实如这篇博客所说的,是因为模型把优化的变量也给保存下来了,所以后面就按照该博客建议的,在tf.train.Saver中指定真正要保存的变量。因为我的模型比较多层,按照这篇博客那种方法就太复杂了,所以我就直接把var_list设置成tf.trainable_variables()。

import tensorflow as tf
from tensorflow.python import pywrap_tensorflow

reader = pywrap_tensorflow.NewCheckpointReader(model_checkpoint_path)#model_checkpoint_path是保存模型的路径加上模型名
var_to_shape_map = reader.get_variable_to_shape_map()
for key in var_to_shape_map:
    print("tensor name:",key)
    saver.restore(sess, model_checkpoint_path)
saver = tf.train.Saver(max_to_keep=FLAGS.keep_ckpt + 1 if FLAGS.keep_ckpt else 1000000, var_list = tf.trainable_variables()) #前面的max_to_keep是确认要保存的模型的个数,这个如果不指定的话可以直接去掉,只保留后面的var_list = tf.trainable_variables()

修改完成后,再次运行训练代码,将训练完成的模型保存下来。保存完成后,再次加载模型。本来以为已经大功告成了,没想到再次报错。

再次把模型打印出来,跟之前加载的模型进行对比发现:有些tensor的tensorname已经没有Adam这个名称了,但是有些还是有。仔细观察我发现,那些没有的层,都是我训练的时候设置成可训练的层。因为我在训练的时候,是将pretrained的模型加载进来,然后对pretrained的模型的后面几层进行训练的。

发现这个问题之后,我再在测试代码中,插入下面这行代码。

saver = tf.train.Saver(max_to_keep=FLAGS.keep_ckpt + 1 if FLAGS.keep_ckpt else 1000000,var_list=tf.trainable_variables())

最后模型正常加载,可以正常进行测试了。

总结:

需要在训练和测试代码中都增加下面这段代码。

saver = tf.train.Saver(max_to_keep=FLAGS.keep_ckpt + 1 if FLAGS.keep_ckpt else 1000000,var_list=tf.trainable_variables())

参考博客

https://blog.csdn.net/qq_36810544/article/details/81456182

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值