You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打印优化器类内Kriging代理对象的rmse值

嵌套在优化器类内的Kriging代理对象RMSE打印方案

要实现和OpenMDAO官方Kriging模块示例一致的RMSE打印效果,按以下步骤排查调整即可:

  • 先确认RMSE计算开关已开启
    OpenMDAO原生KrigingSurrogate只有在初始化时传入eval_rmse=True才会在训练阶段计算各输出的RMSE值,默认参数虽然是开启状态,但自定义封装surr类时很容易误传参数关闭该功能,先核对surr类内部初始化Kriging实例的参数配置。
  • 校验代理类本身的RMSE属性是否正常生成
    在surr类的训练方法末尾加一行调试代码,确认训练流程本身能正常算出RMSE:
    # 训练逻辑执行完成后插入
    print("模型训练阶段RMSE校验:", self._rmse)
    
    原生OpenMDAO Kriging训练完成后,会把各输出对应的RMSE存在实例的_rmse字典属性中,key为输出变量名,value为对应RMSE浮点值。如果这一步打印不出内容,先排查训练逻辑有没有走完、训练数据维度是否匹配。
  • 打通优化器类到代理实例的属性访问路径
    因为surr实例嵌套在surrOpt父类内部,直接跨类访问私有属性很容易因为作用域、实例未初始化的问题读不到值,两种实现方案二选一即可:
    1. 在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(目标输出名)取值打印即可,输出格式和官方示例完全对齐。
    2. 不想修改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属性

内容的提问来源于stack exchange,提问作者tufan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:15:41