日期: 2025-11-20 类型: 功能开发 状态: ✅ 已完成
在训练流程中,TrainingBuffer负责从HDF5文件加载数据并提供给Trainer使用。为了验证buffer的数据加载逻辑是否正确,需要一个工具来:
在正式训练前,这个工具可以帮助开发者快速发现数据问题,避免无效训练。
文件: data/training_buffer.py
功能:
技术细节:
def save_to_hdf5(self, filepath: str):
"""
Save all buffer samples to HDF5
- 动态字段检测: 通过 self.samples[0].keys() 获取所有字段
- 智能压缩: 大型数组(size > 1000)使用gzip压缩
- 元数据记录: num_frames, created_at, source, buffer_capacity, available_keys
"""
关键设计:
功能:
| 检测异常reward值( | reward | >= 0.1) |
命令行接口:
# 基本用法
python scripts/check_buffer.py --files data/episodes/episode_xxx.hdf5
# 多文件
python scripts/check_buffer.py --files data/episodes/*.hdf5
# 自定义输出和阈值
python scripts/check_buffer.py --files episode.hdf5 --output custom.hdf5 --threshold 0.5
异常检测逻辑:
| 阈值: | reward | >= 0.1(默认) |
输出格式(全英文):
Abnormal sample #49: reward=-10.0000, state_shape=(540, 960, 3),
actions=[move=[0.00012873 0. 0.05386265 0.], attack=[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]],
next_state_shape=(540, 960, 3), done=N/A
# 获取所有字段(从第一个样本)
sample_keys = list(self.samples[0].keys())
# 遍历保存所有字段
for key in sample_keys:
value = sample[key]
if value is not None:
if isinstance(value, np.ndarray) and value.size > 1000:
grp.create_dataset(key, data=value, compression='gzip')
else:
grp.create_dataset(key, data=value)
优势:
参考 train.py 和 label_data.py:
argparse 处理命令行参数"="*60 分隔线[标签] 格式日志([Load], [Check], [Save], [ERROR])try-except + traceback.print_exc()测试文件: data/episodes/episode_20251120_221647.hdf5
结果:
Total samples: 95
Abnormal samples: 1 (1.05%)
Output saved to: data/buffer_check\buffer_samples_20251120_230817.hdf5
异常样本分析:
文件大小: 176.55 MB(95个样本,包含完整state和next_state图像)
scripts/check_buffer.py - Buffer验证脚本(128行)docs/logs/2025-11-20_buffer_check_tool.md - 本开发日志data/training_buffer.py
save_to_hdf5(filepath) (52行)h5py, os, datetimedocs/logs/development_log.md
本次开发实现了TrainingBuffer的数据验证工具,具有以下特点:
✅ 动态适配: 自动检测所有字段,适配未来扩展 ✅ 独立实现: Buffer保存逻辑与DataManager分离 ✅ 代码规范: 遵循项目代码风格 ✅ 实用性强: 帮助快速发现数据问题
该工具已通过测试,可用于日常开发调试。