我一直在成功地遵循保存/恢复GPflow模型的方法。但现在我遇到了麻烦。
当我尝试用线性平均函数恢复一个模型时,这个恢复会出现错误。
我认为这个问题出现在tensorflow线性平均函数对象的命名惯例中。上面的"-44dbadbb-0“是随机的,每次重建模型时都会发生变化,所以如果我在保存模型时检查张量名称
from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file
print_tensors_in_checkpoint_file(file_name='./model.ckpt', tensor_name='', all_tensors=False)我得到了回报:
线性-eeb5f9f3-0/A/无约束(DT_DOUBLE) 1,1线性-eb5f9f3-0/b/无约束(DT_DOUBLE) 1模型/X/数据持有人(DT_DOUBLE) 15,1模型/Y/数据持有人(DT_DOUBLE) 15,1 DT_DOUBLE []模型/kern/kernels/0/方差/无约束(DT_DOUBLE) [] model/kern/kernels/1/lengthscales/unconstrained (DT_DOUBLE) []模型/kern/DT_DOUBLE (DT_DOUBLE) 15(DT_DOUBLE)[]模型核/1/方差/无约束(DT_DOUBLE) []模型/似然/方差/无约束(DT_DOUBLE) []
其中线性函数显然与试图恢复的模型有不同的名称。
我试图通过在还原之前重命名变量来修复这个问题,但是这并不适用于tensorflow。我也尝试过不同的保存/恢复方法,但是在能够从模型中取样时我遇到了问题。
保存模型
import gpflow
import numpy as np
import random
import tensorflow as tf
# define data
rng = np.random.RandomState(4)
X = rng.uniform(0, 5.0, 15)[:, np.newaxis]
Y = np.sin((X[:, 0] - 2.5) ** 2).reshape(len(X),1)
# define the mean function
mf = gpflow.mean_functions.Linear(np.ones((1,1)),np.zeros((1,)))
# create the GP model
with gpflow.defer_build():
k = gpflow.kernels.Matern32(1)+gpflow.kernels.RBF(1)
m = gpflow.models.GPR(X, Y, kern=k,name='model',mean_function=mf)
m.likelihood.variance = 1e-03
m.likelihood.trainable = False
tf.global_variables_initializer()
tf_session = m.enquire_session()
m.compile( tf_session )
gpflow.train.ScipyOptimizer().minimize(m)
saver = tf.train.Saver()
save_path = saver.save(tf_session, "./model.ckpt")
print("Model saved in path: %s" % save_path)恢复模型
import gpflow
import numpy as np
import random
import tensorflow as tf
# define data
rng = np.random.RandomState(4)
X = rng.uniform(0, 5.0, 15)[:, np.newaxis]
Y = np.sin((X[:, 0] - 2.5) ** 2).reshape(len(X),1)
# define the mean function
mf = gpflow.mean_functions.Linear(np.ones((1,1)),np.zeros((1,)))
with gpflow.defer_build():
k = gpflow.kernels.Matern32(1)+gpflow.kernels.RBF(1)
m = gpflow.models.GPR(X, Y, kern=k,name='model',mean_function=mf)
m.likelihood.variance = 1e-03
m.likelihood.trainable = False
# construct and compile the tensorflow session
tf.global_variables_initializer()
tf_session = m.enquire_session()
m.compile( tf_session )
saver = tf.train.Saver()
save_path = saver.restore(tf_session, "./model.ckpt")
print("Model loaded from path: %s" % save_path)
m.anchor(tf_session)代码在save_path = saver.restore(tf_session, "./model.ckpt")崩溃时出错:
NotFoundError (回溯见上文):键线性-44dbadbb-0/A/不受约束,不在检查点.
发布于 2019-07-11 14:53:54
defer_build()做了很多事情--但是在一次过程中构建整个模型(即tensorflow图)的一部分是,所有tensorflow变量&占位符都得到一致的名称,它们的所有名称都与模型本身的名称相关(通过将name='model'关键字参数传递给模型构造函数来设置)。
但是,在您的代码中,Linear平均函数是在defer_build()作用域之外构造的。这意味着gpflow必须立即为其构造一个图-包括为参数设置变量(在本例中为斜率和偏移)。所有tensorflow变量都位于全局名称空间中,因此允许创建多个对象的唯一方法是为它们分配随机名称。(例如,想象一下想要构造一个由两个相同类型的内核组成的和!)
幸运的是,修复很容易:只需将construction的构造移到defer_build块中:
with gpflow.defer_build():
# define the mean function
mf = gpflow.mean_functions.Linear(np.ones((1,1)), np.zeros((1,)))
k = gpflow.kernels.Matern32(1) + gpflow.kernels.RBF(1)
m = gpflow.models.GPR(X, Y, kern=k, mean_function=mf, name='model')
m.likelihood.variance = 1e-03
m.likelihood.trainable = False
# construct and compile the tensorflow session
tf.global_variables_initializer()
tf_session = m.enquire_session()
m.compile(tf_session)如果您在“保存”和“加载”脚本中都这样做,那么一切都会按您的预期运行。希望这能有所帮助!
https://stackoverflow.com/questions/56991656
复制相似问题