Сохраните метамодель для будущего использования
Я использую openMDAO для создания метамодели совместного кригинга, которую я хотел бы экспортировать, а затем импортировать в другой код Python.
Я нашел сообщение на старом форуме ( http://openmdao.org/forum/questions/444/how-can-i-save-the-metamodel-for-later-use?sort=votes), в котором кто-то использовал 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])
Однако я был вынужден переопределить класс проблемы и установить проблему либо в этом втором сценарии.
Я не знаю, правильно ли это использовать "рассол" или есть другой способ сделать это, если у вас есть предложения:)
1 ответ
В настоящее время не предусмотрено никаких положений для сохранения и перезагрузки суррогатной модели. У вас есть два варианта:
1) Сохранить данные обучения, затем импортировать и повторно обучить модель в другом сценарии. Вы можете позвонить fit
а также predict
методы суррогатной модели непосредственно для этого, импортируя их из библиотеки.
2) Если вы хотите пропустить каждый раз стоимость повторного обучения, то вам нужно изменить саму суррогатную модель, чтобы сохранить результат процесса подгонки, а затем повторно загрузить ее в новый экземпляр: https://github.com/OpenMDAO/OpenMDAO/blob/c69e00f6f9eeb617863e782246e2e7ed1fe9e019/openmdao/surrogate_models/multifi_cokriging.py