feat(abs-target): 方案 B 初版——Y 改 16 步绝对目标角(/180),训练/评估/rollout/ckpt 适配;修复前缀噪声增广对绝对目标的标签污染(eps 直接加到绝对位置=18°);实测一步生成误差 31°、闭环 0%,此配方不成立
This commit is contained in:
+11
-2
@@ -43,6 +43,9 @@ class Samples:
|
||||
sc = {float(m['act_scale']) for m in metas}
|
||||
if len(sc) > 1: raise SystemExit(f'样本目录的 act_scale 不一致 {sorted(sc)}({dirs}):DAgger 样本须与主数据同一版打包')
|
||||
self.act_scale = sc.pop(); self.data_ver = int(metas[0].get('data_ver', 1)) if metas else 1
|
||||
ab = {bool(m.get('abs_target', False)) for m in metas}
|
||||
if len(ab) > 1: raise SystemExit(f'样本目录的 abs_target 不一致 {sorted(ab)}({dirs}):绝对目标与增量标签不能混用')
|
||||
self.abs_target = ab.pop() if ab else False
|
||||
for d in dirs:
|
||||
for fx in sorted(glob.glob(os.path.join(d, '*.X.npy'))):
|
||||
b = fx[:-6]
|
||||
@@ -87,8 +90,14 @@ class Samples:
|
||||
km = (torch.arange(3, device=dev)[None] < pl[:, None]) & m[:, None] # [B,3] 前缀有效步
|
||||
eps = rn(B, 3, 6) * ps * km[..., None].to(X.dtype) # STEP 为单位
|
||||
X[:, PREFIX_SL] = X[:, PREFIX_SL] + eps.reshape(B, 18)
|
||||
Y[:, :3] = Y[:, :3] + eps / self.act_scale # Y 以 act_scale·STEP 为单位
|
||||
Y[torch.arange(B, device=dev), pl.clamp(max=Y.shape[1] - 1)] -= eps.sum(1) / self.act_scale
|
||||
if self.abs_target:
|
||||
# 2026-10-19(方案 B):标签是绝对目标角(/180)。前缀噪声会真实执行 → 前 r 步绝对目标
|
||||
# 跟着累计偏移(eps 加进前缀特征时就是度),第 r 步扣回、之后回到原轨迹。
|
||||
Y[:, :3] = Y[:, :3] + torch.cumsum(eps, 1) / 180.0
|
||||
Y[torch.arange(B, device=dev), pl.clamp(max=Y.shape[1] - 1)] -= eps.sum(1) / 180.0
|
||||
else:
|
||||
Y[:, :3] = Y[:, :3] + eps / self.act_scale # Y 以 act_scale·STEP 为单位
|
||||
Y[torch.arange(B, device=dev), pl.clamp(max=Y.shape[1] - 1)] -= eps.sum(1) / self.act_scale
|
||||
Y.clamp_(-1, 1)
|
||||
ds = float(cfg.get('aug_dq_sigma', 0.0))
|
||||
if ds > 0:
|
||||
|
||||
Reference in New Issue
Block a user