Dopamine 指标扩展指南:add_collector 注册自定义 Collector 详解
Dopamine 指标扩展指南add_collector 注册自定义 Collector 详解【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址: https://gitcode.com/gh_mirrors/do/dopamineDopamine 是面向强化学习算法快速原型开发的研究框架其metrics模块提供了统一、可插拔的训练指标收集机制。本文围绕 dopamine.metrics.collector_dispatcher.add_collector 这一注册入口讲解如何在 Dopamine 中注册并使用自定义指标收集器Collector内容覆盖函数签名、内置收集器生态、注册与使用全流程以及源码与测试层面的实现佐证。读完本文你将能够为自己的强化学习实验扩展任意格式的指标输出控制台、pickle 文件、TensorBoard 或自定义目标并与 CollectorDispatcher 无缝集成。一、add_collector 是什么指标收集体系的注册入口在 Dopamine 的指标体系中CollectorDispatcher 是负责调度多个指标收集器Collector的核心类而add_collector则是向该调度器暴露的注册表注入新收集器的唯一入口。二者配合实现了训练主体只面向一个调度接口而输出渠道可无限扩展的设计。其函数签名如下与 add_collector 参考文档 一致dopamine.metrics.collector_dispatcher.add_collector( name: str, constructor: dopamine.metrics.collector.Collector ) - None参数含义参数类型说明namestr自定义收集器的唯一标识符用于在CollectorDispatcher构造时按名字匹配。必须与constructor返回实例的get_name()保持一致constructorCollector子类可调用对象收集器构造函数接收base_dir参数并返回一个Collector实例。需继承 Collector 抽象基类函数返回None其作用是对模块级注册表AVAILABLE_COLLECTORS执行一次字典更新dict.update。二、注册表机制AVAILABLE_COLLECTORS 与内置收集器在 collector_dispatcher.py 中模块定义了一个公开的注册表AVAILABLE_COLLECTORS { console: console_collector.ConsoleCollector, pickle: pickle_collector.PickleCollector, tensorboard: tensorboard_collector.TensorboardCollector, }当前仓库内置了三种开箱即用的收集器consoleConsoleCollector将指标以[Iteration N]: name value的格式输出到控制台并在base_dir/metrics/console/console.log写入日志文件可通过 gin 参数save_to_file控制默认开启。实现见 console_collector.py。picklePickleCollector按迭代号将指标累积到内存字典flush()时写入base_dir/metrics/pickle/pickle_n.pkl格式与旧版 Dopamine Logger 兼容便于复用既有的绘图脚本。实现见 pickle_collector.py。tensorboardTensorboardCollector通过tf.summary.create_file_writer将 scalar 指标写入base_dir/metrics/tensorboard/供 TensorBoard 可视化。实现见 tensorboard_collector.py。add_collector的完整实现只有两行def add_collector(name: str, constructor: CollectorConstructorType) - None: AVAILABLE_COLLECTORS.update({name: constructor})其中CollectorConstructorType Callable[[str], collector.Collector]即接收base_dir字符串、返回Collector实例的构造函数类型见 collector_dispatcher.py。由于CollectorDispatcher构造时通过AVAILABLE_COLLECTORSc实例化收集器见 collector_dispatcher.py注册后即可直接在配置中按名字启用。三、Collector 抽象基类自定义收集器必须遵守的契约所有收集器都必须继承 Collector 抽象基类其定义位于 collector.py。基类在构造时自动完成两件事将base_dir扩展为base_dir/metrics/get_name()/并自动创建该目录使用tf.io.gfile.makedirs已存在时忽略PermissionDeniedError初始化_supported_types [scalar] list(extra_supported_types)供check_type(data_type)过滤不支持的指标类型。子类需要实现的抽象方法只有两个抽象方法职责get_name() - str返回唯一标识符用于子目录创建与CollectorDispatcher的 allowlist 过滤write(statistics: Sequence[StatisticsInstance]) - None接收一批指标并执行实际输出flush()与close()在基类中是空实现pass按需覆写。指标数据本身是 StatisticsInstance 数据类包含name、value、step与默认值scalar的type四个字段见 statistics_instance.py。四、完整实战注册并启用一个自定义 Collector下面以一个将指标追加写入自定义 CSV 文件的收集器为例演示从注册到启用的完整流程。4.1 编写自定义收集器import csv import os.path as osp from dopamine.metrics import collector class CsvCollector(collector.Collector): 将每个 step 的 scalar 指标追加写入 CSV 文件。 def __init__(self, base_dir): super().__init__(base_dir) self._file osp.join(self._base_dir, metrics.csv) self._writer None self._file_handle None def get_name(self) - str: return csv # 必须与 add_collector 的 name 一致 def write(self, statistics) - None: # 惰性创建 CSV 文件与表头 if self._file_handle is None: self._file_handle open(self._file, w, newline) self._writer csv.writer(self._file_handle) self._writer.writerow([step, name, value]) for s in statistics: if not self.check_type(s.type): continue self._writer.writerow([s.step, s.name, s.value]) def flush(self) - None: if self._file_handle is not None: self._file_handle.flush() def close(self) - None: if self._file_handle is not None: self._file_handle.close()4.2 注册到注册表在创建CollectorDispatcher之前调用from dopamine.metrics import collector_dispatcher collector_dispatcher.add_collector(csv, CsvCollector)4.3 在配置中启用CollectorDispatcher构造时读取collectors参数默认(console, pickle, tensorboard)逐个在注册表中查找并实例化见 collector_dispatcher.py。因此启用自定义收集器只需把它加入该序列metrics collector_dispatcher.CollectorDispatcher( base_dir, collectors[console, tensorboard, csv], # 追加自定义 csv )由于CollectorDispatcher本身是gin.configurable的也可以通过 gin 绑定配置例如在.gin文件中设置CollectorDispatcher.collectors [console, tensorboard, csv]注意注册表中不存在的名字会被忽略并打印警告Collector %s not recognized, ignoring.见 collector_dispatcher.py因此务必保证name与get_name()一致且注册发生在构造之前。4.4 数据消费与生命周期与 CollectorDispatcher 文档 中描述的一致训练循环中按如下节奏消费指标# 每个训练 step 或迭代后写入一批统计指标 metrics.write(statistics, collector_allowlist(tensorboard,)) # 需要落盘/刷新的时机如迭代结束 metrics.flush() # 训练结束后关闭所有收集器 metrics.close()其中write(statistics, collector_allowlist)的collector_allowlist用于指定本次只写入哪些收集器为空元组时调用全部收集器非空时仅调用名字在列表内的收集器见 collector_dispatcher.py。这一机制在 Dopamine 的 JAX agent 中被广泛用于区分细粒度训练指标只写 TensorBoard与粗粒度指标全量输出例如 dqn_agent.py 的构造参数collector_allowlist(tensorboard,)并在 dqn_agent.py 处传入调度器的write调用。五、源码级验证测试用例如何印证注册流程仓库中的 collector_dispatcher_test.py 直接演示并验证了add_collector的注册与调度行为测试定义了SimpleCollector与CountCollector两个继承collector.Collector的测试收集器分别通过collector_dispatcher.add_collector(simple, SimpleCollector)与add_collector(count, CountCollector)注册见 collector_dispatcher_test.py随后构造CollectorDispatcher(tmpdir, collectors[simple, count])并执行写入循环验证了collector_allowlist为空时所有收集器被调用为(simple,)时CountCollector.write不被调用而flush仍被调用见 collector_dispatcher_test.py此外 collector_dispatcher_test.py 还覆盖了零收集器与默认收集器两种边界情形说明调度器在无收集器时也能正常运行。该测试是学习注册 → 构造 → 调度全链路行为的最直接范本。六、在生产代码中的真实接入方式在真实训练入口中CollectorDispatcher由 run_experiment.py 与 continuous_domains 的 run_experiment.py 创建随后通过set_collector_dispatcher_fn注入到 agent见 run_experiment.py。agent 在训练与评估的各个阶段构造 StatisticsInstance 并调用self._collector_dispatcher.write(...)上报指标例如训练回合数Train/NumEpisodes见 run_experiment.py。因此若要让自定义收集器进入默认训练流程只需在训练脚本如 train.py 或 jax 训练入口中于 runner 构造之前调用一次add_collector并在 gin 配置中把收集器名加入CollectorDispatcher.collectors即可无需改动框架任何源码。七、常见问题与最佳实践名称冲突add_collector对同名键执行覆盖更新dict.update注册同名收集器会静默替换内置或此前注册的实现请避免与内置名console、pickle、tensorboard冲突。注册时机必须在CollectorDispatcher(...)实例化之前完成注册否则会触发 Collector not recognized 警告并被忽略。子目录隔离基类自动将每个收集器的输出隔离在base_dir/metrics/name/下自定义收集器应沿用这一约定便于结果归档与排查。类型过滤write中建议调用self.check_type(s.type)过滤不支持的指标类型内置收集器均如此处理以兼容未来扩展的非 scalar 指标。资源释放若自定义收集器持有文件句柄或网络连接务必覆写close()并在训练结束时调用metrics.close()避免资源泄漏。【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址: https://gitcode.com/gh_mirrors/do/dopamine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

