Dopamine 中的 AtariPreprocessing:Atari 2600 图像预处理类源码级解析
机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载导读AtariPreprocessing是 Dopamine 强化学习框架中为 Atari 2600 智能体提供标准图像预处理的封装类位于 dopamine/discrete_domains/atari_lib.py。它实现了 DQN 系列论文中公认的四大预处理约定帧跳过Frame Skipping、生命损失终止信号Terminal on Life Loss、灰度化与双帧最大池化Grayscale Max Pooling、以及缩放到 84×84 方形画面。阅读完本文你将理解该类的完整实现原理、每个构造参数的作用与取值范围、它与create_atari_environment的装配关系以及如何通过 gin 配置文件对其进行参数化从而在自己的强化学习实验中复现 Nature DQN 的标准评估协议。一、背景为什么需要统一的 Atari 预处理原始的 Atari 2600 游戏画面以 210×160 的 RGB 帧输出帧率高达 60 FPS且相邻帧高度冗余。直接将原始画面送入神经网络既浪费算力也不利于稳定训练。为此强化学习社区逐步沉淀出一套标准预处理流程其核心依据来自三篇论文JAIR 论文Bellemare et al., 2013首次系统化提出 Arcade Learning EnvironmentALE作为评估平台并描述了画面预处理的基本思路。Nature DQN 论文Mnih et al., 2015确立了帧跳过、灰度化、下采样、历史帧堆叠等具体做法将观测标准化为 84×84×4 的张量输入。Machado et al. (2018)《Revisiting the Arcade Learning Environment: Evaluation Protocols and Open Problems for General Agents》重审了 ALE 的评估协议进一步明确了预处理细则如 sticky actions 的使用。AtariPreprocessing类正是对上述论文约定的工程化落地。类的文档字符串atari_lib.py明确列出了它提供的四个子集功能帧跳过默认跳 4 帧生命损失时发出终止信号默认关闭对最近两帧做灰度化与最大池化将画面下采样为方形图像默认为 84×84。二、类的定位与整体职责从源码结构看AtariPreprocessing被定义为一个gin.configurable装饰的类atari_lib.py这意味着它可以直接被 gin 配置文件按名称参数化。它本身是一个 Gym 风格的包装器wrapper内部持有一个真实的 ALE/Gym 环境对外暴露标准的reset/step/render/close接口以及observation_space、action_space、reward_range、metadata等 Gym 兼容属性。模块头部的注释atari_lib.py将它的职责概括为三件事可选地在丢失一条生命时发出终止信号帧跳过与颜色池化灰度 最大池化在观测送入智能体之前对图像进行缩放。同时模块中还定义了NATURE_DQN_OBSERVATION_SHAPE (84, 84)和NATURE_DQN_STACK_SIZE 4两个常量atari_lib.py前者与AtariPreprocessing的默认screen_size84一致后者对应智能体侧堆叠 4 帧历史观测的约定——预处理类负责单帧画面历史堆叠则由上层智能体完成。三、构造函数与参数详解AtariPreprocessing的构造函数签名如下atari_lib.pygin.configurable class AtariPreprocessing(object): def __init__( self, environment, frame_skip4, terminal_on_life_lossFalse, screen_size84, use_legacy_gymFalse, ):各参数的含义与约束如下参数类型默认值说明environmentGym 环境必填被预处理的 Gym 环境ALE 的包装。frame_skipint4智能体体验游戏的频率即每执行一次动作底层环境内部重复执行该动作的帧数。Nature DQN 的标准值即为 4。terminal_on_life_lossboolFalse若为 True则每当丢失一条生命时step()返回is_terminalTrue详见 Mnih et al. 2015。默认关闭。screen_sizeint84缩放后 Atari 帧的边长输出为方形。use_legacy_gymboolFalse是否使用旧版 Gym API返回 4 元组而非新版 Gymnasium API返回 5 元组。构造函数中有两处输入校验当frame_skip 0或screen_size 0时分别抛出ValueError提示 Frame skip should be strictly positive 与 Target screen size should be strictly positiveatari_lib.py。这保证了后续图像池化与缩放逻辑不会因非正尺寸而崩溃。此外构造函数还做了以下初始化atari_lib.py根据environment.observation_space.shape预分配两个np.uint8类型的临时帧缓冲screen_buffer用于双帧最大池化初始化self.game_over False与self.lives 0lives将在reset()时被真实值覆盖。四、预处理流水线step()内部的完整流程step()是预处理的核心atari_lib.py它把一个动作展开为至多frame_skip帧的底层交互其完整逻辑如下累积奖励在frame_skip次循环中重复执行同一动作将每一步的奖励累加到accumulated_reward最终返回给智能体的奖励是所有子步骤奖励之和测试testFrameSkipAccumulatesReward验证了这一点frame_skip2时每步奖励 1累加后返回 2。兼容新旧 Gym API当use_legacy_gymTrue时底层step()返回(obs, reward, game_over, info)四元组否则按新版 Gymnasium 返回五元组(obs, reward, terminated, truncated, info)并将game_over terminated or truncatedatari_lib.py。生命损失终止信号若terminal_on_life_lossTrue每次子步骤后通过self.environment.env.ale.lives()读取当前生命数若new_lives self.lives则视为终止否则is_terminal game_overatari_lib.py。双帧最大池化在每个子步骤中直接绕过 Gym 的观测调用_fetch_grayscale_observation()从 ALE 底层抓取灰度画面并写入screen_buffer源码注释说明这样做稍快一些。在循环的最后两帧time_step frame_skip - 2将灰度帧交替写入缓冲区的两个槽位然后由_pool_and_resize()对两帧做逐元素最大池化atari_lib.py。最大池化可以消除隔行闪烁flickering伪影因为 Atari 中某些精灵仅在奇数/偶数帧交替渲染。提前终止一旦is_terminal为真立即跳出循环。因此文档注释特别提醒若因生命损失或对局结束而终止实际执行的子步骤可能少于frame_skip且此时返回的观测可能不包含有效图像数据应予以忽略atari_lib.py。4.1_fetch_grayscale_observation直接抓取灰度帧def _fetch_grayscale_observation(self, output): self.environment.env.ale.getScreenGrayscale(output) return output该方法通过ale_py的底层接口getScreenGrayscale()将当前屏幕直接写入预先分配的output缓冲atari_lib.py。这样做避免了 Gym 观测的转换开销是性能优化的关键细节。4.2_pool_and_resize池化与缩放def _pool_and_resize(self): if self.frame_skip 1: np.maximum( self.screen_buffer[0], self.screen_buffer[1], outself.screen_buffer[0], ) transformed_image cv2.resize( self.screen_buffer[0], (self.screen_size, self.screen_size), interpolationcv2.INTER_AREA, ) int_image np.asarray(transformed_image, dtypenp.uint8) return np.expand_dims(int_image, axis2)该方法的要点atari_lib.py当frame_skip 1时用np.maximum对两个灰度帧做逐元素最大池化且原地写回screen_buffer[0]以节省内存使用 OpenCV 的cv2.resize配合cv2.INTER_AREA插值将画面缩放到(screen_size, screen_size)。INTER_AREA适合缩小图像能有效抑制混叠最终通过np.expand_dims(..., axis2)将形状变为(screen_size, screen_size, 1)即单通道灰度图这也是 Nature DQN 卷积网络输入的标准格式后续堆叠由智能体层完成单帧本身只有 1 个通道。五、Gym 兼容接口与观测空间为了让AtariPreprocessing无缝嵌入 Gym 生态它实现了完整的接口代理atari_lib.pyobservation_space返回gymnasium.spaces.box.Box(low0, high255, shape(screen_size, screen_size, 1), dtypenp.uint8)与处理后观测的真实形状一致atari_lib.py。action_space/reward_range/metadata直接透传底层环境。reset()先重置底层环境通过ale.lives()获取初始生命数将首帧灰度画面抓取到screen_buffer[0]并把screen_buffer[1]填充为 0随后返回_pool_and_resize()的结果——即首帧与全零帧的池化结果atari_lib.py。render(mode)在预处理之前渲染当前屏幕支持rgb_array返回原始 ALE 图像与human通过 Gym 渲染器显示两种模式atari_lib.py。close()透传底层环境的关闭方法。六、在create_atari_environment中的装配与使用AtariPreprocessing是 Dopamine 标准 Atari 环境工厂create_atari_environment的一部分。该工厂同样是gin.configurable的atari_lib.py其核心装配逻辑如下atari_lib.pyelse: # Strip out the TimeLimit wrapper from Gym, which caps us at 100k frames... env env.env env AtariPreprocessing(env) return env具体流程为工厂先根据sticky_actions选择环境版本——使用use_legacy_gym时对应{game_name}NoFrameskip-v0/v4否则使用新版ALE/{game_name}-v5并设置repeat_action_probability0.25sticky actions或0.0确定性版本随后剥离 Gym 的TimeLimit包装器它会把单局限制在 10 万帧且与状态保存/恢复配合不佳改为由 Dopamine 内部处理 10.8 万帧30 分钟的时限最后用AtariPreprocessing包装环境。这就是step()中self.environment.env.ale.lives()这类双重.env解包链的由来。此外当use_ppo_preprocessingTrue时工厂会走另一条基于atari_wrappers的 PPO 预处理分支NoopResetEnv→MaxAndSkipEnv→EpisodicLifeEnv→FireResetEnv→ClipRewardEnv→ResizeObservation→GrayScaleObservation→FrameStack最后再包GameOverWrapper这与AtariPreprocessing是两套并行的预处理方案可根据算法需求选择atari_lib.py。七、通过 gin 配置参数化以terminal_on_life_loss为例由于AtariPreprocessing被gin.configurable装饰它的每个参数都可以在.gin配置文件中直接覆盖。仓库内大量实验配置都显式开启了生命损失终止信号例如dopamine/tf/agents/dqn/configs/dqn_nature.ginAtariPreprocessing.terminal_on_life_loss True并配合atari_lib.create_atari_environment.sticky_actions False复现 Mnih et al. (2015) 的确定性设置dopamine/tf/agents/dqn/configs/dqn_icml.gin、dopamine/tf/agents/rainbow/configs/c51_icml.gin、dopamine/tf/agents/rainbow/configs/rainbow_aaai.gin、dopamine/tf/agents/implicit_quantile/configs/implicit_quantile_icml.gin 同样开启此选项实验室配置如 dopamine/labs/atari_100k/configs/DER.gin、dopamine/labs/atari_100k/configs/SPR.gin、dopamine/labs/cale/configs/sac_cale_100k.gin、dopamine/labs/moes/configs/DER.gin也均将其置为True。一个典型的 gin 配置片段如下import dopamine.discrete_domains.atari_lib atari_lib.create_atari_environment.game_name Pong atari_lib.create_atari_environment.sticky_actions False AtariPreprocessing.terminal_on_life_loss True # AtariPreprocessing.frame_skip 4 # 默认值 # AtariPreprocessing.screen_size 84 # 默认值注意frame_skip与screen_size在配置中通常保持默认值4 和 84因为这是 Nature DQN 协议的标准设置需要复现 Atari 100k 等低样本量实验时也一般只调整terminal_on_life_loss与环境的sticky_actions而保留图像预处理参数不变。八、测试验证行为契约的可执行证明仓库中的单元测试 tests/dopamine/discrete_domains/atari_lib_test.py 用MockEnvironment模拟 ALE 行为逐条验证了本类的核心契约testResetPassesObservation用frame_skip1, screen_size16构造环境后reset()返回的观测形状必须为(16, 16, 1)验证了缩放与单通道输出的正确性testTerminalPassedThrough在frame_skip1下运行恰好max_steps次前max_steps-1步is_terminalFalse最后一步为True验证终止信号的透传testFrameSkipAccumulatesRewardframe_skip2时单步奖励 1返回的累计奖励必须为 2验证奖励累加逻辑testMaxFramePooling第一帧观测值为 2、第二帧为 0最大池化后观测值必须全为 8模拟环境按递减规则生成画面验证双帧逐元素最大池化行为。九、总结AtariPreprocessing是 Dopamine 框架中标准 Atari 观测流水线的基石它把帧跳过、奖励累积、可选的生命损失终止信号、灰度化 双帧最大池化、以及 84×84 下采样这五件事封装为一个 Gym 兼容包装器并通过gin.configurable暴露为可配置项。无论是 TF 版 DQN/Rainbow/IQN 实验还是 JAX 版的离散域智能体最终进入神经网络的都是这个类产出的(84, 84, 1)单通道灰度帧历史堆叠由智能体层完成。如果你需要在自己的实验里复现论文级预处理协议直接复用create_atari_environment即可获得完整装配需要定制时则可以通过 gin 覆盖frame_skip、terminal_on_life_loss、screen_size等参数。相关配套文档可进一步参阅 AtariPreprocessing.md 的姊妹篇 create_atari_environment.md 与 GameOverWrapper.md完整源码位于 dopamine/discrete_domains/atari_lib.py。赞分享机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载相关推荐Dopamine 强化学习框架中 AtariPreprocessingAtari 2600 图像预处理管线全解析Dopamine 强化学习框架中 AtariPreprocessingAtari 2600 图像预处理管线全解析 导读 AtariPreprocessing强化学习机器学习深度学习Dopamine 中 create_atari_environment基于 Machado 协议的 Atari 2600 Gym 环境工厂与预处理全解析Dopamine 中 create_atari_environment基于 Machado 协议的 Atari 2600 Gym 环境工厂与预处理全解析 导读强化学习机器学习深度学习Dopamine 的 create_atari_environmentAtari 2600 环境的标准化预处理与实战配置Dopamine 的 create_atari_environmentAtari 2600 环境的标准化预处理与实战配置 导读 dopamine.discre机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

