首页/新闻资讯/正文详情

Dopamine 指标扩展指南:add_collector 注册自定义 Collector 详解

发布时间:2026/9/24 16:51:50 来源:云帆数科 栏目:资讯中心
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),仅供参考

相关推荐

dateparse4cj快速上手教程:5分钟完成安装并解析你的第一个日期字符串
dateparse4cj快速上手教程:5分钟完成安装并解析你的第一个日期字符串

dateparse4cj快速上手教程:5分钟完成安装并解析你的第一个日期字符串 【免费下载链接】dateparse4cj dateparse4cj 是一个基于 cangjie 标准库实现的高性能、功能丰富的日期时间解析库。它能够自动识别并解析多种格式的日期字符串,支持全球各种常见日期格… · 2026/9/24 16:51:37

调度系统和小车关系(下)
调度系统和小车关系(下)

调度系统和小车关系(下) 六.多个任务调度 1.多个动作执行blockingType允许自动行驶允许其他动作并行NONE是是SINGLE是否SOFT否是HARD否否动作的状态:状态是否已经结束RUNNING否PAUSED否RETRIABLE否,仍等待重试或其他处理FINISHED是FAILED是2.重试机制 RE… · 2026/9/24 16:51:37

Go 语言 YAML 编解码实战:深入 go.yaml.in/yaml/v2 解析库
Go 语言 YAML 编解码实战:深入 go.yaml.in/yaml/v2 解析库

人工智能AI AgentAgent 沙箱云原生容器运行时零信任 【免费下载链接】substrate Agent Substrate: the core system 项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate 点击查看 免费下载 本指南以当前仓库中随项目一并 vendored 的 go.yaml.in… · 2026/9/24 16:51:23

【股票交易】第 49 章 移动平均线与趋势跟踪
【股票交易】第 49 章 移动平均线与趋势跟踪

回到目录文章目录49.1 移动平均线是什么简单移动平均线:不断更新的价格平均数股价下跌,均线为什么仍然上涨指数移动平均线 :给近期价格更高权重49.2 移动平均线有什么用途为趋势观察提供一致的参照周期选择决定观察尺度衡量价格偏离近期平均水… · 2026/9/24 17:27:07

lu,震惊分析实验系统、震惊实验视频分析系统
lu,震惊分析实验系统、震惊实验视频分析系统

震惊反射系统用于分析动物受到突发强刺激后的应激行为,单台计算机可管控 1‑5 个震惊反应箱。除噪声刺激外,还可叠加光、电、气流组合刺激,刺激间隔技术参数1、重量传感器量程:1‑2kg 2、系统架构:主控制器搭配装置控制… · 2026/9/24 17:27:07

2026 大幅面数码印刷设备行业观察:国产压电写真机技术演进与设备选型参考
2026 大幅面数码印刷设备行业观察:国产压电写真机技术演进与设备选型参考

本文面向广告加工、图文印刷行业从业者,梳理 2026 大幅面数码印刷设备的技术现状,包含压电写真、UV 打印技术拆解,以及工厂设备选型参考。 摘要:随着个性化小批量订单持续释放需求,国内大幅面数码印刷设备行业保持稳步… · 2026/9/24 17:27:07

用思维赚钱14:求财与财富观的境界
用思维赚钱14:求财与财富观的境界

天下熙熙皆为利来,天下攘攘皆为利往。在这个世界上,芸芸众生,追求经济利益或者说求财,在一定程度上,可以说具有普遍性。追求权色名利,就一般意义上讲,并没有天然的是非对错,都是可以… · 2026/9/24 17:27:07

双向RNN
双向RNN

如果不加特别说明,RNN的计算一般是从左到右的,即第t步的特征计算只能“看到”的信息,但从语义理解的角度来看,有时只看前边时间步的信息是不够的。我们来看下边的例子。南京市 长江 大桥 是 一个 工程 奇迹。 南京 市长 江大桥 是… · 2026/9/24 17:27:07

【股票交易】专栏介绍
【股票交易】专栏介绍

为什么同一家公司的经营状况没有明显变化,股价却可能上涨或下跌 30%? 因为股价不仅反映公司当下的经营结果,还包含市场对未来增长、资金成本和风险的判断。同样的利润,在不同的经济环境、行业阶段和市场情绪下,可能对… · 2026/9/24 17:26:48

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

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

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码