最近有项目需要用到RL相关的一些东西,于是就开始尝试自己搭建一个自定义的gym环境,并使用入门的DQN网络对这个环境进行训练,这个是我入门的第一个项目,可能有一些地方理解的不够的或者有问题的,希望见谅并能指正。
其中环境的自定义部分参考了csdn extremebingo的文章,模型建立与训练过程参考了: pytorch official tutorials,训练结果的展示参考了:tensorflow org tutorials
寻找宝石游戏
绿色的小圆圈代表机器人,红色圈圈表示火坑,蓝色圆圈表示宝石,褐色圈圈表示石柱,其中环境每次重置机器人便会出生在任意一个空白的格子中,机器人需要找到含有宝石的格子获得奖励结束游戏。在寻找的过程中如果踩入火坑游戏结束获得负奖励,机器人无法移动到石柱所在的格子中。
自定义gym环境
自定义gym环境模块主要参考了csdn extremebingo的文章,可以直接点击查看自定义的具体流程介绍,也可以参考github Readme 的gym Env set up模块介绍中的操作流程。这里就不再赘述,下面主要介绍下使用这个流程中可能有的坑:
-
将自定义的文件拷贝到环境中可能不生效,可以尝试在这个路径同样进行一遍操作:
C:\Users\xxx\AppData\Roaming\Python\Python37\site-packages\gym\envs -
extremebingo 构建的环境中有部分代码存在一些笔误还有一些bug,这里进行了一些修改,修改后的环境代码
模型构建与训练
数据收集
训练数据主要有:(state, action, next_state, reward)
- state 当前环境的状态
- action 当前状态时,机器人执行的动作
- next_state 执行该动作后的状态
- reward 执行该动作后获得的激励
(这里用环境render的图表示state 见get_screen,actions = ['n', 'e', 's', 'w'] 含意为:n 上 s下 w左 e 右 reward 找到宝石+1,踩到火坑-1,增加步数在训练的过程中进行适度的惩罚)
数据收集过程中的action 根据当前训练的状态按照概率选择使用模型结果或者随机选择动作执行下一步操作
这个概率值由EPS_END EPS_STAR EPS_DECAY 还有steps_done 共同控制 结果按照指数进行衰减
这里我使用的值为:
EPS_START = 0.9
EPS_END = 0.05
EPS_DECAY = 20000
选择随机策略的概率随着训练次数steps_done 的变化如下图所示:

这里eps_decay 改为了20000而不是torch offical tutorials里的200,主要是因为这个环境比小车的稍微复杂,因此前期需要更多的随机策略的样本训练,offical turorials 里概率的变化曲线如下:

,当我们在test模型时,主要应选取模型的输出作为下一个action 因此 我在代码中增加了eval时eps_threshold=0.001:
def select_action(state, eval=False):
global steps_done
sample = random.random()
eps_threshold = EPS_END + (EPS_START - EPS_END) * \
math.exp(-1. * steps_done / EPS_DECAY)
if eval:
eps_threshold = 0.001
print("eps_threshold:{} ,steps_done:{}".format(eps_threshold, steps_done))
steps_done += 1
if sample > eps_threshold:
print("select Model")
with torch.no_grad():
# t.max(1) will return largest column value of each row.
# second column on max result is index of where max element was
# found, so we pick action with the larger expected reward.
if eval


最低0.47元/天 解锁文章
5389

被折叠的 条评论
为什么被折叠?



