机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载Dopamine 是 Google 推出的强化学习RL算法快速原型研究框架。本文围绕dopamine.metrics.tensorboard_collector.TensorboardCollector这一指标采集器逐行拆解它的实现原理、与CollectorDispatcher的协作方式、目录约定与可视化流程并给出可复制的代码示例与配置方法。读完本文你将能够自主把 Dopamine 训练过程中的平均回报、损失、epsilon 等标量指标写入 TensorBoard并定位到磁盘上的事件文件用tensorboard --logdir直接可视化。一、TensorboardCollector 在 Dopamine 指标体系中的位置Dopamine 的指标上报从早期围绕Logger的机制逐步演进为以Collector采集器 CollectorDispatcher分发器为核心的新架构。TensorboardCollector正是这一新体系中负责把统计量写入 TensorBoard 事件文件的组件。它在模块中的官方定义为 Collector class for reporting statistics on Tensorboard.见 tensorboard_collector.py。整个dopamine.metrics模块metrics.md包含六个核心文件模块职责collector所有采集器的抽象基类定义了统一接口collector_dispatcher分发器批量驱动一组采集器console_collector把统计量打印到控制台并可选写console.logpickle_collector把统计量序列化为 pickle 文件tensorboard_collector把统计量写入 TensorBoard 事件文件statistics_instance单个统计量的数据载体dataclass分发器维护了一张注册表AVAILABLE_COLLECTORS其中tensorboard对应的就是TensorboardCollector见 collector_dispatcher.pyAVAILABLE_COLLECTORS { console: console_collector.ConsoleCollector, pickle: pickle_collector.PickleCollector, tensorboard: tensorboard_collector.TensorboardCollector, }默认情况下CollectorDispatcher会同时启用console、pickle、tensorboard三个采集器collectors: Sequence[str] (console, pickle, tensorboard)。也就是说只要运行训练脚本TensorboardCollector就会默认被实例化并开始记录指标。二、类定义与继承关系TensorboardCollector的完整定义位于 tensorboard_collector.py它直接继承自Collector抽象基类class TensorboardCollector(collector.Collector): Collector class for reporting statistics on Tensorboard. def __init__(self, base_dir: str): if not isinstance(base_dir, str): raise ValueError( Must specify a base directory for TensorboardCollector. ) super().__init__(base_dir) self.summary_writer tf.summary.create_file_writer(self._base_dir) def get_name(self) - str: return tensorboard def write( self, statistics: Sequence[statistics_instance.StatisticsInstance] ) - None: with self.summary_writer.as_default(): for s in statistics: if not self.check_type(s.type): continue tf.summary.scalar(s.name, s.value, steps.step) def flush(self): self.summary_writer.flush()基类Collectorcollector.py定义了子类需要实现或可选覆写的方法get_name()抽象方法返回采集器唯一标识用于在base_dir下创建子目录。TensorboardCollector返回tensorboardwrite(statistics)抽象方法接收一批StatisticsInstance并写入对应后端flush()默认空实现TensorboardCollector覆写为刷新summary_writerclose()默认空实现可用于释放文件句柄如ConsoleCollector关闭日志文件。基类的__init__还完成了一个关键动作——目录规范化self._base_dir osp.join(base_dir, metrics, self.get_name())因此传入base_dir后事件文件实际会写入base_dir/metrics/tensorboard/目录。该目录由tf.io.gfile.makedirs创建若目录已存在则静默忽略PermissionDeniedError。三、构造参数与目录约定TensorboardCollector.__init__只接受一个参数base_dir: str语义是所有指标输出的根目录。它有两个值得注意的行为类型强制校验base_dir必须是str。传入None或其他类型会抛出ValueError(Must specify a base directory for TensorboardCollector.)。这与PickleCollector的行为一致但与Collector基类允许base_dirNone的宽松设计不同——说明 TensorBoard 采集器必须有落盘目录才能工作。文件写入器的创建tf.summary.create_file_writer(self._base_dir)会立刻在base_dir/metrics/tensorboard/下创建 SummaryWriter训练开始后所有标量事件都会写入该目录下的events.out.tfevents.*文件。测试 tensorboard_collector_test.py 验证了这一约定collector tensorboard_collector.TensorboardCollector(base_dir) self.assertEqual( collector._base_dir, osp.join(base_dir, metrics/tensorboard) ) self.assertTrue(osp.exists(collector._base_dir)) self.assertEqual(tf.summary.create_file_writer.call_args[0][0], collector._base_dir)可以看到构造完成后_base_dir被规范化为base_dir/metrics/tensorboard且该目录确实存在create_file_writer收到的正是这个目录。四、write 方法标量统计的写入逻辑write方法是整个采集器的核心。它接收一个StatisticsInstance序列逐个处理后写入 TensorBoarddef write( self, statistics: Sequence[statistics_instance.StatisticsInstance] ) - None: with self.summary_writer.as_default(): for s in statistics: if not self.check_type(s.type): continue tf.summary.scalar(s.name, s.value, steps.step)三个关键点类型白名单过滤check_type检查s.type是否在_supported_types中。基类默认只支持scalarself._supported_types [scalar] list(extra_supported_types)TensorboardCollector未扩展任何额外类型因此只有typescalar的统计量会被写入其他类型会被静默跳过。scalar 写入对每个通过的统计量调用tf.summary.scalar(s.name, s.value, steps.step)——name作为标量名称即 TensorBoard 中的曲线名value作为数值step作为横坐标。上下文管理器with self.summary_writer.as_default()保证写入发生在正确的 writer 上下文中。StatisticsInstance是一个简单的 dataclassstatistics_instance.pydataclasses.dataclass class StatisticsInstance: name: str value: Any step: int type: str scalar测试 tensorboard_collector_test.py 精确断言了每次写入的调用参数stat statistics_instance.StatisticsInstance(val, i, i) collector.write([stat]) self.assertEqual(val, tf.summary.scalar.call_args_list[-1][0][0]) # name self.assertEqual(i, tf.summary.scalar.call_args_list[-1][0][1]) # value self.assertEqual({step: i}, tf.summary.scalar.call_args_list[-1][1]) # step另一条测试则验证了类型过滤当typeunsupported时tf.summary.scalar不会被调用test_no_write_with_unsupported_type。五、flush 与训练循环的衔接flush把 writer 缓冲的数据真正落盘def flush(self): self.summary_writer.flush()在真实训练流程中write和flush并不是由TensorboardCollector直接驱动的而是经由CollectorDispatcher统一调度。测试test_full_runtensorboard_collector_test.py模拟了三个迭代的完整循环每个迭代内多次write迭代结束时调用一次flush并断言flush的调用次数与迭代数一致。CollectorDispatcher的调度逻辑collector_dispatcher.py如下def write(self, statistics, collector_allowlist()): for c in self._collectors: if collector_allowlist and c.get_name() not in collector_allowlist: continue c.write(statistics) def flush(self): for c in self._collectors: c.flush()这里还有一个对理解 TensorBoard 采集器很重要的机制——collector_allowlist。它允许调用方指定本次写入只发给哪些采集器。例如 JAX 版 DQN 在log_self_time这类细粒度统计中使用collector_allowlist(tensorboard,)见 dqn_agent.py 与 dqn_agent.pyPPO 与 SAC 同样在部分统计上指定collector_allowlisttensorboardppo_agent.py、sac_agent.py。也就是说高频的时序统计只进 TensorBoard而低频的迭代级统计才同时进入控制台和 pickle避免终端与文件被刷屏。六、在训练脚本中的实际接入方式CollectorDispatcher是gin.configurable的类因此采集器的组合可以通过 gin 配置文件调整。训练运行时如 discrete_domains/run_experiment.py、continuous_domains/run_experiment.py、labs/atari_100k/atari_100k_runner.py统一采用如下模式self._collector_dispatcher collector_dispatcher.CollectorDispatcher( self._base_dir ) set_collector_dispatcher_fn getattr( self._agent, set_collector_dispatcher, None ) if callable(set_collector_dispatcher_fn): set_collector_dispatcher_fn(self._collector_dispatcher)即runner 创建CollectorDispatcher(base_dir)再通过 agent 的set_collector_dispatcher把分发器注入 agent此后 agent 产生的所有统计都会经由分发器转发给TensorboardCollector。默认的三个采集器console、pickle、tensorboard会同时生效无需额外配置。gin 配置文件中也可显式控制采集器列表。例如 labs/redo/configs/dqn_dense.gin 中CollectorDispatcher.collectors [console]表示该实验只启用控制台采集器关闭 pickle 与 tensorboard。若要显式开启 TensorBoard可写为CollectorDispatcher.collectors [console, pickle, tensorboard]七、独立使用 TensorboardCollector 的最小示例不需要跑完整训练你也可以独立实例化TensorboardCollector并写入自定义指标from dopamine.metrics import tensorboard_collector from dopamine.metrics import statistics_instance # 所有事件文件将写入 ./my_runs/metrics/tensorboard/ collector tensorboard_collector.TensorboardCollector(./my_runs) # 模拟两个迭代的训练统计 for iteration in range(100): stats [ statistics_instance.StatisticsInstance( nameAverageReturns, valueiteration * 1.5, stepiteration ), statistics_instance.StatisticsInstance( nameLoss, value100.0 / (iteration 1), stepiteration ), ] collector.write(stats) collector.flush() # 可选按需落盘运行后检查目录结构my_runs/ └── metrics/ └── tensorboard/ └── events.out.tfevents.timestamp.hostname然后启动 TensorBoard 查看曲线tensorboard --logdir ./my_runs/metrics/tensorboard/在浏览器打开 TensorBoard 后AverageReturns与Loss会以两条独立标量曲线的形式展示横轴为step。八、与其他采集器的对比与选型采集器输出目标base_dir 为 None典型用途TensorboardCollectorbase_dir/metrics/tensorboard/下的 TF 事件文件抛ValueError曲线可视化、训练过程监控ConsoleCollector终端日志 可选console.log文件允许不写文件实时观察关键指标PickleCollectorbase_dir/metrics/下的pickle_N.pkl抛ValueError与旧版 Dopamine Logger 兼容的离线分析三者可以任意组合。PickleCollector在write时仅把数据累积到内存在flush时才序列化到pickle_0.pkl、pickle_1.pkl……TensorboardCollector则在每次write时同步写入事件文件、flush负责落盘。从源码注释pickle_collector.py看PickleCollector 刻意模仿旧 Logger 的输出格式以兼容用户既有的绘图脚本而 TensorBoard 事件文件则服务于现代的可视化工作流。九、TensorBoard 可视化效果参考Dopamine 在 docs/README.md 中提供了 TensorBoard 事件文件的下载与可视化示例解压后运行tensorboard --logdir c51/Asterix/即可查看 C51 代理在 Asterix 游戏上的训练曲线。仓库的 images 目录保留了对应的 TensorBoard 截图。上图展示了 TensorBoard 中多算法DQN、Implicit Quantile、C51 等在 Asterix 上的Eval/AverageReturns与Train/AverageReturns曲线对比这些曲线正是由TensorboardCollector写入事件文件后渲染出来的。上图聚焦 C51 代理在 Asterix 上的多次运行曲线Train/AverageReturns、Train/NumEpisodes可见不同随机种子下回报曲线的整体上升趋势。十、源码级要点速查输出目录TensorboardCollector(base_dir)的_base_dir被基类规范化为base_dir/metrics/tensorboard事件文件落于此目录collector.py。类型过滤只写入typescalar的统计量StatisticsInstance的type字段默认就是scalar。标量调用每次write对每个合法统计量执行一次tf.summary.scalar(name, value, stepstep)。注册名get_name()返回tensorboard既是目录名也是CollectorDispatcher的 allowlist 标识。接入方式runner 创建CollectorDispatcher(base_dir)并注入 agent默认启用 console pickle tensorboard 三个采集器gin 中通过CollectorDispatcher.collectors [...]调整。细粒度控制agent 可通过collector_allowlist(tensorboard,)让高频统计只进 TensorBoard如 dqn_agent.py。测试依据目录规范化、写入参数、类型过滤、迭代 flush 行为均由 tensorboard_collector_test.py 覆盖验证。围绕TensorboardCollector的完整模块文档可继续参考 tensorboard_collector.md 与基类文档 Collector.md。赞分享机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载相关推荐MXNet contrib.tensorboard 实战用 LogMetricsCallback 将训练/评估指标写入 TensorBoardMXNet contrib.tensorboard 实战用 LogMetricsCallback 将训练/评估指标写入 TensorBoard mxnet.c深度学习机器学习人工智能Honcho高级技巧环境变量与多Procfile管理最佳实践Honcho高级技巧环境变量与多Procfile管理最佳实践 Honcho作为Python实现的Foreman克隆工具是管理基于Procfile应用的终极解开发工具comet-llmOpikPython SDK Prompt 类深度解析Prompt Library 的模板渲染、版本管理与后端同步机制comet llmOpikPython SDK Prompt 类深度解析Prompt Library 的模板渲染、版本管理与后端同步机制 本文以 Opik机器学习深度学习上一篇想在App里加实时AI数字人Duix.ai 移动端本地部署快速上手指南下一篇A-Frame Inspector与A-Frame Watcher协同工作实时同步3D场景修改创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