深入理解 Humanizer 的 ByteSizeUnitSystem:显式字节单位体系的解析与格式化指南

深入理解 Humanizer 的 ByteSizeUnitSystem:显式字节单位体系的解析与格式化指南

深入理解 Humanizer 的 ByteSizeUnitSystem:显式字节单位体系的解析与格式化指南 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址:…

2026/9/24 16:52:01 阅读更多 →
Axure 9.0 使用动态面板实现 Tab 切页

Axure 9.0 使用动态面板实现 Tab 切页

一、页面元件准备拖拽动态面板到画布,命名为tab_panel,设置足够宽高用来承载各个 Tab 内容。双击动态面板,新建多个状态,分别命名,例如tab1首页、tab2列表、tab3设置,每个状态内放入对应页面的内容。3. 在页…

2026/9/24 16:51:01 阅读更多 →
J2CJ 开发者扩展指南:从零编写自定义转换规则,让迁移工具为你所用

J2CJ 开发者扩展指南:从零编写自定义转换规则,让迁移工具为你所用

J2CJ 开发者扩展指南:从零编写自定义转换规则,让迁移工具为你所用 【免费下载链接】J2CJ 项目地址: https://gitcode.com/Cangjie-SIG/j2cj J2CJ 是一款基于 AST 语义转换的 Java 到 Cangjie 源码转换工具。本文带你从零学会为它编写自定义转换规…

