首页 > 编程 > Python > 正文

解决tensorflow模型参数保存和加载的问题

2020-02-15 22:33:06
字体:
来源:转载
供稿:网友

终于找到bug原因!记一下;还是不熟悉平台的原因造成的!

Q:为什么会出现两个模型对象在同一个文件中一起运行,当直接读取他们分开运行时训练出来的模型会出错,而且总是有一个正确,一个读取错误? 而 直接在同一个文件又训练又重新加载模型预测不出错,而且更诡异的是此时用分文件里的对象加载模型不会出错?

model.py,里面含有 ModelV 和 ModelP,另外还有 modelP.py 和 modelV.py 分别只含有 ModelP 和 ModeV 这两个对象,先使用 modelP.py 和 modelV.py 分别训练好模型,然后再在 model.py 里加载进来:

# -*- coding: utf8 -*-import tensorflow as tfclass ModelV(): def __init__(self):  self.v1 = tf.Variable(66, name="v1")  self.v2 = tf.Variable(77, name="v2")  self.save_path = "model_v/model.ckpt"  self.init = tf.global_variables_initializer()  self.saver = tf.train.Saver()  self.sess = tf.Session() def train(self):  self.sess.run(self.init)  print 'v2', self.v2.eval(self.sess)  self.saver.save(self.sess, self.save_path)  print "ModelV saved." def predict(self):  all_vars = tf.trainable_variables()  for v in all_vars:   print(v.name)  self.saver.restore(self.sess, self.save_path)  print "ModelV restored."  print 'v2', self.v2.eval(self.sess)  print '------------------------------------------------------------------'class ModelP(): def __init__(self):  self.p1 = tf.Variable(88, name="p1")  self.p2 = tf.Variable(99, name="p2")  self.save_path = "model_p/model.ckpt"  self.init = tf.global_variables_initializer()  self.saver = tf.train.Saver()  self.sess = tf.Session() def train(self):  self.sess.run(self.init)  print 'p2', self.p2.eval(self.sess)  self.saver.save(self.sess, self.save_path)  print "ModelP saved." def predict(self):  all_vars = tf.trainable_variables()  for v in all_vars:   print v.name  self.saver.restore(self.sess, self.save_path)  print "ModelP restored."  print 'p2', self.p2.eval(self.sess)  print '---------------------------------------------------------------------'if __name__ == '__main__': v = ModelV() p = ModelP() v.predict() #v.train() p.predict()  #p.train()

这里 tf.global_variables_initializer() 很关键! 尽管你是分别在对象 ModelP 和 ModelV 内部分配和定义的 tf.Variable(),即 v1 v2 和 p1 p2,但是 对 tf 这个模块而言, 这些都是全局变量,可以通过以下代码查看所有的变量,你就会发现同一个文件中同时运行 ModelP 和 ModelV 在初始化之后都打印出了一样的变量,这个是问题的关键所在:

all_vars = tf.trainable_variables()for v in all_vars: print(v.name)

错误。你可以交换 modelP 和 modelV 初始化的顺序,看看错误信息的变化

v1:0v2:0p1:0p2:0ModelV restored.v2 77v1:0v2:0p1:0p2:0W tensorflow/core/framework/op_kernel.cc:975] Not found: Key v2 not found in checkpointW tensorflow/core/framework/op_kernel.cc:975] Not found: Key v1 not found in checkpoint            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表