1、同步代理模型与PSO采样范围

feature/ModelOpt20260526
1294271022 3 weeks ago
parent 3db680257b
commit 72e8ced330

@ -43,11 +43,11 @@ params: # 储层与井筒物理参数采样设置
active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表
log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数
ranges: # 各物理参数采样范围
k: [1.0e-4, 100.0] # 渗透率采样范围
k: [1.0e-3, 10.0] # 渗透率采样范围
skin: [-10.0, 10.0] # 表皮系数采样范围
wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围
phi: [1.0e-2, 0.50] # 孔隙度采样范围
h: [2.0, 100.0] # 储层厚度采样范围
h: [2.0, 50.0] # 储层厚度采样范围
Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围
fixed_params: # 固定不参与采样的物理参数
Cf:
@ -59,9 +59,9 @@ params: # 储层与井筒物理参数采样设置
strategies: # 按参数分别定义定向采样策略
k:
components: # 分段采样组件列表
- {prob: 0.55, range: [1.0e-4, 1.0e-1], scale: "log"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度
- {prob: 0.30, range: [1.0e-1, 1.0], scale: "log"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度
- {prob: 0.15, range: [1.0, 100.0], scale: "log"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度
- {prob: 0.45, range: [1.0e-3, 1.0e-1], scale: "log"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度
- {prob: 0.35, range: [1.0e-1, 1.0], scale: "log"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度
- {prob: 0.20, range: [1.0, 10.0], scale: "log"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度
skin:
components: # 分段采样组件列表
- {prob: 0.35, range: [-10.0, -3.0], scale: "linear"} # 定向采样组件prob 为概率range 为范围scale 为采样尺度

@ -30,15 +30,13 @@ def main() -> None:
parser.add_argument("--no-schedule", action="store_true")
parser.add_argument(
"--sample-weight-mode",
choices=["none", "pso_domain", "pso_domain_risk"],
choices=["none", "risk_region"],
default="none",
help="Optional sample weighting; default keeps the original unweighted training behavior",
help="Optional risk-region sample weighting; default keeps the original unweighted training behavior",
)
parser.add_argument("--pso-outside-weight", type=float, default=0.5)
parser.add_argument("--pso-inside-weight", type=float, default=1.0)
parser.add_argument("--risk-weight", type=float, default=2.5)
parser.add_argument("--skin-lt-minus8-weight", type=float, default=3.5)
parser.add_argument("--sample-weight-min", type=float, default=0.25)
parser.add_argument("--sample-weight-min", type=float, default=1.0)
parser.add_argument("--sample-weight-max", type=float, default=4.0)
args = parser.parse_args()
@ -67,8 +65,6 @@ def main() -> None:
huber_beta=float(args.huber_beta),
use_schedule=not bool(args.no_schedule),
sample_weight_mode=str(args.sample_weight_mode),
pso_outside_weight=float(args.pso_outside_weight),
pso_inside_weight=float(args.pso_inside_weight),
risk_weight=float(args.risk_weight),
skin_lt_minus8_weight=float(args.skin_lt_minus8_weight),
sample_weight_min=float(args.sample_weight_min),

@ -76,11 +76,9 @@ class TimeConditionedTrainConfig:
huber_beta: float = 0.05
use_schedule: bool = True
sample_weight_mode: str = "none"
pso_outside_weight: float = 0.5
pso_inside_weight: float = 1.0
risk_weight: float = 2.5
skin_lt_minus8_weight: float = 3.5
sample_weight_min: float = 0.25
sample_weight_min: float = 1.0
sample_weight_max: float = 4.0
device: str = "cuda" if torch.cuda.is_available() else "cpu"
@ -143,29 +141,15 @@ def _build_sample_weight(data: dict, cfg: TimeConditionedTrainConfig, split: str
n = int(data[f"X_params_{split}"].shape[0])
if mode in {"none", "off", "false"}:
return np.ones((n,), dtype=np.float32)
if mode not in {"pso_domain", "pso_domain_risk"}:
if mode != "risk_region":
raise ValueError(f"Unknown sample_weight_mode={cfg.sample_weight_mode!r}")
params = _raw_params_from_processed_split(data, split)
pso_mask = (
(params["k"] >= 0.001)
& (params["k"] <= 10.0)
& (params["skin"] >= -10.0)
& (params["skin"] <= 10.0)
& (params["wellboreC"] >= 1.0e-4)
& (params["wellboreC"] <= 2.0)
& (params["phi"] >= 0.01)
& (params["phi"] <= 0.5)
& (params["h"] >= 2.0)
& (params["h"] <= 50.0)
)
weight = np.where(pso_mask, float(cfg.pso_inside_weight), float(cfg.pso_outside_weight)).astype(np.float32)
if mode == "pso_domain_risk":
risk = pso_mask & (params["skin"] < -5.0) & (params["wellboreC"] > 0.1)
skin_extreme = pso_mask & (params["skin"] < -8.0)
weight[risk] = np.maximum(weight[risk], float(cfg.risk_weight))
weight[skin_extreme] = np.maximum(weight[skin_extreme], float(cfg.skin_lt_minus8_weight))
weight = np.ones((n,), dtype=np.float32)
risk = (params["skin"] < -5.0) & (params["wellboreC"] > 0.1)
skin_extreme = params["skin"] < -8.0
weight[risk] = np.maximum(weight[risk], float(cfg.risk_weight))
weight[skin_extreme] = np.maximum(weight[skin_extreme], float(cfg.skin_lt_minus8_weight))
weight = np.clip(weight, float(cfg.sample_weight_min), float(cfg.sample_weight_max))
return weight.astype(np.float32)

Loading…
Cancel
Save