返回顶部
首页 > 资讯 > 精选 >怎么使用actor-critic方法来控制CartPole-V0游戏
  • 610
分享到

怎么使用actor-critic方法来控制CartPole-V0游戏

2023-07-06 01:07:15 610人浏览 薄情痞子
摘要

本篇内容主要讲解“怎么使用actor-critic方法来控制CartPole-V0游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用actor-critic方法来控制CartPole-V

本篇内容主要讲解“怎么使用actor-critic方法来控制CartPole-V0游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用actor-critic方法来控制CartPole-V0游戏”吧!

CartPole 介绍

在一个光滑的轨道上有个推车,杆子垂直微置在推车上,随时有倒的风险。系统每次对推车施加向左或者向右的力,但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 +1 的奖励。但是当杆子与垂直方向成 15 度以上的位置,或者推车偏离中心点超过 2.4 个单位后,这一轮局游戏结束。因此我们可以获得的最高回报等于 200 。我们这里就是要通过使用 PPO 算法来训练一个强化学习模型 actor-critic ,通过对比模型训练前后的游戏运行 gif 图,可以看出来我们训练好的模型能长时间保持杆子处于垂直状态。

Actor Critic 介绍

当 agent 采取行动并在环境中移动时,它在观察到的环境状态的情况下,学习两个可能的输出:

  • 接下来最合适的一个操作,actor 负责此部分输出。

  • 未来可能获得的奖励总和,critic 负责此部分的输出。

actor 和 critic 通过不断地学习,以便使得 agent 在游戏中最终获得的奖励最大,这里的 agent 就是那个小车。

库准备

Tensorflow-gpu==2.10.0imageio==2.26.1keras==2.10,0gym==0.20.0pyglet==1.5.20scipy==1.10.1

设置超参数

这部分代码主要有:

(1)导入所需的python库:gym、numpy、tensorflow 和 keras。

(2)设置整个环境的超参数:种子、折扣因子和每个回合的最大步数。

(3)创建 CartPole-v0 环境,并设置种子。

(4)定义一个非常小的值 eps ,表示的机器两个不同的数字之间的最小差值,用于检验数值稳定性。

import gym # 导入Gym库,用于开发和比较强化学习算法import numpy as np # 导入NumPy库,用于进行科学计算import tensorflow as tf # 导入TensorFlow库from tensorflow import keras # 导入keras模块,这是一个高级神经网络apifrom tensorflow.keras import layers # 导入keras中的layers模块,用于创建神经网络层seed = 42 # 设定随机种子,用于复现实验结果gamma = 0.99 # 定义折扣率,用于计算未来奖励的现值max_steps_per_episode = 10000 # 设定每个 episode 的最大步数env = gym.make("CartPole-v0") # 创建 CartPole-v0 环境实例env.seed(seed) # 设定环境的随机种子eps = np.finfo(np.float32).eps.item() # 获取 float32 数据类型的误差最小值 epsilon

Actor Critic 结构搭建

(1)Actor:将环境的状态作为输入,返回操作空间中每个操作及其概率值,其实总共只有两个操作,往左和往右。

(2)Critic:将环境的状态作为输入,返回未来奖励综合的估计。

(3)在这里网络结构中我们在一开始接收 inputs 之后,我们的 Actor 和 Critic 共用了中间的部分隐藏层 common 层,然后在一个输出分支上连接了一个全连接进行动作分类作为 action ,另一个分支上连接了一个全连接层进行未来奖励计算作为 critic 。

num_inputs = 4 # 状态空间的维度,即输入层的节点数num_actions = 2 # 行为空间的维度,即输出层的节点数num_hidden = 128 # 隐藏层的节点数inputs = layers.Input(shape=(num_inputs,)) # 创建输入层,指定输入的形状common = layers.Dense(num_hidden, activation="relu")(inputs) # 创建一个全连接层,包含num_hidden 个神经元,使用 ReLU 作为激活函数action = layers.Dense(num_actions, activation="softmax")(common) # 创建一个全连接层,包含 num_actions 个神经元,使用 softmax 作为激活函数critic = layers.Dense(1)(common) # 创建一个全连接层,包含1个神经元model = keras.Model(inputs=inputs, outputs=[action, critic]) # 创建一个 Keras 模型,包含输入层、共享的隐藏层和两个输出层

