如何打印优化器类内Kriging代理对象的rmse值
嵌套在优化器类内的Kriging代理对象RMSE打印方案
要实现和OpenMDAO官方Kriging模块示例一致的RMSE打印效果,按以下步骤排查调整即可:
- 先确认RMSE计算开关已开启
OpenMDAO原生KrigingSurrogate只有在初始化时传入eval_rmse=True才会在训练阶段计算各输出的RMSE值,默认参数虽然是开启状态,但自定义封装surr类时很容易误传参数关闭该功能,先核对surr类内部初始化Kriging实例的参数配置。 - 校验代理类本身的RMSE属性是否正常生成
在surr类的训练方法末尾加一行调试代码,确认训练流程本身能正常算出RMSE:
原生OpenMDAO Kriging训练完成后,会把各输出对应的RMSE存在实例的# 训练逻辑执行完成后插入 print("模型训练阶段RMSE校验:", self._rmse)_rmse字典属性中,key为输出变量名,value为对应RMSE浮点值。如果这一步打印不出内容,先排查训练逻辑有没有走完、训练数据维度是否匹配。 - 打通优化器类到代理实例的属性访问路径
因为surr实例嵌套在surrOpt父类内部,直接跨类访问私有属性很容易因为作用域、实例未初始化的问题读不到值,两种实现方案二选一即可:- 在
surr类内新增公开访问方法,避免外部直接调用私有属性:
后续在# surr类内部新增方法 def get_rmse(self, output_var): if not hasattr(self, '_rmse'): raise RuntimeError("请先完成代理模型训练再获取RMSE") return self._rmse[output_var]surrOpt流程里需要打印RMSE时,直接调用surr.get_rmse(目标输出名)取值打印即可,输出格式和官方示例完全对齐。 - 不想修改
surr类代码的话,就在surrOpt类执行完代理训练的节点后,把RMSE值挂载为优化器自身的属性,后续直接调用:# surrOpt类中,self.surr训练完成的代码后插入 self.surr_rmse = self.surr._rmse # 需要打印的位置直接遍历输出,和官方示例效果一致 for var_name, val in self.surr_rmse.items(): print(f"[Kriging代理] 输出{var_name} RMSE = {val:.6f}")
- 在
- 常见避坑点
- 不要在代理模型训练完成前的流程节点读取RMSE,此时
_rmse属性尚未生成,会触发属性不存在报错 - 多输出场景下注意核对
_rmse字典的key和你定义的输出名完全一致,避免触发key error - 如果是自行修改过的Kriging实现而非OpenMDAO原生版本,需要在训练阶段的留一校验/测试集校验逻辑末尾,手动把计算得到的RMSE赋值给
self._rmse属性
- 不要在代理模型训练完成前的流程节点读取RMSE,此时
内容的提问来源于stack exchange,提问作者tufan
相关产品推荐
相关产品推荐

