机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载导读在强化学习研究中对比不同算法、不同游戏、不同超参数下的训练曲线是评估工作的核心环节。Dopamine 在dopamine/colab/utils.py中提供了一套从实验日志到 Pandas DataFrame 的数据读取工具其中read_experiment是连接磁盘上散落的实验目录与可供 seaborn / matplotlib 直接绘图的汇总数据的关键入口。本文将以 read_experiment 官方 API 文档 为骨架结合 utils.py 源码、Logger 日志模块 与 load_statistics.ipynb 实战示例完整讲解该函数的设计动机、参数语义、路径构造规则、内部实现原理并给出可直接运行的读取与绘图方案帮助你快速搭建自己的实验分析流水线。一、数据从哪来Dopamine 的日志落盘机制在理解read_experiment之前需要先知道它读取的对象是如何产生的。Dopamine 使用 dopamine/discrete_domains/logger.py 中的Logger类将训练/评估的统计量落盘训练过程中代理会把每个迭代iteration的统计数据如train_episode_returns、eval_episode_returns存入 Logger 内部的字典通过log_to_file(filename_prefix, iteration_number)将该字典用pickle序列化写到${logging_dir}/${filename_prefix}_${iteration_number}默认的logs_duration4表示最多保留最近 4 个版本的日志文件更旧的会被自动清理见 logger.py 与 logger.py。在 colab/utils.py 中定义了与 Logger 协作的两个常量FILE_PREFIX log ITERATION_PREFIX iteration_也就是说一次实验在磁盘上的典型布局是experiment_dir/ └── logs/ ├── log_0 ├── log_1 ├── log_2 └── ...其中每个log_n是包含iteration_0、iteration_1… 等键的 pickle 字典。而read_experiment的职责就是把多条这样的实验目录按参数网格批量读入、汇总并合并成一个可用于分析的 DataFrame。二、read_experiment签名与参数语义read_experiment的完整签名见 read_experiment 文档 与 utils.py 源码为dopamine.colab.utils.read_experiment( log_path, parameter_setNone, job_descriptor, iteration_numberNone, summary_keys(train_episode_returns, eval_episode_returns), verboseFalse )参数类型含义默认值log_pathstring存放所有实验结果的基础路径必填parameter_setcollections.OrderedDict实验参数名到允许取值的映射同时定义参数在job_descriptor中的出现顺序Nonejob_descriptorstring用于为每个 trial 构造完整路径的格式化字符串iteration_numberint 或None若不为None则固定读取该迭代号的数据否则读取最新迭代Nonesummary_keysIterable[str]需要做逐迭代汇总的统计量名称(train_episode_returns, eval_episode_returns)verbosebool为True时打印额外信息如正在读取的文件路径False返回Pandas DataFrame包含全部实验参数、迭代号与汇总统计量的结果表—该方法的官方说明read_experiment 文档明确了两个核心约定parameter_set是一个有序字典它一方面定义本次实验的参数另一方面决定这些参数在job_descriptor中出现的顺序方法会读取所有形如${log_path}/${job_descriptor}.format(params)/logs的实验目录其中params由parameter_set各元素取值的笛卡尔积构造。三、路径构造机制参数网格 → 实验目录原文档给出了最直观的例子read_experiment 文档import collections parameter_set collections.OrderedDict([ (game, [Asterix, Pong]), (epsilon, [0, 0.1]) ]) read_experiment(/tmp/logs, parameter_set, job_descriptor{}_{})该调用会尝试依次读取以下 4 个目录中的logs子目录/tmp/logs/Asterix_0/logs /tmp/logs/Asterix_0.1/logs /tmp/logs/Pong_0/logs /tmp/logs/Pong_0.1/logs从源码看其实现过程是utils.pykeys [] if parameter_set is None else list(parameter_set.keys()) ordered_values [parameter_set[key] for key in keys] for parameter_tuple in itertools.product(*ordered_values): if job_descriptor is not None: name job_descriptor.format(*parameter_tuple) else: # 回退命名game_Asterix-epsilon_0 name -.join( [keys[i] _ str(parameter_tuple[i]) for i in range(len(keys))] ) experiment_path {}/{}/logs.format(log_path, name) raw_data, last_iteration load_statistics( experiment_path, iteration_numberiteration_number, verboseverbose )需要注意的细节itertools.product按parameter_set中参数的声明顺序生成元组因此job_descriptor中的每个{}占位符依次对应parameter_set的一个键若job_descriptorNone则会自动退化为key_value-key_value形式的目录名如game_Asterix-epsilon_0适合日志目录没有统一模板时的读取每个实验路径末尾统一追加/logs这与第一节中 Logger 输出的目录结构一一对应。四、返回结果DataFrame 的结构与内部实现read_experiment返回一个 Pandas DataFrame其列由三部分组成utils.pycolumn_names keys [iteration] list(summary_keys)即参数网格列 迭代号列 各汇总统计量列。以前述示例为例返回表的列将是game、epsilon、iteration、train_episode_returns、eval_episode_returns行数为参数组合数 × 实际迭代数。源码中的实现要点utils.py预分配容量expected_num_iterations 200先按参数组合数 × 200预建 DataFrame 索引再逐行填充逐参数组合、逐迭代填行每个参数元组调用load_statistics取回原始字典与最新迭代号再交给summarize_data生成逐迭代汇总然后为0..last_iteration的每个迭代号写入一行参数值 迭代号 各统计量数值类型统一将所有能转换为数值的列astype(np.float64)规避后续merge时object 列与数值列合并报 ValueError的坑utils.py裁剪多余行最后用drop(np.arange(row_index, expected_num_rows))丢弃预分配后未被填充的行保证返回表紧凑干净。五、协同工作的配套函数read_experiment并非孤立存在它依赖colab.utils模块中另外几个工具函数模块文档理解它们有助于排查读取问题。5.1 load_statistics单目录读取签名与文档见 load_statistics 文档load_statistics(log_path, iteration_numberNone, verboseTrue)若iteration_numberNone自动通过get_latest_iteration找到最新的日志文件日志文件名固定为log_iterationFILE_PREFIX log用pickle.load读取后返回(data, iteration)二元组utils.py。5.2 summarize_data逐迭代汇总签名与文档见 summarize_data 文档summarize_data(data, summary_keys)输入是load_statistics返回的字典键为iteration_0、iteration_1…对每个 key 计算每个迭代内所有 episode 的均值np.mean数据缺失时沿用上一个迭代的值源码注释明确说明We allow reporting the same value multiple times when data is missingutils.py保证曲线连续不断档。5.3 get_latest_iteration / get_latest_fileget_latest_iteration(path)用 glob 匹配log_[0-9]*解析出最大迭代号无日志时抛ValueError文档、utils.pyget_latest_file(path)返回最新日志的完整路径找不到时返回None文档、utils.py。5.4 load_baselines官方基线数据加载load_baselines(base_dir, verboseFalse)用于读取 Dopamine 官方发布的基线数据utils.py遍历ALL_GAMES60 款 Atari 游戏与[dqn, c51, rainbow, iqn]四种代理期望文件布局为${base_dir}/${agent}/${game}.pkl读取后统一转为 float64 并按游戏merge合并仓库 baselines/atari/data 下即存放此类基线 JSON*.json/*.vg.json而 Atari 与 MuJoCo 的基线可视化页面对应 baselines/atari/plots.html 与 baselines/mujoco/plots.html。六、实战在 Colab 中读取实验并绘制训练曲线仓库中的 dopamine/colab/load_statistics.ipynb 演示了read_experiment的两种典型用法可直接作为模板。示例 1批量读取样本实验并与基线合并绘图假设样本日志位于/content/samples/rainbow/GAME_v4/logs其中GAME是游戏名列表GAMES中的元素。此时各参数在目录名中出现的顺序是agent在前、game在后因此import collections parameter_set collections.OrderedDict([ (agent, [rainbow]), (game, GAMES) ]) sample_data colab_utils.read_experiment( /content/samples, parameter_setparameter_set, job_descriptor{}/{}_v4, summary_keys[train_episode_returns]) sample_data[agent] Sample Rainbow sample_data[run_number] 1 for game in GAMES: experimental_data[game] experimental_data[game].merge( sample_data[sample_data.game game], howouter)之后即可用 seaborn 按agent分组绘制各游戏的训练曲线import seaborn as sns import matplotlib.pyplot as plt for game in GAMES: fig, ax plt.subplots(figsize(16, 8)) sns.lineplot(xiteration, ytrain_episode_returns, hueagent, dataexperimental_data[game], axax) plt.title(game) plt.show()这里read_experiment返回的iteration与train_episode_returns两列正好直接作为折线图的 x、y 轴数据。示例 2组合 load_statistics 与 summarize_data 读取单个实验当只需要处理一条实验目录、并希望保留原始数据而非网格化汇总时可以绕过read_experiment手动组合两个底层函数import matplotlib.pyplot as plt for game in GAMES: raw_data, _ colab_utils.load_statistics( /content/samples/rainbow/{}_v4/logs.format(game), verboseFalse) summarized_data colab_utils.summarize_data( raw_data, [train_episode_returns]) plt.plot(summarized_data[train_episode_returns], labelepisode returns) plt.title(Rainbow training - {}.format(game)) plt.xlabel(Iteration) plt.ylabel(Return) plt.legend() plt.show()更多用例dopamine/colab/agents.ipynb 中使用read_experiment读取论文基线数据如random_dqn_data colab_utils.read_experiment(...)用于复现算法对比图dopamine/colab/cartpole.ipynb 中对 CartPole 环境同样通过colab_utils.read_experiment(DQN_PATH, verboseTrue, ...)读取训练结果各 notebook 的完整运行方式与数据下载说明见 dopamine/colab/README.md。七、使用建议与常见问题目录名必须与job_descriptor严格一致路径拼接是纯字符串格式化job_descriptor中的占位符数量与顺序必须与parameter_set的键一一对应否则会因找不到目录而读取失败。iteration_number用于对齐多次实验的迭代窗口不同 trial 的训练长度可能不同通过指定同一iteration_number可以强制在所有目录读取相同迭代号的日志便于公平对比不指定时则各自取最新迭代。verboseTrue有助于调试开启后load_statistics会打印Reading statistics from: 便于确认实际命中的文件路径。缺失数据会被前向填充summarize_data在某个迭代缺少数据时沿用上一个迭代的均值绘图时曲线不会出现空洞但解读时要留意这一点。依赖说明utils.py依赖numpy、pandas与tensorflow其中文件 I/O 通过tf.io.gfile完成utils.py因此log_path不仅可以是本地路径也可指向 GCS 等gfile支持的存储位置方便直接读取云端训练产物。读取失败时检查日志文件是否仍存在Logger 默认只保留最近 4 个版本logs_duration4logger.py如果实验早已结束且日志被清理get_latest_iteration会抛出ValueError: No log data found此时需检查训练时的logging_dir配置或延长日志保留周期。结语read_experiment将参数网格 × 迭代日志这一常见的实验组织方式抽象为一次调用通过parameter_set声明参数空间、用job_descriptor描述目录命名模板即可在几行代码内完成多实验数据的批量读取、逐迭代汇总与 DataFrame 化为后续的曲线对比、表格统计与论文图表生成提供统一、干净的数据入口。结合load_statistics、summarize_data、get_latest_iteration等底层函数你可以灵活组合出适配自己实验目录结构的分析管线。赞分享机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载相关推荐Dopamine 实验数据读取与统计分析dopamine.colab.utils 模块完全指南Dopamine 实验数据读取与统计分析dopamine.colab.utils 模块完全指南 本指南以 Dopamine 仓库中的 colab/utils.机器学习深度学习加载 Dopamine 基线实验数据dopamine.colab.utils.load_baselines 函数解析与实战指南加载 Dopamine 基线实验数据dopamine.colab.utils.load_baselines 函数解析与实战指南 load_baselines强化学习机器学习深度学习gs-quant 价差套利完整实践指南用卡尔曼滤波动态追踪公平价差gs quant 价差套利完整实践指南用卡尔曼滤波动态追踪公平价差 一次失败的交易复盘螺纹钢 铁矿石价差以60日滚动均值作为回归中枢2023年3月不到三强化学习机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考