2026/9/24 16:51:01 阅读更多 →

最新新闻

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

简介:基于jspmysql的JSP个人日记本源码,是一份面向Java Web初学者与课程设计场景的完整Web应用项目。资源以JSP作为视图层、Servlet处理控制逻辑,结合MySQL存储用户、日记与分类数据,覆盖用户登录、会话保持、日记增删改查、分类管…

2026/9/24 18:29:14 阅读更多 →
2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

AirPods这个品类,现在真的有点“乱花渐欲迷人眼”了。从最初只有一款标准版,到如今AirPods 4、AirPods Pro、AirPods Max三条线并行,Plus版一般、Lite版传闻满天飞,哪怕是数码圈老手,真要下手买前不花点时间做功课&…

2026/9/24 18:29:14 阅读更多 →
结构可靠性分析:验算点法与直接抽样组合实战

结构可靠性分析:验算点法与直接抽样组合实战

简介:面向结构可靠性与安全度评估的实用算法压缩包,适合结构工程专业学生、科研人员及从事可靠性分析的工程师。资源聚焦验算点法和直接抽样法,同时涉及蒙特卡洛模拟思路,用于计算结构失效概率、评估极端荷载下的安全裕度&#xf…

2026/9/24 18:29:14 阅读更多 →
前后端分离部署实战:systemd托管Java进程+Nginx反向代理

前后端分离部署实战:systemd托管Java进程+Nginx反向代理

1. 部署方案设计与总体思路1.1 为什么是“systemd Nginx”这套组合前后端分离项目的部署,说简单也简单,说麻烦也麻烦。简单在于流程是固定的——后端打成 jar 包跑起来,前端构建出静态文件扔给 Web 服务器。麻烦在于每一个环节都有坑&#x…

2026/9/24 18:29:14 阅读更多 →
腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

上个月帮一个朋友的博客站点排查访问慢的问题。他的服务器带宽只有5M,文章里全是高清截图和录屏素材,高峰期十几个人同时打开就卡得不行。我顺手看了眼他用的还是老式按量计费CDN,月底账单里光是流量费就占了一半。我说你这个站,流…

2026/9/24 18:29:14 阅读更多 →
Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →