用均值函数恢复GPflow模型是不可行的

2024-06-17 13:11:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直遵循成功保存/恢复GPflow模型的方法。但现在我遇到了麻烦。你知道吗

当我试图用一个线性均值函数来恢复一个模型时,这个恢复会因为一个错误而崩溃。你知道吗

我认为这个问题来自于张量流线性平均函数对象的命名约定。上面的“-44dbabb-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)

我得到回报:

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不起作用。我还尝试了不同的保存/恢复方法,但是在从模型中采样时遇到了问题。你知道吗

保存模型


    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...


Tags: path模型importmodelsessionsavetfnp
1条回答
网友
1楼 · 发布于 2024-06-17 13:11:47

defer_build()做了很多事情,但是一次性构建整个模型(即tensorflow图)的一个部分是所有tensorflow变量和占位符获得一致的名称,它们的名称都与模型本身的名称相关(通过将name='model'关键字参数传递给模型构造函数来设置)。你知道吗

但是,在代码中,Linear平均函数是在defer_build()范围的之外构造的。这意味着gpflow必须立即为其构建一个图形-包括为参数设置变量(在本例中为斜率和偏移量)。所有tensorflow变量都存在于一个全局名称空间中,因此允许创建多个对象的唯一方法是为它们指定随机名称。(例如,想象一下想要构造两个相同类型的内核的和!)你知道吗

幸运的是,修复很容易:只需将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”脚本中都这样做,那么一切都会正常运行,并希望如您所期望的那样。希望这有帮助!你知道吗

相关问题 更多 >