强化学习实战1——DQN 登月器降落

张开发
2026/4/11 12:36:25 15 分钟阅读

分享文章

强化学习实战1——DQN 登月器降落
控制登月器的降落01 - stable baseline3的介绍_哔哩哔哩_bilibiliGymnasium 环境简介https://gymnasium.farama.org/api/env/Gymnasium 环境Env的核心标准 API 非常简洁主要由4 个核心函数和2 个核心属性组成。这是所有强化学习任务交互的基础。 1. 核心交互函数这些是你在训练循环Training Loop中必须调用的函数。函数名参数/说明返回值 (Tuple).reset()(重置环境)作用在每个回合Episode开始前调用将环境恢复到初始状态。参数seed(可选用于复现实验结果),options(特定环境的额外参数)。1.observation初始环境状态符合observation_space定义。2.info辅助诊断信息字典。.step(action)(执行动作)作用这是强化学习的核心。将 Agent 的动作Action传入环境环境反馈下一步的状态和奖励。参数action(Agent 选择的动作)。1.observation执行动作后的新环境状态。2.reward该动作获得的奖励浮点数。3.terminated布尔值。True表示回合正常结束如到达目标/坠毁。4.truncated布尔值。True表示回合被强制截断如超时/出界。5.info辅助诊断信息。.render()(渲染画面)作用将环境的当前状态可视化。注意在gymnasium.make()时需指定render_mode如human,rgb_array。根据render_mode不同而不同*human通常返回None(直接在窗口显示)。*rgb_array返回图像帧np.ndarray。*ansi返回文本字符串。.close()(关闭环境)作用释放环境占用的资源如关闭 Pygame 窗口、数据库连接等。建议在脚本结束或训练完成后调用。None 2. 核心属性 (Spaces)在编写代码前你需要通过这两个属性来了解环境的输入输出规格.action_space含义定义了 Agent 可以采取的所有合法动作的范围。用途用于构建 Agent 的输出层。例如如果是Discrete(4)说明有 4 个离散动作如 Lunar Lander 的 0, 1, 2, 3。常用方法sample()(随机采样一个动作)。.observation_space含义定义了环境状态观测值的数据结构和范围。用途用于构建 Agent 的输入层。例如Box(4,)表示一个包含 4 个浮点数的数组。常用方法sample()(随机采样一个观测值常用于测试)。️ 3. 辅助属性与函数.metadata包含环境的元信息比如支持的渲染模式 (render_modes) 和帧率 (render_fps)。.spec环境的配置规格通常在通过gymnasium.make()创建时生成。.np_random环境内部的随机数生成器用于保证实验的可复现性 (Reproducibility)。 总结代码模板一个标准的 Gymnasium 交互循环通常长这样import gymnasium as gym # 1. 创建环境 (指定渲染模式) env gym.make(LunarLander-v3, render_modehuman) # 2. 重置环境 obs, info env.reset(seed42) # 3. 交互循环 for _ in range(1000): # 渲染 (可选) env.render() # 采样随机动作 (这里换成你的 AI 模型预测) action env.action_space.sample() # 执行动作 obs, reward, terminated, truncated, info env.step(action) # 检查回合是否结束 if terminated or truncated: obs, info env.reset() # 重新开始 # 4. 关闭环境 env.close()问题描述与简介上一节我们讲到这个动作空间是4那是哪几个动作呢我们去gym官网查一下https://gymnasium.farama.org/environments/box2d/描述这个环境是一个经典的火箭轨迹优化问题。根据庞特里亚金最大值原理Pontryagin’s maximum principle最优策略是将引擎开至最大推力或将其关闭。这就是为什么这个环境使用离散动作的原因引擎开启或关闭。该环境有两种版本离散版或连续版。着陆垫始终位于坐标 (0,0) 处。坐标是状态向量中的前两个数值。允许在着陆垫之外着陆。燃料是无限的因此智能体可以学习如何飞行然后在第一次尝试时就成功着陆。动作空间有四个离散动作可供选择0什么也不做1点燃左侧姿态控制引擎2点燃主引擎3点燃右侧姿态控制引擎Observation Space (观测空间)状态是一个 8 维向量着陆器在 x 和 y 轴上的坐标、它在 x 和 y 轴上的线速度、它的角度、它的角速度以及两个布尔值分别表示每条腿是否接触地面。Observation SpaceBox([ -2.5 -2.5 -10. -10. -6.2831855 -10. -0. -0. ], [ 2.5 2.5 10. 10. 6.2831855 10. 1. 1. ], (8,), float32)Rewards (奖励)每一步之后都会给予奖励。一个回合的总奖励是该回合内所有步骤奖励的总和。对于每一步奖励会根据着陆器离着陆垫的远近增加/减少。根据着陆器移动的快慢增加/减少。根据着陆器倾斜程度角度不水平而减少。每有一条腿接触地面增加 10 分。每一帧侧向引擎点火减少 0.03 分。每一帧主引擎点火减少 0.3 分。回合结束时如果坠毁或安全着陆将分别获得额外的 -100 或 100 分奖励。如果一个回合的得分至少为 200 分则视为成功解决solved。起始状态着陆器从视窗顶部中心开始其中心质量受到一个随机的初始力作用。回合终止在以下情况下回合结束着陆器坠毁着陆器主体与月球接触着陆器移出视窗x 坐标大于 1着陆器处于非唤醒状态not awake。根据 Box2D 的文档非唤醒状态的物体是指不移动且不与其他物体发生碰撞的物体当 Box2D 确定一个物体或一组物体已经静止时该物体会进入睡眠状态该状态的 CPU 开销极小。如果一个唤醒状态的物体与一个处于睡眠状态的物体发生碰撞睡眠状态的物体会被唤醒。如果附着在物体上的关节或接触点被销毁物体也会被唤醒。参数Lunar Lander月球着陆器提供了大量参数1import gymnasium as gym 2env gym.make(LunarLander-v3, continuousFalse, gravity-10.0, 3 enable_windFalse, wind_power15.0, turbulence_power1.5) 4env 5TimeLimitOrderEnforcingPassiveEnvCheckerLunarLanderLunarLander-v3continuous决定使用离散动作还是连续动作对应引擎的油门。分别对应动作空间Discrete(4)或Box(-1, 1, (2,), dtypenp.float32)。对于连续动作动作的第一个坐标决定主引擎的油门第二个坐标指定侧向助推器的油门。给定一个动作np.array([main, lateral])如果main 0主引擎将完全关闭当0 main 1时油门在 50% 到 100% 之间线性缩放特别是主引擎在低于 50% 的功率下不工作。类似地如果-0.5 lateral 0.5侧向助推器将完全不点火。如果lateral -0.5左侧助推器点火如果lateral 0.5右侧助推器点火。同样油门在-1到-0.5以及0.5到1之间在 50% 到 100% 之间线性缩放。gravity决定重力常数其值被限制在 0 到 -12 之间。默认值为 -10.0。enable_wind决定是否对着陆器施加风力效果。风力是使用函数tanh(sin(2 k (tC)) sin(pi k (tC)))生成的其中k设为 0.01C在 -9999 到 9999 之间随机采样。wind_power决定施加给飞行器的线性风力的最大幅度。wind_power的推荐值在 0.0 到 20.0 之间。turbulence_power决定施加给飞行器的旋转风力湍流的最大幅度。turbulence_power的推荐值在 0.0 到 2.0 之间。env环境测试代码编写输入并执行env gym.make(LunarLander-v3, render_modehuman) eposides30 for ep in range(eposides): obs env.reset();#初始化环境reset()返回obs和info terminated False #终止条件改为terminated truncated truncated False rewards 0 while not terminated or truncated: action env.action_space.sample() #任取一个动作 obs,reward,terminated,truncated,info env.step(action) #执行动作并获取返回值 env.render() rewardsreward print(rewards)我们是sample随机采样因此输出的总奖励都是负数。环境终止与奖励当没终止时采取动作执行动作并获取返回值累计奖励展示DQN的应用从Q-Learning到DQN我们讲过Q-Learning了简单来说Q-Learning 是基础算法而 DQN 是为了解决 Q-Learning 的局限性结合了深度学习技术后的升级版。以下是详细的对比和解析1. 核心区别如何存储“经验” (Q表 vs 神经网络)这是两者最本质的区别。Q-Learning (查表法)它使用一张巨大的表格Q-Table来记录经验。表格里记录了每一个“状态”下做每一个“动作”能得多少分Q值。局限内存不够,且如果状态非离散就完蛋了DQN (函数近似法)它抛弃了表格使用一个深度神经网络来“估算”Q值。它不再死记硬背每一个状态而是像人一样通过观察图像输入利用神经网络的拟合能力推测出当前该做什么动作。优势它可以处理高维度的输入比如直接读取游戏画面的像素解决了 Q-Learning 无法处理复杂环境的问题。场景Q-Learning (账房先生)DQN (直觉高手)遇到新情况查表发现没记录懵了。依靠神经网络推算大概知道该怎么做。存储空间需要一个巨大的 Excel 表格 (Q-Table)。只需要保存神经网络的参数 (权重)。学习方式走一步改一步表格数据。积累一堆经验批量训练大脑。适用性简单的、格子状的世界。复杂的、连续的世界如月球着陆、赛车。2. DQN 的两大“法宝” (为什么 DQN 更稳)如果仅仅是把表格换成神经网络训练往往很不稳定。DQN 之所以成功是因为它在 Q-Learning 的基础上引入了两个关键技术经验回放 (Experience Replay)Q-Learning学完一步立马更新容易“钻牛角尖”被最近的几步经验带偏。DQN把过去的经验状态、动作、奖励、新状态都存在一个“记忆池”里训练时随机抽取一批来学习。这打破了数据之间的相关性让学习更稳定。目标网络 (Target Network)Q-Learning更新目标一直在变导致训练震荡。DQN使用两个网络一个负责“当前决策”一个负责“设定目标”。目标网络的参数更新得比较慢定期复制主网络的参数这就像给训练定了一个暂时的“靶子”让模型能更稳地瞄准。DQN过程 初始状态大脑里的神经连接是随机的他也是个“菜鸟”走起路来跌跌撞撞。 第一次尝试他站在起点看着眼前的画面输入状态。大脑输出了一堆乱七八糟的指令他随机向右走。掉坑了。训练大脑反向传播他不会去记具体的坐标而是告诉大脑“刚才那个画面状态做‘向下’这个动作是错的把相关的神经连接权重调低一点。” 经验回放关键区别他不会像 Q-Learning 那样走一步改一步脑子。他会把刚才的经历(起点, 向右, 掉坑, -10)存在记忆库Experience Replay Buffer里。每隔一会儿他会从记忆库里随机抽取一批过去的经历来复习。通过复习他的大脑学会了规律特征提取“哦原来看到红色的东西陷阱要避开。”“看到终点绿色要靠近。”“速度太快时不能猛拉操纵杆。”策略网络与目标网络为了防止大脑“朝令夕改”DQN 有两个大脑主大脑负责实时决策时刻在变。目标大脑负责提供“标准答案”每隔一段时间才更新一次复制主大脑的参数。这样主大脑在学习时就有了一个相对稳定的目标。在 Stable Baselines 3 的代码中你只看到了一个model实例但在 DQN 的算法逻辑中实际上涉及两个关键的网络参数评估网络Online Network参数为 w 。它是我们正在训练、不断更新参数的那个网络即图中定义的 Q(s,a;w)。目标网络Target Network参数为 w− 。它的结构和评估网络完全一样但参数是冻结的每隔一段时间才从评估网络复制过来。为什么要这么做直接用同一个网络去计算“目标值”和“预测值”会导致训练不稳定因为目标值会随着网络的更新而剧烈震荡。使用一个“慢更新”的目标网络 w− 可以提供一个相对稳定的“靶子”让评估网络 w 去学习逼近。它们是如何互动的这两个网络的参数关系是单向复制的1. 从经验回放池中采样一批数据在训练开始前智能体已经在环境中进行了一段时间的探索积累了大量的经验。这些经验以元组的形式存储在经验回放池中初始化时创建策略网络随机权重。创建目标网络。动作把策略网络的权重复制一份给目标网络。此时策略网络参数 目标网络参数训练时 (每一步)策略网络接收梯度参数发生变化学生学到了新知识。目标网络纹丝不动老师保持旧的知识确保教学目标稳定。此时策略网络参数 ! 目标网络参数合作逻辑这一步确保了目标网络始终跟随评估网络的步伐但又比评估网络慢半拍从而保证了训练的稳定性。速通初始化时创建策略网络随机权重。创建目标网络。动作把策略网络的权重复制一份给目标网络。此时策略网络参数 目标网络参数训练时 (每一步)策略网络接收梯度参数发生变化学生学到了新知识。目标网络纹丝不动老师保持旧的知识确保教学目标稳定。此时策略网络参数 ! 目标网络参数更新时 (每隔 N 步)触发target_update_interval。动作再次把策略网络最新的权重硬拷贝给目标网络。此时策略网络参数 目标网络参数同步了总结对比步骤评估网络 (θ)目标网络 (θ−)互动关系1. 数据从回放缓冲区随机抽取经验。无操作。评估网络提供数据来源。2. 定标无操作。计算目标值 yt目标网络充当“裁判”给出标准答案。3. 预测计算预测值 Q无操作。评估网络充当“考生”给出当前答案。4. 学习计算误差反向传播更新自身。无操作。评估网络根据误差修正自己。5. 同步无操作。定期/缓慢接收评估网络的参数。目标网络跟随评估网络的步伐保持稳定。DQN能解决连续问题不用存表通过神经网络实现。两大特点记忆池回放目标网络目标网络和策略网络的更新机制定时重传DQN的策略模型stable_baselines3.dqn.MlpPolicy下属三个类处理离散输入处理图像输入处理多输入DQN的参数理解这两者的区别就理解了深度强化学习框架中“算法”与“网络”的分层设计思想。简单来说这两个参数板块的区别如下1.Parameters(DQN 类的参数)描述的是“怎么学” (Learning Configuration)这部分参数控制的是DQN 算法本身的运行流程、优化器和训练策略。它们决定了智能体如何与环境交互、如何存储经验以及如何更新参数。核心关注点训练稳定性、数据采样、更新频率。典型参数learning_rate(学习率)控制梯度下降的步长。buffer_size(回放缓冲区大小)经验回放池能存多少条数据。batch_size(批量大小)每次训练从池子里取多少数据。gamma(折扣因子)未来奖励的重要性。target_update_interval(目标网络更新间隔)每隔多少步更新一次目标网络。exploration_fraction/exploration_final_eps(探索参数)控制 Epsilon-Greedy 策略的探索率。2.DQN Policies(策略/网络的参数)描述的是“学什么” (Network Architecture)这部分参数控制的是神经网络的结构。它们决定了智能体的“大脑”长什么样即输入状态如坐标、图像如何被处理并输出动作价值Q值。核心关注点网络层数、激活函数、特征提取方式。典型参数net_arch(网络架构)隐藏层的层数和每层的神经元数量例如[128, 128]表示两个隐藏层每层 128 个神经元。activation_fn(激活函数)如ReLU,Tanh等。optimizer_class(优化器)如Adam,RMSprop。features_extractor_class(特征提取器)针对图像CNN或字典Dict输入的特殊处理层。 总结对比表维度Parameters(DQN)DQN Policies(策略)中文含义算法超参数网络架构参数解决的问题控制训练过程 (How to train)定义模型结构 (What is the model)类比驾驶员的驾驶习惯(油门踩多深、多久看一次后视镜)汽车的硬件配置(发动机排量、变速箱类型)常见参数gamma,buffer_size,target_update_intervalnet_arch,activation_fn,features_extractor_class传参方式直接传给DQN()构造函数通过policy_kwargs字典传给DQN() 代码中的实际关系在代码中这两部分参数是这样结合在一起的# 这里的参数直接属于 DQN 算法 model DQN( MlpPolicy, # 固定的策略名称 env, # 环境 learning_rate1e-3, # -- 这属于 Parameters (控制优化过程) buffer_size10000, # -- 这属于 Parameters (控制经验回放) # 这里的参数属于 网络 (Policy) policy_kwargs{ net_arch: [64, 64], # -- 这属于 DQN Policies (控制网络层数) activation_fn: nn.Tanh, # -- 这属于 DQN Policies (控制激活函数) }, verbose1 )DQN的使用样例import gymnasium as gym from stable_baselines3 import DQN env gym.make(CartPole-v1, render_modehuman) model DQN(MlpPolicy, env, verbose1) model.learn(total_timesteps10000, log_interval4) model.save(dqn_cartpole) del model # remove to demonstrate saving and loading model DQN.load(dqn_cartpole) obs, info env.reset() while True: action, _states model.predict(obs, deterministicTrue) obs, reward, terminated, truncated, info env.step(action) if terminated or truncated: obs, info env.reset()I 运行DQN网络# 创建模型实例 model DQN(MlpPolicy, env, verbose1)#使用什么模型训练 使用模型的什么策略 什么环境模型架构参数 model.learn(total_timestepsint(2e5), progress_barTrue) #训练参数 model.save(dqn_lunar) #保存模型 del model #删除模型实例del model是删除这个对象但是其内容已经保存在dqn_lunar中了运行后输出是平均误差从-300到-100左右但还是很大。II 评估网络我们评估网络首先加载模型# Load the trained agent # NOTE: if you have loading issue, you can pass print_system_infoTrue # to compare the system on which the model was trained vs the current one # model DQN.load(dqn_lunar, envenv, print_system_infoTrue) model DQN.load(dqn_lunar, envenv) #从哪里 加载模型到当前环境中在导航栏找到Evaluation Helper找到对evaluate_policy的描述函数参数详解该函数提供了丰富的参数来控制评估过程model: 需要评估的 RL 智能体必须实现predict方法。env: 目标 Gym 环境或向量化环境VecEnv。n_eval_episodes(默认 10): 评估运行的回合数。deterministic(默认 True): 是否使用确定性动作关闭探索噪声通常测试时设为 True 以获得更稳定的成绩。render(默认 False): 是否渲染环境画面。return_episode_rewards(默认 False): 如果为 True函数将返回每回合的具体奖励列表而不是直接返回平均值。warn(默认 True): 如果环境中没有包装Monitor包装器会发出警告。对加载的模型进行评估# Evaluate the agent # NOTE: If you use wrappers with your environment that modify rewards, # this will be reflected here. To evaluate with original rewards, # wrap environment in a Monitor wrapper before other wrappers. model.set_env(env) #将模型与新创建的渲染环境关联起来 mean_reward, std_reward evaluate_policy(model, model.get_env(),deterministicTrue,renderFalse, n_eval_episodes10) print(mean_reward)输出结果和我们训练时差不多。III 设置可视化tensorboard我们将训练时的日志记录下来方便查看。在训练参数中找到 两项第一项填写保存路径第二项填写保存的名称# Instantiate the agent model DQN(MlpPolicy, env, verbose1,tensorboard_log./logs) # Train the agent and display a progress bar model.learn(total_timestepsint(2e5), progress_barTrue,tb_log_nameDQN) # Save the agent model.save(dqn_lunar) del model # delete trained model to demonstrate loading # Load the trained agent # NOTE: if you have loading issue, you can pass print_system_infoTrue # to compare the system on which the model was trained vs the current one # model DQN.load(dqn_lunar, envenv, print_system_infoTrue) model DQN.load(dqn_lunar, envenv)在终端输入pip install tensorboard运行tensorboard --logdir ./logs如果有如下报错ModuleNotFoundError: No module named pkg_resources执行这个pip install setuptools81.0.0出现这个就对了TensorBoard 2.20.0 at http://localhost:6006/ (Press CTRLC to quit)现在打开是这样的现在回到jupyter重新运行再打开刚刚的网页刷新一下就有每一批数据了可以在左侧这里调节曲线颜色可以在右上角调节早晚模式IV 评估20万次后的模型训练结束最后的平均奖励在-64左右比之前的-100有所提升。到网页中查看第一张图是每一句能走的步数逐步到1000步左右这意味着模型并没有选择降落而是持续飞在天上直到超时模型还没学会降落。第二张图是平均奖励可以发现最后在-70左右。最重要第三张图是探索率最终下降到0.05和其他人的示例差不多都经历了峰后下降的过程。而且都是双峰结构第二行图表是帧数意思是每秒计算多少步图像就是多少帧第三行有两张图第一张是学习率我们设死是1e-4第二张是损失震荡很大接下来评估模型训练效果重启这段代码# Evaluate the agent # NOTE: If you use wrappers with your environment that modify rewards, # this will be reflected here. To evaluate with original rewards, # wrap environment in a Monitor wrapper before other wrappers. # Create environmentw model.set_env(env) mean_reward, std_reward evaluate_policy(model, model.get_env(),deterministicTrue,renderFalse, n_eval_episodes10) print(mean_reward)emmmm反而更差了这很正常。这证明单纯提高训练次数并不能很好地提示模型性能。因此我们需要修改模型的架构。V 修改全连接层网络结构DQN 算法为了保证训练稳定性使用了两个网络Online Network当前网络负责选择动作和计算当前的 Q 值。Target Network目标网络负责计算 TD 目标值Target Value。这两个网络的结构完全相同但参数不同。Target Network 的参数会定期或缓慢地从 Online Network 同步过来。model DQN(MlpPolicy, env, verbose1, tensorboard_log./logs, learning_rate5e-4, policy_kwargs{net_arch:[256, 256]} )为什么代码里只看到一个因为 Stable Baselines 3SB3将这种机制封装在了DQN类内部。当你写model DQN(...)时你创建的是一个训练代理Agent而不是一个神经网络层。这个DQN代理内部会自动创建两个q_net一个 Online一个 Target。你传入的policy参数例如MlpPolicy定义的是这两个网络的结构模板。SB3 会根据这个模板内部生成两个实例。查看当前的网络结构我们如何查看当前网络的结构呢model.policy具体而言对于策略网络q_net输入维度是in_features8这正好是我们之前看到的八个observation状态量。输出正好是out_features4正好对应action的四个动作。中间夹了两层ReLu激活层。对于目标网络其实是策略网络的一个镜像策略网络定期把权重参数更新过来因此输入输出特征维度和策略网络一致。模型架构参数的修改策略外参可以直接在DQN类中修改比如我们看到默认的学习率很低但是策略内参必须用字典传递此外我们还需要知道如何传policy参数在导航栏找到Policy networks在下文找到修改样例为了确认原始的大小是多少我们点击策略内参的source源码查看我们这次可以改为[256,256]。别忘了修改日志的名称为Net_256并把模型的保存名称也改为dqn_Net256_lunar再次执行model.policy发现当前修改后的网络变成了256*256了。# Instantiate the agent model DQN(MlpPolicy, env, verbose1, tensorboard_log./logs, learning_rate5e-4, policy_kwargs{net_arch:[256, 256]} ) # Train the agent and display a progress bar model.learn(total_timestepsint(1e5), progress_barTrue,tb_log_nameDQN_Net256) # Save the agent model.save(dqn_Net256_lunar) del model # delete trained model to demonstrate loading然后我们重启训练模型VI 修改全连接后评估模型可以明显看出来在这里总算突破了正奖励但是很快又跌回去了。重启评估看一下那我无话可说了是吧强化学习就是随机性很大策略在优化遗憾的是数值却往下掉就像高三的你一样。。。很难受就是这样。VII 增加到500000次 增大更新步长为7e-4。这次成功了最主要的标志就是步数开始转折因为如果步数从增到减说明滞空时间开始减少也就是说登月器开始通过降落得分而不是延长滞空时间。经过近10小时的训练奖励已经接近200了同时其损失也逐渐稳定下来。VIII 更多步数与参数黄色当增加到1000000次步长设定为7e-4后可以看到更明显的步数下降以及更高的奖励接近了230说明模型已经学会降落了不再依靠滞空得分。但是在接近230时突然发生了突降这就是由于更新步长过大掉下悬崖了因为我们对更新步长减小。紫色当将步长改为4e-4很明显在这一段是持续上升的奖励也超过了260特征分析对比步数和奖励图可以发现有趣的规律在第一个峰值过后步数和奖励呈现负相关。这是因为模型追求快速降落来得分而不是滞空得分因此降落的越快越准奖励就越高而在步数的峰前由于模型还没学习降落只知道滞空因此奖励几乎是随机的出现的峰值也只是局部最优。而步数的第一个峰出现在180k到250k之间这意味着模型要近200k步才开始学习降落这就导致小于200k的训练都会夭折也就是灰色线和天蓝色线。IX 200万步后的情况经过近一天的训练后我们设定的200万步紫色和250万步橙色的DQN模型终于训练完了可以明显看到在超过100万步后模型的奖励基本就稳定在200以上波动了最高可以达到270左右已经是非常棒的水平了再看到步数表200万步后都降低到200步左右这意味着模型学会了快速降落X Jupyter代码前置导入import stable_baselines3 as sb3 print(sb3.__version__)import gymnasium as gym from stable_baselines3 import DQN,A2C from stable_baselines3.common.evaluation import evaluate_policy import os os.environ[KMP_DUPLICATE_LIB_OK]True创建降落环境# Create environment env gym.make(LunarLander-v3, render_modehuman)确认参数训练模型# Instantiate the agent model DQN(MlpPolicy, env, verbose1, tensorboard_log./logs, learning_rate5e-4, policy_kwargs{net_arch:[256, 256]} ) # Train the agent and display a progress bar model.learn(total_timestepsint(2e6), progress_barTrue,tb_log_nameDQN_256_2.5M1) # Save the agent model.save(dqn_Net256_2.5M1_lunar) del model # delete trained model to demonstrate loading加载模型model DQN.load(dqn_Net256_2.5M_lunar, envenv)评估模型# Evaluate the agent # NOTE: If you use wrappers with your environment that modify rewards, # this will be reflected here. To evaluate with original rewards, # wrap environment in a Monitor wrapper before other wrappers. # Create environmentw model.set_env(env) mean_reward, std_reward evaluate_policy(model, model.get_env(),deterministicTrue,renderFalse, n_eval_episodes10)输出奖励print(mean_reward)

更多文章