恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
如何从零复现D4RL数据集:用Minari重建Maze2D的完整实战教程
首页
资讯中心
/
如何从零复现D4RL数据集:用Minari重建Maze2D的完整实战教程
如何从零复现D4RL数据集:用Minari重建Maze2D的完整实战教程
发布时间:2026/10/10 18:31:13
【免费下载链接】MinariA standard format for offline reinforcement learning datasets, with popular reference datasets and related utilities项目地址https://gitcode.com/gh_mirrors/mi/Minari点击查看免费下载Minari 是离线强化学习Offline RL领域的数据集标准格式与配套工具库。本文将带你从零复现 D4RL 数据集用 Minari 的 DataCollector 完整重建经典的 Maze2D 迷宫数据集核心代码不到 100 行新手也能轻松上手 为什么用 Minari 复现 D4RL 数据集D4RL 是离线强化学习最经典的基准数据集其中的Maze2DPointMaze 迷宫导航任务长期被用作算法验证的入门考。传统做法是手改 D4RL 原始生成脚本自己维护 HDF5 格式、手动统计奖励元数据、还要记住环境配置才能复现。Minari 把数据生成 → 格式落盘 → 元数据统计 → 环境复现这条链路全部标准化了能力传统手动收集MinariDataCollector落盘格式自己维护 HDF5 / CSV标准 Arrow / HDF5 格式元数据手动记录自动生成回合奖励统计sum/mean/std…环境复现无保障保存 env_spec可用recover_environment()一键恢复数据集管理无minari list / show / download命令行全家桶官方教程 point_maze_dataset.py 正是用 Minari 重建 Maze2D 数据集的完整示范下面我们就沿着它把每一步讲透。三步生成原理Q迭代规划 PD控制 数据落盘复现 Maze2D 的核心思路可拆成3 步这也是官方教程的结构路径规划用 Q-Value Iteration动态规划在离散网格迷宫上求解最优路径输出一串路点waypoints动作生成用 PD 控制器把位置误差 速度换算成连续力矩动作驱动小球跟随路点数据落盘用DataCollector包装器记录全部转移数据生成标准 Minari 数据集。第一步Q-Value Iteration 求解迷宫最优路径MuJoCo 的迷宫可以离散化成网格动作空间随之缩小为上/下/左/右 4 个方向。教程中的 QIteration 类 通过 50 次 Bellman 更新折扣因子 0.99迭代出最优 Q 值def get_q_values(self, num_itrs50, discount0.99): q_fn np.zeros((self.num_states, self.num_actions)) for _ in range(num_itrs): v_fn np.max(q_fn, axis1) q_fn self.rew_matrix discount * self.transition_matrix.dot(v_fn) return q_fn拿到最优 Q 值后按策略π(s) argmax_a Q*(s, a)即可从任意起点走到目标输出一张当前格子 → 下一格子的路点字典例如{(5,1): (4,1), (4,1): (4,2), …}。第二步PD 控制器把路点转成连续动作D4RL 原版使用 PD 控制器输出连续力矩比例项 P误差目标位置 − 当前位置越大推力越强微分项 D按速度阻尼防止冲过目标点。合并成控制律τ kp·(p_goal − p_agent) kd·v_agent教程采用kp10.0, kd-1.0。另外每个路点的连续坐标上会叠加0~0.2的均匀噪声让离线数据中的轨迹更丰富、更有多样性——这正是 D4RL 数据集探索感的来源。第三步自定义 StepDataCallback 切分回合Maze2D 是持续任务continuing task到达目标后环境不会 terminated而是随机生成新目标继续跑。因此不能靠环境自带的终止信号切分回合需要自定义回调继承 StepDataCallbackdef __call__(self, env, obs, info, actionNone, rewNone, terminatedNone, truncatedNone): step_data super().__call__(env, obs, info, action, rew, terminated, truncated) if step_data[info][success]: # 到达目标 手动截断回合 step_data[truncation] True step_data[info][qpos] obs[observation][:2] # 额外记录位置/速度/目标 step_data[info][qvel] obs[observation][2:] step_data[info][goal] obs[desired_goal] return step_data这个回调同时完成了两件事按成功切分 episode、把 qpos/qvel/goal 写进 infosD4RL 下游算法评估时必需。一键安装环境准备与依赖配置先装 Minari 和迷宫环境Gymnasium-Robotics 提供PointMaze_*环境及 MuJoCo 物理引擎pip install minari[all] pip install gymnasium-robotics如果想从源码运行本仓库可以克隆后安装git clone https://gitcode.com/gh_mirrors/mi/Minari cd Minari pip install -e .[all]数据收集实战核心代码逐段讲解一切准备就绪用 DataCollector 包装环境让 PD 控制器当行为策略走迷宫边走边记录import gymnasium as gym import gymnasium_robotics # noqa: F401 注册 PointMaze 环境 import numpy as np from minari import DataCollector dataset_name pointmaze/umaze-v0 total_steps 10_000 # continuing 任务不会因到达目标而结束 步数上限设为总采集量避免被时间截断 env gym.make(PointMaze_Medium-v3, continuing_taskTrue, max_episode_stepstotal_steps) collector_env DataCollector(env, step_data_callbackPointMazeStepDataCallback, record_infosTrue) obs, _ collector_env.reset(seed123) controller WaypointController(mazeenv.unwrapped.maze) for _ in range(total_steps): action controller.compute_action(obs) action np.random.randn(*action.shape) * 0.5 # 动作加噪增加数据多样性 action np.clip(action, env.action_space.low, env.action_space.high).astype(np.float32) obs, rew, terminated, truncated, info collector_env.step(action) dataset collector_env.create_dataset( dataset_iddataset_name, algorithm_nameQIteration, authorYour Name, author_emailyouexample.com, )几个关键细节⏱️max_episode_stepstotal_steps持续任务必须拉满否则环境会在 10000 步之前就把回合 truncated打断我们的采集循环动作加噪randn * 0.5PD 控制器本身是确定性专家加噪模拟真实数据中的抖动让离线 RL 算法有东西可学create_dataset把缓存的临时数据按 Minari 标准结构 写入本地数据集目录默认~/.minari/datasets/并自动计算total_episodes、total_steps、奖励统计等元数据。验证并加载你的 Minari 数据集数据集创建完成后用命令行快速体检minari list local # 确认 pointmaze/umaze-v0 出现 minari show pointmaze/umaze-v0 # 查看元数据详情再用 Python 加载并遍历回合验证切分是否生效import minari dataset minari.load_dataset(pointmaze/umaze-v0) print(dataset.total_episodes, dataset.total_steps) for episode in dataset.iterate_episodes(): print(fepisode {episode.id}: return{episode.rewards.sum():.2f}, fsuccess{episode.infos[success]})每个EpisodeData都包含observations / actions / rewards / terminations / truncations / infos标准字段详见 dataset_standards.md可直接喂给 IQL、BC 等离线算法也可通过recover_environment()还原出采集时的 Gymnasium 环境。进阶用 Minari 数据集训练 IQL 离线 RL 模型数据集只是起点。Minari 官方提供了 TorchRL 集成教程 IQL_torchrl.py演示如何把 Minari 数据集转成 replay buffer用Implicit Q-LearningIQL纯离线训练——不与环境交互只靠历史数据学出好策略。训练 5 万步后的典型曲线如下IQL 的核心是用期望分位数回归expectile regression替代 max 运算来评估价值函数从而避免对分布外动作的过度估计。下面的图直观展示了不同 expectile 参数 τ 对均值估计m_τ(s)的影响τ 越大估计越偏向奖励分布的右侧——这正是 IQL 隐式提取专家行为的机制 常见问题与最佳实践速查❓ 数据集没有被切分成多个 episode确认自定义回调里在successTrue时把truncation置为True否则 10000 步会被当成一整条轨迹。❓ 采集大数据集怕中断丢数据DataCollector的数据先缓存在内存/临时目录直到调用create_dataset才真正落盘。大任务建议每 N 个回合调用一次env.add_to_dataset(dataset)做检查点中断后可续采不丢数据示例见 basic_usage.md。❓ 数据集到底存在哪里默认~/.minari/datasets/可用环境变量MINARI_DATASETS_PATH修改目录结构遵循(namespace/)(env_name/)dataset_name-v(version)命名规范。❓ 不想自己跑直接下载别人复现的 D4RL 数据集minari list remote # 浏览远端 D4RL 数据集antmaze 等均在列 minari download D4RL/antmaze/large-diverse-v1总结与参考资料回顾一下本教程的完整链路Q-Value Iteration 规划路点 → PD 控制器生成动作 → DataCollector 落盘成标准 Minari 数据集 → 验证 / 训练。相比手改 D4RL 原始脚本Minari 让你在几十行代码内拿到格式标准、元数据齐全、环境可复现的 Maze2D 数据集后续还能无缝接上 IQL 等离线算法。 关键资料索引完整可运行教程point_maze_dataset.py数据收集与检查点机制basic_usage.md数据集目录结构与字段规范dataset_standards.mdDataCollector 包装器源码data_collector.pycreate_dataset 落盘入口data_collector.pyStepDataCallback 回调基类step_callback.py离线 RL 训练示例IQL TorchRLIQL_torchrl.py从零复现 D4RL 数据集这件事如今真的只需要一个周末 ☕赞分享【免费下载链接】MinariA standard format for offline reinforcement learning datasets, with popular reference datasets and related utilities项目地址https://gitcode.com/gh_mirrors/mi/Minari点击查看免费下载相关推荐如何创建Lovefield数据库模式从零开始的完整构建教程如何创建Lovefield数据库模式从零开始的完整构建教程 Lovefield是一个用纯JavaScript编写的 关系型数据库 专为Web应用设计提供类数据库关系型数据库嵌入式数据库用Minari创建第一个离线RL数据集DataCollector快速入门教程用Minari创建第一个离线RL数据集DataCollector快速入门教程 Minari 是离线强化学习Offline RL数据集的标准格式工具库。本教老照片AI修复完整教程从零构建专业级训练数据集老照片AI修复完整教程从零构建专业级训练数据集 想要让AI模型学会修复珍贵的老照片吗本教程将带你完整掌握Bringing Old Photos Back t人工智能计算机视觉图像处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考