我的使用场景是这样的:我有一个函数,它接受用户选择的内核,然后我会遍历数据集中每一个日期,并使用高斯过程回归来估计使用指定内核的模型。然而,由于我指向的是内核对象,我需要在运行下一次迭代之前将其重置为默认值。
import gpflowclass WrapperClass(object): def __init__(self, kernel): super().__init__() self.kernel = kernel def fit(self, X, y): m = gpflow.models.GPR(X, y, self.kernel) # 我需要在这里重置内核# 后续代码def some_function(Xs, ys, ts, f): for t in ts: X = Xs.loc[t] # pandas dataframe y = ys.loc[t] # pandas f.fit(X, y)k1 = gpflow.kernels.RBF(1)k2 = gpflow.kernels.White(0.1)k = k1 + k2f = WrapperClass(k)sume_function(Xs, ys, ts, f)
我找到了内核上的read_trainables()方法,因此一种策略是保存用户提供的设置,但似乎没有办法设置它们?
In [7]: k1.read_trainables()Out[7]: {'Sum/rbf/lengthscales': array(1.), 'Sum/rbf/variance': array(1.)}
谢谢,Steve
回答:
您可以使用assign()方法来设置参数化对象(模型、内核、可能性等)的参数:k1.assign(k1.read_trainables())
(或者其他路径-值对的字典)。不过,您也可以创建一个新的内核对象!
请注意,每次您创建新的参数化对象时 – 这适用于内核和模型,如您的fit()方法中 – 您会在tensorflow图中添加操作,如果图增长很多,可能会显著减慢图计算速度。您可能需要手动处理tf.Graph()和tf.Session(),以便为每个模型保持它们独立。(请参阅新版GPflow文档中的关于会话处理和更多技巧与窍门的笔记本。)