保存元模型以供将来使用

时间:2017-05-31 09:12:37

标签: save openmdao

我正在使用openMDAO构建一个我想要导出的co-kriging元模型,然后导入另一个python代码。

我在旧论坛(http://openmdao.org/forum/questions/444/how-can-i-save-the-metamodel-for-later-use?sort=votes)上发现了一条消息,其中有人使用pickle来保存元模型。 我也读过关于录像机的内容,但是我在我进行的不同测试中没有取得成功。

有没有办法保存元模型并在未来的代码中使用它?

编辑:我想我找到了一种使用' pickle'的解决方案。我成功地用克里金元模型做了这个,但我想我会和共同克里金一样工作。

就像“老人”中的帖子一样。 openMDAO的论坛,我将训练好的元模型保存在一个文件中,然后在另一个python脚本中重用它。我在这里加入了保存训练有素的元模型的代码部分:

cok = MultiFiCoKrigingSurrogate()

prob = Problem(Simulation(cok, nfi=2))
prob.setup(check=False)

prob['mm.train:x1']     = DATA_HF_dim
prob['mm.train:x1_fi2'] = DATA_LF_dim

prob['mm.train:y1']     = rastri_e
prob['mm.train:y1_fi2'] = rastri_c

prob.run()

import pickle
f = open('meta_model_info.p','wb')
pickle.dump(prob,f)
f.close

将训练好的元模型保存在文件meta_model_info.p中后,我可以将其加载到另一个脚本中,跳过学习阶段。第二个脚本的部分代码在这里:

class Simulation(Group):

    def __init__(self, surrogate, nfi):
        super(Simulation, self).__init__()
        self.surrogate = surrogate

        mm = self.add("mm", MultiFiMetaModel(nfi=nfi))
        mm.add_param('x1', val=0.)

        mm.add_output('y1', val=(0.,0.), surrogate=surrogate)

cok = MultiFiCoKrigingSurrogate()

prob = Problem(Simulation(cok, nfi=2))
prob.setup(check=False)

import pickle

f = open('meta_model_info.p','rb')
clf = pickle.load(f)

pred_cok_clf = []
for x in inputs:
    clf['mm.x1'] = x
    clf.run()
    pred_cok_clf.append(clf['mm.y1'])

pred_mu_clf    = np.array([float(p[0]) for p in pred_cok_clf])
pred_sigma_clf = np.array([float(p[1]) for p in pred_cok_clf])

然而,我被迫重新定义问题的类,并在第二个脚本中设置问题。

我不知道这是否正确使用了' pickle'或者,如果您有其他方法,如果您有任何建议:)

1 个答案:

答案 0 :(得分:0)

目前没有任何关于保存和重新加载代理模型的规定。您有两种选择: 1)保存训练数据,然后在其他脚本中导入并重新训练模型。您可以通过从库中导入代理模型来直接调用代理模型的fitpredict方法。

2)如果您希望每次都跳过重新训练的成本,那么您需要修改代理模型本身以保存拟合过程的结果,然后将其重新加载到新实例中:{ {3}}