在 VS Code 与 cn CLI 上运行 Continue.dev 循环工程:primitive 映射、无头调度与 maker/checker 实践

在 VS Code 与 cn CLI 上运行 Continue.dev 循环工程:primitive 映射、无头调度与 maker/checker 实践

人工智能AI AgentAgent 工作流CLI研发协作AI 技能MCP 服务 【免费下载链接】loop-engineering Practical patterns, starters & CLI tools for loop engineering with AI coding agents. Design systems that prompt and orchestrate agents (inspired by Addy Osmani and …

2026/9/24 1:31:18 阅读更多 →
FPGA中ISERDES/OSERDES硬核原理与工程实践

FPGA中ISERDES/OSERDES硬核原理与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 1:31:18 阅读更多 →
OC 角色做成 3D 打印模型前,为什么要重拓扑?从高模到可打印网格的完整流程

OC 角色做成 3D 打印模型前,为什么要重拓扑?从高模到可打印网格的完整流程

把 OC 角色用于 3D 打印时,重拓扑的核心目的不是单纯减少面数,而是将高模整理成具有合理厚度、连续表面、明确部件关系和可检查拓扑的打印网格。 完成重拓扑后,还必须进行非流形、破面、自相交、法线、薄壁、悬空结构和支撑需求检查。具体壁…

2026/9/24 1:31:18 阅读更多 →

最新新闻

双种群进化算法求解模糊柔性作业车间调度与能耗优化

双种群进化算法求解模糊柔性作业车间调度与能耗优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 2:16:46 阅读更多 →
RK3538 vs RK3572:Rockchip芯片选型指南,边缘AI与多媒体场景如何取舍

RK3538 vs RK3572:Rockchip芯片选型指南,边缘AI与多媒体场景如何取舍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 2:16:45 阅读更多 →
ACA Easy Auth 双轨:不改代码接 Bearer 与收口

ACA Easy Auth 双轨:不改代码接 Bearer 与收口

一句话摘要:Azure Container Apps 用 Entra Easy Auth 做网关验签,调用方先加 Bearer、保留旧头;不改业务代码则双轨期匿名也会通。 目录 前言 一、先做决策:双轨还是立刻 Return401 二、架构:验签在 sidecar,业务容器不验 JWT 三、只读盘点与对接命令

2026/9/24 2:15:45 阅读更多 →
快消统仓统配系统怎么选?多品牌仓配整合要点

快消统仓统配系统怎么选?多品牌仓配整合要点

统仓共配指多货主共用仓库、共用运力、共用数据系统的集约化履约模式,本质是一次供应链模式重构,软件只是承载模式的工具。本文面向区域大商与经销商经营者、供应链及仓配管理者,提供四样内容:一套可落地的选型维度、多品牌仓配整…

2026/9/24 2:15:45 阅读更多 →
AI辅助科研:赋能学术创新与效率提升的新路径解析

AI辅助科研:赋能学术创新与效率提升的新路径解析

每次找到心仪的外国文献,却被付费墙冷冷地挡在外面,是不是感觉科研的热情瞬间被浇灭?作为学生党,我太懂这种无力感了。但好消息是,通过几个合法且免费的“通道”和技巧,我们完全能实现“文献自由”。今天分…

2026/9/24 2:15:45 阅读更多 →
嵌入式软件静态测试(二十)——死代码与不可达路径:嵌入式固件中因条件编译产生的隐藏垃圾代码清除

嵌入式软件静态测试(二十)——死代码与不可达路径:嵌入式固件中因条件编译产生的隐藏垃圾代码清除

❄️ 我的个人专栏: 《智能软件工程AI4SE》 《嵌入式面试总结》 《嵌入式处理器架构解析》 《嵌入式与虚拟化》 《嵌入式软件测试》 🌟 Simplicity is the ultimate sophistication摘要:本文聚焦嵌入式固件中因条件编译产生的死代码与不可达…

2026/9/24 2:15:45 阅读更多 →

日新闻

基于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/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

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

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

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

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

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

2026/9/23 9:53:41 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/23 9:53:40 阅读更多 →