当迭代分配给不同图形的不同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上工作。 预先感谢!