训练前的样子

import imageiOStart = env.reset() frames = []for t in range(max_steps_per_episode):    frames.append(env.render(mode='rgb_array'))    start = start.reshape(1, -1)    start, reward, done, _ = env.step(np.random.choice(num_actions, p=np.squeeze(action_probs)))    if done:        breakwith imageio.get_writer('未训练前的样子.gif', mode='I') as writer:    for frame in frames:        writer.append_data(frame)

模型训练

设置训练所需要的优化器,以及各种参数来记录每个时间步上的数据。

optimizer = keras.optimizers.Adam(learning_rate=0.01) # 创建 Adam 优化器实例,设置学习率为 0.01huber_loss = keras.losses.Huber() # 创建损失函数实例action_probs_history = [] # 创建一个列表,用于保存 action 网络在每个步骤中采取各个行动的概率critic_value_history = [] # 创建一个列表,用于保存 critic 网络在每个步骤中对应的值rewards_history = [] # 创建一个列表,用于保存每个步骤的奖励值running_reward = 0 # 初始化运行过程中的每轮奖励episode_count = 0 # 初始化 episode 计数器

一直训练下去,直到满足奖励大于 195 才会停下训练过程。

while True:      state = env.reset()  # 新一轮游戏开始,重置环境    episode_reward = 0  # 记录本轮游戏的总奖励值    with tf.GradientTape() as tape:  # 构建 GradientTape 用于计算梯度        for timestep in range(1, max_steps_per_episode): # 本轮游戏如果一切正常会进行 max_steps_per_episode 步            state = tf.convert_to_tensor(state)  # 将状态转换为张量            state = tf.expand_dims(state, 0)  # 扩展维度,以适应模型的输入形状            action_probs, critic_value = model(state)  # 前向传播,得到 action 网络输出的动作空间的概率分布,和 critic 网络预测的奖励值            critic_value_history.append(critic_value[0, 0])  # 将上面 critic 预测的奖励值记录在 critic_value_history 列表中            action = np.random.choice(num_actions, p=np.squeeze(action_probs))  # 依据概率分布抽样某个动作,当然了某个动作概率越大越容易被抽中,同时也保留了一定的随机性            action_probs_history.append(tf.math.log(action_probs[0, action]))  # 将使用该动作的对数概率值记录在 action_probs_history 列表中            state, reward, done, _ = env.step(action)  # 游戏环境使用选中的动作去执行,得到下一个游戏状态、奖励、是否终止和其他信息            rewards_history.append(reward)  # 将该时刻的奖励记录在 rewards_history 列表中            episode_reward += reward  # 累加本轮游戏的总奖励值            if done:  # 如果到达终止状态,则结束循环                break        running_reward = 0.05 * episode_reward + (1 - 0.05) * running_reward  # 计算平均奖励        returns = []  # 存储折扣回报        discounted_sum = 0        for r in rewards_history[::-1]:  # 从后往前遍历奖励的历史值            discounted_sum = r + gamma * discounted_sum  # 计算折扣回报            returns.insert(0, discounted_sum)  # 将折扣回报插入列表的开头,最后形成的还是从前往后的折扣奖励列表        returns = np.array(returns)  # 将折扣回报转换为数组        returns = (returns - np.mean(returns)) / (np.std(returns) + eps)  # 归一化折扣回报        returns = returns.tolist()  # 将折扣回报转换为列表形式        history = zip(action_probs_history, critic_value_history, returns)  # 将三个列表进行 zip 压缩        actor_losses = []  # 存储 action 网络的损失        critic_losses = []  # 存储 critic 网络的损失        for log_prob, value, ret in history:            diff = ret - value            actor_losses.append(-log_prob * diff)  # 计算 actor 的损失函数            critic_losses.append(                huber_loss(tf.expand_dims(value, 0), tf.expand_dims(ret, 0)) # 计算 critic 的损失函数            )        loss_value = sum(actor_losses) + sum(critic_losses) # 计算总损失函数        grads = tape.gradient(loss_value, model.trainable_variables) # 计算梯度        optimizer.apply_gradients(zip(grads, model.trainable_variables)) # 更新模型参数        action_probs_history.clear() # 清空之前的历史记录        critic_value_history.clear() # 清空之前的历史记录        rewards_history.clear() # 清空之前的历史记录    episode_count += 1 # 当一轮游戏结束时, episode 加一    if episode_count % 10 == 0: # 每训练 10 个 episode ,输出当前的平均奖励        template = "在第 {} 轮游戏中获得奖励: {:.2f} 分"        print(template.fORMat(episode_count, running_reward))    if running_reward > 195:  # 如果平均奖励超过195,视为任务已经解决        print("奖励超过 195 ,训练结束")        break

