2017-05-31 49 views
2

我正在使用openMDAO構建一個共克隆元模型,我想導出並導入另一個Python代碼。保存元模型供將來使用

我在舊論壇(http://openmdao.org/forum/questions/444/how-can-i-save-the-metamodel-for-later-use?sort=votes)上發現了一條消息,其中有人使用泡菜來保存元模型。 我也讀了關於記錄器,但我沒有成功地在我執行的不同測試。

有沒有辦法保存元模型並將其用於未來的代碼?


編輯:我想我發現用「泡菜」的一種解決方案。我成功地用克里格元模型來做到這一點,但我認爲我會和克里格一樣工作。

就像在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]) 

但是我不得不重新定義類問題的問題,並設置無論是在這第二個腳本。

我不知道這是否是一個正確使用的「泡菜」或是否有另一種方式做到這一點,如果你有任何建議:)

回答

0

目前還不能用於保存和重新加載任何規定代理模型。您有兩種選擇: 1)保存訓練數據,然後在其他腳本中導入並重新訓練模型。您可以直接從庫中導入代理模型的fitpredict方法。 2)如果你想跳過每次重新訓練的成本,那麼你需要修改代理模型本身來保存擬合過程的結果,然後再重新加載到新的實例中: https://github.com/OpenMDAO/OpenMDAO/blob/c69e00f6f9eeb617863e782246e2e7ed1fe9e019/openmdao/surrogate_models/multifi_cokriging.py#L322