feat(actpred): log_range 归一化——spk 两列对数尺度修正精度错配

fixed_range 线性 min-max 下常用值挤在低端(10Hz→0.002),闭环反馈
中小绝对误差=大相对误差(模型 C/D 发散根因)。新增 normalize_mode=
log_range:spk.F/spk.delay 用 log10(1+x) 对数尺度(10Hz→0.27),
舵机列保持线性。全链路接入(dataset/pretrain/predict/onnx/hailo/
calibration/export),与 v3 审计 none 模式/元数据自动识别合并。
This commit is contained in:
qing committed 2026-08-14 21:38:14 +00:00
1 parent fc310c9081
commit 1cf428f384
11 files changed
+306 -66

No files matched your search

+8 -5
View File
@@ -173,15 +173,17 @@ def check_token_ranges(wrapper: "DeployWrapper", frame_len: int, height: int,
全部量化成 0),HEF 输出对任何输入恒定。必须在编译前拦截。
归一化模型(normalize_actions)的 HEF 输入是归一化后的历史,
检查输入须与推理端一致(zscore → z 空间采样;fixed_range → [0,1])。
检查输入须与推理端一致(zscore → z 空间采样;fixed_range /
log_range → [0,1])。
"""
rng = np.random.default_rng(42)
raw = rng.integers(0, 256, size=(height, width, 3), dtype=np.uint8)
norm = (raw.astype(np.float32) / 255.0 - IMAGENET_MEAN) / IMAGENET_STD
frames = [torch.tensor(norm[None]) for _ in range(frame_len)]
history = rng.uniform(0.0, 500.0, size=(1, 1, history_len, action_dim))
if normalize_mode == "fixed_range":
# fixed_range 归一化空间即 [0,1],直接在归一化空间采样
from action_norm import is_range_mode
if is_range_mode(normalize_mode):
# fixed_range / log_range 归一化空间即 [0,1],直接在归一化空间采样
history = rng.uniform(0.0, 1.0, size=(1, 1, history_len, action_dim))
elif action_stats_path is not None:
stats = np.load(action_stats_path)
@@ -235,9 +237,10 @@ def main():
h, w = cfg.data.image_height, cfg.data.image_width
f = cfg.data.frame_len
stats_path = None
if cfg.data.normalize_actions and cfg.data.normalize_mode != "fixed_range":
from action_norm import is_range_mode
if cfg.data.normalize_actions and not is_range_mode(cfg.data.normalize_mode):
# 与 predict.py 语义一致:相对路径按 checkpoint 目录解析
# (fixed_range 模式免 stats 文件,跳过)
# (fixed_range / log_range 模式免 stats 文件,跳过)
stats_path = cfg.data.action_stats_path
if not stats_path:
stats_path = os.path.join(