使用均值函数恢复 GPflow 模型不起作用
Restoring GPflow Model with Mean Function doesn't work
我一直在遵循 saving/restoring 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)
我得到 return:
Linear-eeb5f9f3-0/A/unconstrained (DT_DOUBLE) [1,1]
Linear-eeb5f9f3-0/b/unconstrained (DT_DOUBLE) [1]
model/X/dataholder (DT_DOUBLE) [15,1]
model/Y/dataholder (DT_DOUBLE) [15,1]
model/kern/kernels/0/lengthscales/unconstrained (DT_DOUBLE) []
model/kern/kernels/0/variance/unconstrained (DT_DOUBLE) []
model/kern/kernels/1/lengthscales/unconstrained (DT_DOUBLE) []
model/kern/kernels/1/variance/unconstrained (DT_DOUBLE) []
model/likelihood/variance/unconstrained (DT_DOUBLE) []
线性函数明显与尝试恢复的模型具有不同的名称。
我试图通过在恢复之前重命名变量来解决这个问题,但这不适用于 tensorflow。我也尝试了不同的 saving/restoring 方法,但后来我无法从模型中采样。
保存模型
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 (see above for traceback): Key Linear-44dbadbb-0/A/unconstrained not found in checkpoint...
defer_build()
做了很多事情——但是一次性构建整个模型(即张量流图)的一部分是所有张量流变量和占位符都获得一致的名称,所有名称都相关到模型本身的名称(您通过将 name='model'
关键字参数传递给模型构造函数来设置)。
但是,在您的代码中,Linear
均值函数是在 defer_build()
范围的 外部 构造的。这意味着 gpflow 必须立即为它构建一个图形 - 包括为参数设置变量(在这种情况下为斜率和偏移量)。所有 tensorflow 变量都存在于全局名称 space 中,因此允许创建多个对象的唯一方法是为它们分配随机名称。 (例如,想象一下想要构建相同类型的两个内核的总和!)
幸运的是,修复很简单:只需将 mean 函数的构造移动到 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)
如果您在 "save" 和 "load" 脚本中都执行此操作,一切都会运行,并希望如您所愿。希望这对您有所帮助!
我一直在遵循 saving/restoring 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)
我得到 return:
Linear-eeb5f9f3-0/A/unconstrained (DT_DOUBLE) [1,1] Linear-eeb5f9f3-0/b/unconstrained (DT_DOUBLE) [1] model/X/dataholder (DT_DOUBLE) [15,1] model/Y/dataholder (DT_DOUBLE) [15,1] model/kern/kernels/0/lengthscales/unconstrained (DT_DOUBLE) [] model/kern/kernels/0/variance/unconstrained (DT_DOUBLE) [] model/kern/kernels/1/lengthscales/unconstrained (DT_DOUBLE) [] model/kern/kernels/1/variance/unconstrained (DT_DOUBLE) [] model/likelihood/variance/unconstrained (DT_DOUBLE) []
线性函数明显与尝试恢复的模型具有不同的名称。
我试图通过在恢复之前重命名变量来解决这个问题,但这不适用于 tensorflow。我也尝试了不同的 saving/restoring 方法,但后来我无法从模型中采样。
保存模型
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 (see above for traceback): Key Linear-44dbadbb-0/A/unconstrained not found in checkpoint...
defer_build()
做了很多事情——但是一次性构建整个模型(即张量流图)的一部分是所有张量流变量和占位符都获得一致的名称,所有名称都相关到模型本身的名称(您通过将 name='model'
关键字参数传递给模型构造函数来设置)。
但是,在您的代码中,Linear
均值函数是在 defer_build()
范围的 外部 构造的。这意味着 gpflow 必须立即为它构建一个图形 - 包括为参数设置变量(在这种情况下为斜率和偏移量)。所有 tensorflow 变量都存在于全局名称 space 中,因此允许创建多个对象的唯一方法是为它们分配随机名称。 (例如,想象一下想要构建相同类型的两个内核的总和!)
幸运的是,修复很简单:只需将 mean 函数的构造移动到 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)
如果您在 "save" 和 "load" 脚本中都执行此操作,一切都会运行,并希望如您所愿。希望这对您有所帮助!