打印:

在第 10 轮游戏中获得奖励: 11.17 分
在第 20 轮游戏中获得奖励: 17.12 分
...
在第 170 轮游戏中获得奖励: 155.02 分
在第 180 轮游戏中获得奖励: 171.67 分
...
在第 220 轮游戏中获得奖励: 193.74 分
奖励超过 195 ,训练结束

训练后的样子

import imageiostart = env.reset() frames = []for t in range(max_steps_per_episode):    frames.append(env.render(mode='rgb_array'))    start = start.reshape(1, -1)    action_probs, _ = model(start)    action = np.random.choice(num_actions, p=np.squeeze(action_probs))    start, reward, done, _ = env.step(action)    if done:        breakwith imageio.get_writer('训练后的样子.gif', mode='I') as writer:    for frame in frames:        writer.append_data(frame)

到此,相信大家对“怎么使用actor-critic方法来控制CartPole-V0游戏”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么使用actor-critic方法来控制CartPole-V0游戏

本文链接: https://lsjlt.com/news/357155.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用actor-critic方法来控制CartPole-V0游戏
    本篇内容主要讲解“怎么使用actor-critic方法来控制CartPole-V0游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用actor-critic方法来控制CartPole-V...
    99+
    2023-07-06
  • 使用actor-critic方法来控制CartPole-V0游戏详解
    目录CartPole 介绍Actor Critic 介绍库准备设置超参数Actor Critic 结构搭建训练前的样子模型训练训练后的样子CartPole 介绍 在一个光滑的轨道上...
    99+
    2023-05-15
    actor-critic控制CartPole-V0 CartPole 游戏
  • 云服务器怎么用按键精灵控制游戏
    使用按键精灵控制游戏可以使用键盘上的按键来实现,以下是一些使用方法: 按下按键精灵“开始游戏”按钮:游戏开始前可以使用按键精灵来激活游戏,这样可以快速开始游戏,并减少等待时间。 按下“开始”按钮:如果你不想等待自动寻路,可以直接按下“开...
    99+
    2023-10-26
    按键精灵 服务器 游戏
  • 使用Java怎么制作一个24点游戏
    本篇文章给大家分享的是有关使用Java怎么制作一个24点游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、常见游戏规则从扑克中每次取出4张牌。使用加减乘除,第一个能得出24...
    99+
    2023-06-15
  • 使用python怎么制作一个俄罗斯方块小游戏
    这期内容当中小编将会给大家带来有关使用python怎么制作一个俄罗斯方块小游戏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyth...
    99+
    2023-06-14
  • 怎么使用CSS来控制div的样式
    这篇文章主要介绍“怎么使用CSS来控制div的样式”,在日常操作中,相信很多人在怎么使用CSS来控制div的样式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用CSS来控制div的样式”的疑惑有所帮助!...
    99+
    2023-07-06
  • 怎么用Pygame使你的游戏角色移动起来
    怎么用Pygame使你的游戏角色移动起来,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我们将使用 Pygame 来添加键盘控制,如此一来你就可以控制你的角色的移动。在 Pyga...
    99+
    2023-06-16
  • 使用python怎么制作一个猜数字游戏
    本篇文章给大家分享的是有关使用python怎么制作一个猜数字游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的...
    99+
    2023-06-14
  • 使用CocosCreator怎么制作一个微信小游戏
    使用CocosCreator怎么制作一个微信小游戏?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、在微信公众平台下载微信开发者工具 地址: http...
    99+
    2023-06-14
  • 怎么在python中使用tkinter制作一个2048游戏
    怎么在python中使用tkinter制作一个2048游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建main.py代码:from tkinter i...
    99+
    2023-06-14
  • 使用vbs怎么制作一个数字益智游戏
    今天就跟大家聊聊有关使用vbs怎么制作一个数字益智游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 选择操作: 游戏开始时会提示选择注册, 登录, 退出三种选项,注册: 注册成功会...
    99+
    2023-06-08
  • 使用C语言怎么制作一个扫雷游戏
    本篇文章给大家分享的是有关使用C语言怎么制作一个扫雷游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底...
    99+
    2023-06-14
  • 使用Java怎么制作一个坦克大战游戏
    这篇文章给大家介绍使用Java怎么制作一个坦克大战游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。package tankwar;import java.awt.Color;import ...
    99+
    2023-05-30
    java
  • 怎么使用scan方法实现控制台输入
    这篇文章主要介绍了怎么使用scan方法实现控制台输入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用scan方法实现控制台输入文章都会有所收获,下面我们一起来看看吧。基本语法scan方法的基本语法如下:f...
    99+
    2023-07-06
  • 阿里云服务器怎么用手机控制电脑登录游戏
    首先,打开阿里云的控制面板应用,进入控制面板界面。然后在界面上找到“阿里云游戏”选项,点击进入。在“阿里云游戏”页面中,可以看到很多游戏的列表,选择自己喜欢的游戏,点击“开始游戏”按钮即可开始游戏。 通过手机控制电脑登录游戏,可以为玩家带...
    99+
    2023-10-28
    阿里 用手 服务器
  • 使用C/C++怎么制作一个推箱子小游戏
    使用C/C++怎么制作一个推箱子小游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。运行示例:以下为完整代码:#include <stdio.h>#inc...
    99+
    2023-06-15
  • 云服务器怎么架设游戏加速器的使用方法
    随着互联网的发展,越来越多的人选择在云服务器上架设游戏服务器。在云服务器上架设游戏服务器可以帮助玩家获得更加流畅的游戏体验,而且在某些情况下,游戏加速器可以为游戏服务器提供额外的优质服务。 以下是如何架设游戏加速器的使用方法: 选择合适...
    99+
    2023-10-28
    加速器 使用方法 服务器
  • python怎么实现利用声音控制皮卡丘不断前进游戏
    这篇文章主要介绍“python怎么实现利用声音控制皮卡丘不断前进游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python怎么实现利用声音控制皮卡丘不断前进游戏”文章能帮助大家解决问题。开发工具...
    99+
    2023-06-27
  • 怎么使用Matlab制作一款真正的拼图小游戏
    这篇文章主要介绍怎么使用Matlab制作一款真正的拼图小游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果:简单原理介绍:1构造0,1矩阵作为每片拼图的透明度,可以构造出不规则形状的拼图(image函数有alph...
    99+
    2023-06-15
  • 阿里云服务器怎么用手机控制电脑登录游戏账号
    首先,我们需要在阿里云官网上进行注册,填写相关信息,包括个人信息、账号密码、绑定手机号码等。注册完成后,我们就可以登录阿里云服务器,进行游戏账号的设置、更新和管理了。 在阿里云服务器上,你可以通过控制面板来控制游戏账号。在控制面板中,你可...
    99+
    2023-10-28
    阿里 用手 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作