使用不同的图形访问不同的GPflow模型的结果特别慢

时间:2019-12-17 17:03:58

标签: tensorflow gpflow

当迭代分配给不同图形的不同GPFlow模型时,我当前正在处理运行缓慢的代码问题。我的问题的简短描述如下:

我接收不同GP模型的训练值(x和f(x))以及它们的最佳超参数作为输入。然后,我分别在不同的图上定义模型,以避免出现单个非常大且非常慢的图。 最后,为了进行预测,我对模型进行了迭代,结果是这个任务特别慢。请注意,这仅需几秒钟的时间,但是对于我的应用程序而言,它总共需要几天的计算时间。您是否知道这是否正常,是否有办法加快速度?

我的问题在代码中的综合表示如下:

import numpy as np
import tensorflow as tf
import gpflow
import pickle

import numpy as np
import tensorflow as tf
import gpflow
from pyDOE import lhs
import time

def f(X):
    y = (X[0] + 2*X[1] - 7)**2 + (2*X[0]+X[1]-5)**2
    return y

number_of_models = 10
model_dimension = 2

X,Y,HP = [],[],[]

for i in range(number_of_models):
    x = lhs(2,10)
    y = np.empty((0,1))
    for i in range(10):
        y = np.vstack([y,f(x[i])])
    k = gpflow.kernels.RBF(model_dimension)*gpflow.kernels.Matern32(model_dimension) + gpflow.kernels.Matern52(model_dimension)
    meanf = gpflow.mean_functions.Constant(0.)
    m = gpflow.models.GPR(x, y,k,meanf)
    gpflow.train.ScipyOptimizer(method='L-BFGS-B',tol = 1e-7, options = {'ftol' : 1e-7}).minimize(m, maxiter = 10000)
    hp = m.read_trainables()   

    X.append(x)
    Y.append(y)
    HP.append(hp)

    tf.reset_default_graph()
    graph = tf.get_default_graph()
    gpflow.reset_default_session(graph=graph)     


M = []

for i in range(number_of_models):
    with tf.Graph().as_default() as graph:
        with tf.Session(graph=graph).as_default():
            k = gpflow.kernels.RBF(model_dimension)*gpflow.kernels.Matern32(model_dimension) + gpflow.kernels.Matern52(model_dimension)
            meanf = gpflow.mean_functions.Constant(0.)
            m = gpflow.models.GPR(X[i], Y[i],k,meanf)
            m.assign(HP[i])
            M.append([m,graph])   

'''This parts results very slow'''
for i in range(100):
    print('\n i', i)
    x_pred = np.random.rand(20,model_dimension)
    for i in range(number_of_models):
        gr = M[i][1]
        mp = M[i][0]
        t1 = time.time()
        with tf.Session(graph = gr).as_default():
            p,s = mp.predict_y(x_pred)        
            t2 = time.time()
        print(t2-t1)

如果我运行此代码,则预测值超过20点大约需要0.2秒,如果我执行相同的预测但超过1000点,则预测值不会增加太多。有人知道如何减少这种开销吗?

我正在使用Python 3.6,GPflow 1.2.0和Tensorflow 1.12.0的Windows上工作。 预先感谢!

0 个答案:

没有答案