Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用均值函数恢复GPflow模型不';行不通_Python_Save_Mean_Restore_Gpflow - Fatal编程技术网

Python 用均值函数恢复GPflow模型不';行不通

Python 用均值函数恢复GPflow模型不';行不通,python,save,mean,restore,gpflow,Python,Save,Mean,Restore,Gpflow,我一直在成功地遵循保存/恢复GPflow模型的方法。但现在我遇到了麻烦 当我尝试用线性平均值函数恢复模型时,恢复会因错误而崩溃 我认为问题在于tensorflow线性平均函数对象的命名约定。上面的“-44DBB-0”是随机的,每次重建模型时都会更改,因此如果我在保存模型时检查张量名称 from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file print_tensors_in_ch

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

当我尝试用线性平均值函数恢复模型时,恢复会因错误而崩溃

我认为问题在于tensorflow线性平均函数对象的命名约定。上面的“-44DBB-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] 线性-eeb5f9f3-0/b/无约束(DT_DOUBLE)[1] 型号/X/数据保持器(双DT_)[15,1] 型号/Y/数据保持器(双DT_)[15,1] model/kern/kernels/0/lengthscales/无约束(DT_-DOUBLE)[] model/kern/kernels/0/方差/无约束(DT_-DOUBLE)[] model/kern/kernels/1/长度刻度/无约束(DT_-DOUBLE)[] model/kern/kernels/1/方差/无约束(DT_-DOUBLE)[] 模型/可能性/方差/无约束(DT_-DOUBLE)[]

其中,线性函数显然与试图恢复的模型具有不同的名称

我试图通过在恢复之前重命名变量来解决这个问题,但这对tensorflow不起作用。我还尝试了不同的保存/恢复方法,但是在能够从模型中采样时遇到了问题

保存模型 恢复模型 代码在
save\u path=saver.restore(tf\u session,“./model.ckpt”)
处崩溃,错误为:

NotFoundError(回溯见上文):在检查点中找不到键Linear-44DBDBB-0/A/未约束

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

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

幸运的是,修复很容易:只需将均值函数的构造移到
defer\u 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)
如果您在“保存”和“加载”脚本中都这样做,那么一切都会正常运行,希望这能帮助您


    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)

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)