fix(actpred): 修复动作归一化统计量未覆盖 history 导致的 z-score 爆炸
两个问题(本轮归一化编译链路上实测暴露): 1. 统计量只按 targets 计算:targets 中恒定的列 std 落到 1e-8 地板值,而 history 窗口可能含该列的其他取值(.mt 脚本前几行), z-score 爆炸(实测 (90-45)/1e-8=4.5e9)→ act_tokens ±1e9 → DFC optimize 报 NegativeSlopeExponentNonFixable(desired shift 23 > 15 data bits)。pretrain_mt.py 与 dataset.py 的统计量改为 history∪target 联合计算,修复后校准数据 max|z| = 4.77。 2. action_stats_path 存成含目录的相对路径("./checkpoints/ action_stats.npy"),推理端(predict/export_deploy/gen_calibration) 按 checkpoint 目录解析时二次拼接成 checkpoints/./checkpoints, 导出直接 FileNotFoundError。train.py/pretrain_mt.py 改存裸文件名 "action_stats.npy"(stats 与 checkpoint 同目录,语义一致)。 新增回归测试 test_stats_cover_history_values(history 独有取值不 得被 1e-8 地板值打爆),全量 77 通过。 归一化重编译全链路通过:token 量级 |img|=0.53 |act|=2.93 健康, optimize 通过,连通性检查 5/5,HEF 2.02MB 已部署 Pi 待 _npu_test 复验。
This commit is contained in:
1 parent
52c0ade3c4
commit
316758d80e
4 files changed
+41
-4
No files matched your search
@@ -261,6 +261,30 @@ class TestActionDataset(unittest.TestCase):
|
||||
self.assertIn("WARNING", buf.getvalue())
|
||||
self.assertEqual(len(ds), 8 - 3) # 按较少者(8 帧图像)截断
|
||||
|
||||
def test_stats_cover_history_values(self):
|
||||
"""归一化统计量必须覆盖 history 独有取值,否则 z-score 爆炸
|
||||
|
||||
col0 仅在 history(首行)出现 100,targets 全为 0:只按 targets
|
||||
算统计时 std 落到 1e-8 地板值,z=(100-0)/1e-8=1e10。
|
||||
"""
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
base = Path(tmpdir)
|
||||
ep_dir = base / "episode_0001"
|
||||
images_dir = ep_dir / "images"
|
||||
images_dir.mkdir(parents=True, exist_ok=True)
|
||||
for i in range(7):
|
||||
Image.fromarray(np.random.randint(0, 255, (16, 16, 3), dtype=np.uint8)
|
||||
).save(images_dir / f"{i:04d}.jpg")
|
||||
actions = np.zeros((7, 4), dtype=np.float32)
|
||||
actions[0, 0] = 100.0
|
||||
np.save(ep_dir / "actions.npy", actions)
|
||||
ds = ActionDataset(tmpdir, history_len=5, action_dim=4,
|
||||
normalize_actions=True)
|
||||
self.assertGreater(ds._action_std[0], 1.0) # 而非 1e-8 地板值
|
||||
z_max = (np.abs(actions[:, 0] - ds._action_mean[0])
|
||||
/ ds._action_std[0]).max()
|
||||
self.assertLess(z_max, 10.0)
|
||||
|
||||
|
||||
class TestConfig(unittest.TestCase):
|
||||
"""测试配置和 CLI 参数"""
|
||||
|
||||
Reference in new issue
Block a user