From 7ec8c9d0e9ff4ed3ac1b271406500868787bafbb Mon Sep 17 00:00:00 2001 From: qing <1776177662@qq.com> Date: Fri, 14 Aug 2026 06:31:15 +0000 Subject: [PATCH] =?UTF-8?q?fix(actpred):=20=E8=AE=AD=E7=BB=83=E6=97=B6=20a?= =?UTF-8?q?ction=20stats=20=E5=AE=8C=E6=95=B4=E8=B7=AF=E5=BE=84=E4=BC=A0?= =?UTF-8?q?=E7=BB=99=20val=5Fds=EF=BC=8Ccheckpoint=20=E5=AD=98=E8=A3=B8?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit normalize_actions 默认改为 True 后暴露的潜伏 bug:stats 保存到 checkpoint_dir 后,cfg 只留裸文件名,val_ds 按 cwd 解析导致 FileNotFoundError。现改为验证集用完整路径构建,checkpoint 配置 存裸文件名(推理端按 checkpoint 目录解析)。 同步修正 test_warn_init_from_mismatch 对默认值的隐式依赖。 --- actpred/test_actpred.py | 2 ++ actpred/train.py | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/actpred/test_actpred.py b/actpred/test_actpred.py index 352913c..316c46e 100644 --- a/actpred/test_actpred.py +++ b/actpred/test_actpred.py @@ -666,6 +666,8 @@ class TestParseCheckpointConfig(unittest.TestCase): """--init-from 兼容性警告:normalize 或 action_dim 不一致时提示""" from config import warn_init_from_mismatch cfg = Config() + # 显式设定当前运行的 normalize 值,不依赖默认值(默认已改为 True) + cfg.data.normalize_actions = False init_cfg = { "data": {"normalize_actions": True, "action_dim": 12}, } diff --git a/actpred/train.py b/actpred/train.py index d2ca160..5b19a5c 100644 --- a/actpred/train.py +++ b/actpred/train.py @@ -157,19 +157,24 @@ def main(): augment=cfg.train.augment, predict_delta=cfg.train.predict_delta, rollout_len=cfg.train.rollout_len, imu_dim=cfg.data.imu_dim) + auto_stats = False if cfg.data.normalize_actions and not cfg.data.action_stats_path: # 归一化统计量必须只用训练集计算,再供验证集复用,否则 val loss 不可信 stats_path = os.path.join(cfg.train.checkpoint_dir, "action_stats.npy") np.save(stats_path, train_ds.get_action_stats()) print(f"Action stats saved to: {stats_path}") - # 只存裸文件名:推理端按 checkpoint 目录解析相对路径 - cfg.data.action_stats_path = "action_stats.npy" + # 验证集构建需要完整路径(相对路径按 cwd 解析会找不到文件) + cfg.data.action_stats_path = stats_path + auto_stats = True val_ds = ActionDataset( cfg.data.data_dir, cfg.data.history_len, cfg.data.action_dim, cfg.data.image_width, cfg.data.image_height, cfg.data.normalize_actions, cfg.data.action_stats_path, val_indices, cfg.data.frame_len, predict_delta=cfg.train.predict_delta, rollout_len=cfg.train.rollout_len, imu_dim=cfg.data.imu_dim) + if auto_stats: + # checkpoint 配置只存裸文件名:推理端按 checkpoint 目录解析相对路径 + cfg.data.action_stats_path = "action_stats.npy" print(f"Samples: {len(train_ds)} train, {len(val_ds)} val") if len(train_ds) == 0: