fix(actpred): 修复归一化统计不一致等 5 项问题并增强可复现性

- train/val 归一化统计量改为仅用训练集计算并落盘复用,修复 val loss 不可信
- predict.py 统计文件路径改用 os.path 处理,修复跨平台与无分隔符路径问题
- dataset.py jpg/png 混合时统一按文件名排序,保证时间顺序
- 新增 --seed 全局随机种子(含 DataLoader generator),训练可复现
- 新增 --max-grad-norm 梯度裁剪(默认 1.0),防 GRU 梯度爆炸
- get_episode_count 与数据集目录过滤条件对齐,避免无效目录导致索引错位
- 空验证集返回 inf 并保底保存最终权重,避免伪造 best 模型
- 清理 export_onnx.py 重复分支死代码
This commit is contained in:
qing committed 2026-08-08 14:00:49 +00:00
1 parent 85e5a4a054
commit 73b72d6889
5 files changed
+58 -18

No files matched your search

+10 -3
View File
@@ -35,7 +35,8 @@ class ActionDataset(Dataset):
continue
actions = np.load(actions_path).astype(np.float32)
n_frames = len(actions)
image_files = sorted(images_dir.glob("*.jpg")) + sorted(images_dir.glob("*.png"))
image_files = sorted(list(images_dir.glob("*.jpg")) + list(images_dir.glob("*.png")),
key=lambda p: p.name)
n_images = len(image_files)
n = min(n_frames, n_images)
for t in range(history_len, n):
@@ -73,9 +74,15 @@ class ActionDataset(Dataset):
return None
@staticmethod
def get_episode_count(data_dir: str) -> int:
def _valid_episode_dirs(data_dir: str) -> list:
data_path = Path(data_dir)
return len([d for d in data_path.iterdir() if d.is_dir()])
return sorted([d for d in data_path.iterdir()
if d.is_dir() and (d / "actions.npy").exists() and (d / "images").is_dir()])
@staticmethod
def get_episode_count(data_dir: str) -> int:
# 与 __init__ 的过滤条件保持一致,避免 split_episodes 索引错位
return len(ActionDataset._valid_episode_dirs(data_dir))
class DataRecorder: