DI-engine强化学习入门(九)环境包裹器(Env Wrapper)

在强化学习中,环境(Environment)是智能体(Agent)进行学习和互动的场所,它定义了状态空间、动作空间以及奖励机制。Env Wrapper(环境包装器)提供了一种方便的机制来增强或修改原始环境的功能,而不需要改变环境本身的代码。

Env Wrapper主要有以下的几个特性
1.预处理和归一化:

  • 为了提高学习效率和稳定性,很多时候需要对环境的状态进行预处理,例如归一化处理,使得所有的输入特征都处在同一量级上,以便于智能体更好地学习。
  • Env Wrapper可以在不修改原始环境代码的情况下,添加这些预处理步骤。

2.奖励形状改变(Reward Shaping):

  • 有时原始环境的奖励信号太稀疏或不利于学习,Env Wrapper可以用来修改奖励信号,使之更加符合特定学习任务的需求。

3.动作和状态空间修改:

  • 如果需要对动作空间进行离散化或者对状态空间进行降维,Env Wrapper允许用户实现这样的变换。
  • 这对于将复杂环境简化以适应低容量智能体或算法尤其有用。

4.实验一致性和复现性:

  • 当研究者想要分享他们的实验设置或与其他研究者进行比较时,使用Env Wrapper可以确保所有人都在相同的环境变种上进行实验。

5.代码的模块化和复用:

  • 通过Env Wrappers,可以创建可复用的模块,对不同的环境应用相同的处理逻辑。
  • 这样可以避免代码冗余,提高开发效率。

6.易于维护和扩展:

  • 当需要更新环境处理逻辑时,只需修改对应的Env Wrapper,而不需要重新触碰环境本身的实现。

       例如,若要为一个环境添加噪声处理或者状态的标准化处理,可以创建一个Env Wrapper来实         现这些功能。这样,当需要在不同的环境中实施同样的噪声或标准化处理时,只需要将环境

       通 过这个Env Wrapper传递即可,而不需要为每个环境单独编写处理代码。

DI-engine 提供了大量已经定义好的、通用的 Env Wrapper
DI-engine 继承和扩展了 OpenAI Gym 的设计,提供了一系列通用的 Env Wrapper,以便用户可以轻松地根据自己的需求来修改环境。以下是这些 Env Wrapper 的简介:

 1.NoopResetEnv:

  • 在环境启动时随机执行一定数量的无操作(no-op)步骤,然后再重置环境。这有助于提供更多样化的初始状态。

2.MaxAndSkipEnv:

  • 在连续的几个帧中执行相同的动作,并从中选取两个连续帧的最大值作为代表,这样做可以减少环境内的非必要变化,有助于稳定训练。

3.WarpFrame:

  • 将输入的图像帧缩放到固定的大小(例如 84x84)并转换为灰度图像,这是许多深度强化学习工作中的常见做法。

4.ScaledFloatFrame:

  • 将图像帧的像素值从整数转换为浮点数,并将其标准化到 0 到 1 的范围内。

5.ClipRewardEnv:

  • 将奖励剪裁为 -1, 0, 或 +1,根据奖励的正负性。这样做有利于限制梯度更新的规模,有时能够增加训练的稳定性。

6.FrameStack:

  • 将连续的几个帧堆叠在一起作为网络的输入,以提供给智能体关于动作的时间连续性信息。

7.ObsTransposeWrapper:

  • 重新排列观测数组的维度,这在处理图像输入时特别有用,如将图像数据从 HxWxC 调整为 CxHxW。

8.RunningMeanStd:

  • 计算和更新环境观测值的均值和标准差,通常用于环境状态的归一化处理。

9.ObsNormEnv:

  • 使用实时更新的均值和标准差归一化观测值,以保持输入值的分布稳定。

10.RewardNormEnv:

  • 使用实时更新的均值和标准差归一化奖励值,帮助稳定训练过程。

11.RamWrapper:

  • 将环境的 RAM 状态转换为类似图像的格式,这对于处理非图像的原始状态表示特别有用。

12.EpisodicLifeEnv:

  • 当智能体“死亡”时,即使游戏没有真正结束,也会结束当前的 episode。这可以让智能体更快地学习有关失败的信息。

13.FireResetEnv:

  • 在某些游戏中,环境重置后需要执行一个 “fire” 动作来开始游戏。这个 Wrapper 自动处理这个动作。

二、如何使用 Env Wrapper
下一个问题是我们如何给环境包裹上 Env Wrapper。最简单的一种方法就是手动地显式对环境进行包裹:

from ding.envs.env_wrappers.env_wrappers import NoopResetWrapperenv = gym.make(env_id)  # 'PongNoFrameskip-v4'env = NoopResetWrapper(env, noop_max = 30)env = MaxAndSkipWrapper(env, skip = 4)

我们也可以尝试在gym中使用FrameStack环境包裹器

import gymfrom gym.wrappers import FrameStack# 创建并包裹环境env_id = 'CartPole-v1'env = gym.make(env_id)env = FrameStack(env, num_stack=4)# 使用包裹后的环境运行一些episodefor episode in range(2):    obs = env.reset()    done = False    step = 0    while not done:        action = env.action_space.sample()  # 随机选择动作        obs, reward, done, info = env.step(action)        print(f"Episode: {episode}, Step: {step}, Observation Shape: {obs.shape}, Reward: {reward}, Done: {done}")        step += 1    print(f"Episode {episode} finished after {step} steps.")# 关闭环境env.close()

以下是在 Python 中非显式的使用 Env Wrapper 的具体示例: 

点击DI-engine强化学习入门(九)环境包裹器(Env Wrapper) - 古月居可查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/607429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘新时代的内容创作:一键生成的AI黑科技

在数字媒体的浪潮下,内容创作已成为连接人与信息的重要桥梁。然而,头条、公众号等平台上的爆文创作,对很多内容创作者来说却是一项挑战。“从选题到找素材,再到成文,”这个过程不仅耗时至少1到2个小时,而且…

【go项目01_学习记录08】

学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数,将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…

产品评测:SmartX 与 Nutanix 超融合在数据库场景下的性能表现

重点内容 SmartX 与 Nutanix 超融合分布式存储设计差异如何影响数据库性能表现。重点测试结论:数据库场景下,SmartX 超融合基于单卷部署的性能,依旧优于 Nutanix 超融合基于多卷部署最佳配置的性能。更多 SmartX、VMware、Nutanix 超融合技术…

高防护皮带机巡检机器人:适应恶劣环境的智能助手

在众多工业领域中,皮带机作为一种重要的物料输送设备,广泛应用于发电厂、煤栈等场所。然而,长期以来,皮带机的巡检工作一直依赖人工,存在着劳动强度大、检测效率低、安全性差等问题。为了解决这些痛点,皮带…

Day05-JavaWeb开发-请求响应(postman工具/参数/案例)分层解耦(三层架构/IOC-DI引入)

1. 请求响应 1.1 概述 1.2 请求-postman工具 1.3 请求-简单参数&实体参数 1.3.1 简单参数 1.3.2 实体参数 1.4 请求-数组集合参数 1.5 请求-日期参数&json参数 1.6 请求-路径参数 1.7 响应-ResponseBody 1.8 响应-案例 2. 分层解耦 2.1 三层架构 2.2 分层解耦(IOC-D…

GitHub Actions 手动触发方式

目录 前言 Star Webhook 手动触发按钮 前言 GitHub Actions 是 Microsoft 收购 GitHub 后推荐的一款 CI/​CD 工具早期可能是处于初级开发阶段,它的功能非常原生,甚至没有直接提供一个手动触发按钮一般的触发方式为代码变动(push 、pull…

使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画 引言准备工作效果展示代码结构代码解析第一部分:导入库和设置基本参数第二部分:流体类定义MyFluidDataConfig 类详解MyFluidData 类详解my_update 方法详解流体类定义完整代码 第三部分:太…

无监督式学习

1.是什么? 无监督式学习与监督式学习**最大的区别就是:**没有事先给定的训练实例,它是自动对输入的示例进行分类或者分群; 优点:不需要标签数据,极大程度上扩大了我们的数据样本,其次不受监督信…

部署 Sentinel 控制台:实现流量管理和监控

序言 Sentinel 是阿里巴巴开源的一款流量防护与监控平台,它可以帮助开发者有效地管理微服务的流量,实现流量控制、熔断降级、系统负载保护等功能。本文将介绍如何在项目中部署和配置 Sentinel 控制台,实现微服务的流量防护和监控。 一、Sen…

WEB基础--单元测试与三层架构

单元测试 为什么要进行单元测试 减少创建类,我们希望在一个类中,并且测试时不需要改代码,那么我们就要用到junit单元测试 常见测试分类 黑盒测试 黑盒测试也叫功能测试,主要关注软件每个功能是否实现,并不关注软件代…

【websocket-客户端可视化工具】

postman 新版postman (版本v11以上) ,除了http协议,还支持了Websocket,MQTT,gRPC等多种连接协议,可以作为多种协议的客户端,使用起来非常方便。 使用 服务端代码 这里以websocket协议举例,代…

【Linux】网络接口绑定和组合的操作实例

网络接口绑定和组合的操作实例 (一)网卡1. 增2. 查3. 激活——设置网络接口 (二)网络接口绑定1. 概述2. 实验操作3. 删除绑定 (三)网络接口组合1. 概述2. 实验操作 (一)网卡 1. 增 …

分割模型Maskformer系列

maskformer:Per-Pixel Classification is Not All You Need for Semantic Segmentation 论文地址:https://arxiv.org/pdf/2107.06278 1.概述 传统的语义分割方法通常采用逐像素分类(per-pixel classification),而实…

【JAVA基础之装箱和拆箱】自动装箱和自动拆箱

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.包装类 1.1 概述 1.2 Integer类 1.3 装箱和拆箱 1.4 自动装箱和自动拆箱 1.5 基本类型与字符串之间的转换 1.5.1 基本类型转换为字符串 1.5.2 字符串转…

带你破解晶振PCB的布局要点!

一、晶振的分类 01 无源晶振 无源晶振器是一种 passives 振荡器,它不需要外部电源来维持振荡。它的振荡频率由晶体的物理尺寸和材料特性决定(一般都采无源晶振)。 02 有源晶振 有源晶振器是一种 active 振荡器,它需要外部电源来…

计算机中GPU快不行的几个标志,看下有没有你遇到的

GPU是处理图形密集型任务的主要组件。尽管它非常耐用,但它最终会磨损并开始失效。在到达生命的终结之前,它通常会显示出即将发生故障的迹象,需要及时修复或更换。本指南详细介绍了这些标志。 在我们开始之前 在深入研究GPU故障的迹象之前,重要的是要承认,下面提到的一些…

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取代传统蒸馏学习中以教…

Leetcode—394. 字符串解码【中等】

2024每日刷题&#xff08;131&#xff09; Leetcode—394. 字符串解码 实现代码 class Solution { public:string decodeString(string s) {string curstr;int curNum 0;stack<pair<string, int>> st; for(char c: s) {if(isdigit(c)) {curNum curNum * 10 (c…

电脑中的两个固态硬盘比一个好,想知道为什么吗

你当前的电脑很有可能有一个NVME SSD作为主驱动器&#xff0c;但可能至少还有一个插槽可以放另一个SSD&#xff0c;而且这样做可能是个好主意。 两个SSD可以提高性能 如果你有两个固态硬盘&#xff0c;你可以从中获得比有一个更好的性能。一种方法是使用RAID 0将两个驱动器组…

Python_AI库 Pandas的loc和iloc的区别与使用实例

Python中Pandas的loc和iloc的区别与使用实例 在Pandas中&#xff0c;loc和iloc是两个常用的方法&#xff0c;用于基于标签&#xff08;label&#xff09;和整数位置&#xff08;integer location&#xff09;来选择数据。尽管两者在功能上有重叠&#xff0c;但它们在用法和性能…