DQN算法可以用于解决离散的动作问题,而FlappyBird的操作正好是离散的。

FlappyBird的游戏状态一般可以通过图像加卷积神经网络(CNN)来进行强化学习。但是通过图像分析会比较麻烦,因为每次只输入一帧图像可能是不够的,因为一帧的图像分析不出小鸟的速度信息,所以通常需要几帧图像一起送入CNN分析。这样的方法麻烦又复杂,仔细观察一下游戏。

FlappyBird游戏

发现有三个信息对于小鸟能够顺利飞过水管比较重要:

  1. 小鸟的水平速度。
  2. 小鸟与它前面一对水管中下面那根水管的水平距离。
  3. 小鸟与它前面一对水管中下面那根水管的顶端的垂直距离。

而其他的信息,比如:已经飞过了的水管等信息就不重要了。

好了,思路已经有了,开始准备环境。

一、安装FlappyBird

ntasfi/PyGame-Learning-Environment​github.com

提供了一个FlappyBird游戏的实现,按照着文档中Installation部分的提示安装就可以了。安装完了后还不能直接使用,原因如下:

  1. 需要根据游戏的状态提取上面提到的那三个重要的状态信息。
  2. 封装成和gym环境类似的接口,使用起来也方便一下。

封装好后的核心代码及注释如下:

def _get_obs(self):# 获取游戏的状态state = self.game.getGameState()# 小鸟与它前面一对水管中下面那根水管的水平距离dist_to_pipe_horz = state["next_pipe_dist_to_player"]# 小鸟与它前面一对水管中下面那根水管的顶端的垂直距离dist_to_pipe_bottom = state["player_y"] - state["next_pipe_top_y"]# 获取小鸟的水平速度velocity = state['player_vel']# 将这些信息封装成一个数据返回return np.array([dist_to_pipe_horz, dist_to_pipe_bottom, velocity])

完整FlappyBird状态获取封装的代码在:

flappybird_wrapper.py​github.com

二、实现DQN算法

因为最终实现的代码比较长,这里只贴算法实现中最核心的learn代码及注释:

def learn(self, writer):# 根据经验进行学习# 确保经验池里的经验以及足够多时,才进行学习assert WARMUP_SIZE >= BATCH_SIZEif len(self.memory) < WARMUP_SIZE:return# 从经验池中选取BATCH_SIZE条经验出来batch = random.sample(self.memory, BATCH_SIZE)batch = Transition(*(zip(*batch)))# 把这些经验都转换位Tensors0 = torch.FloatTensor(batch.state).to(device)a0 = torch.LongTensor(batch.action).to(device).unsqueeze(1)r1 = torch.FloatTensor(batch.reward).to(device)s1 = torch.FloatTensor(batch.next_state).to(device)d1 = torch.LongTensor(batch.done).to(device)# DQN算法q_pred = self.model(s0).gather(1, a0).squeeze()with torch.no_grad():if USE_DBQN:acts = self.model(s1).max(1)[1].unsqueeze(1)q_target = self.target_model(s1).gather(1, acts).squeeze(1)else:q_target = self.target_model(s1).max(1)[0]q_target = r1 + GAMMA * (1 - d1) * q_targetloss = self.loss_func(q_pred, q_target)self.optimizer.zero_grad()loss.backward()self.optimizer.step()# 记录每次学习的losswriter.add_scalar('train/value_loss', loss.item(), self.update_count)self.update_count += 1# 每MODEL_SYNC_COUNT同步一下目标模型if self.update_count % MODEL_SYNC_COUNT == 0:self.target_model.load_state_dict(self.model.state_dict())

在这段代码中,可以通过设置变量USE_DBQN为true和false来控制是否使用DQN的变种算法Double-Q Learning来训练模型。同时,代码还借助tensorboard来记录在训练过程中:完成步骤数(finish_step)、每局获得奖励的总数(total_reward)以及每次学习时loss的值(value_loss)来观察训练的过程。

DQN训练FlappyBird的过程

从tensorboard的截图中可以看出,随着训练的进行,每局游戏结束时的步骤数finish_step)越来越多,表明算法在正确的进行训练和提高。

最后,所有的代码都可以在github中查看(包括tensorboard的记录数据):

dqn_flappybird​github.com

dqn在训练过程中loss越来越大_用DQN算法玩FlappyBird相关推荐

  1. dqn在训练过程中loss越来越大_强化学习笔记:OpenAI Gym+DQN+Tensorflow2实现

    参考了一些文章,针对OpenAI gym环境,使用tf2.x实现了DQN算法:加上了一些没有太大必要(?)的小功能,比如:自动保存视频,保存训练日志从而利用TensorBoard实现数据可视化,保存和 ...

  2. dqn在训练过程中loss越来越大_深度强化学习——从DQN到DDPG

    想了解更多好玩的人工智能应用,请关注公众号"机器AI学习 数据AI挖掘","智能应用"菜单中包括:颜值检测.植物花卉识别.文字识别.人脸美妆等有趣的智能应用.. ...

  3. dqn在训练过程中loss越来越大_[动手学强化学习] 2.DQN解决CartPole-v0问题

    强化学习如何入门: 强化学习怎么入门好?​www.zhihu.com 最近在整理之前写的强化学习代码,发现pytorch的代码还是老版本的. 而pytorch今年更新了一个大版本,更到0.4了,很多老 ...

  4. dqn在训练过程中loss越来越大_DQN算法实现注意事项及排错方法

    在学习强化学习过程中,自己实现DQN算法时,遇到了比较多的问题,花了好几天的时间才得以解决.最后分析总结一下,避免再走弯路. 有可能开始实现出来的DQN算法,无论怎么训练总是看不错成果.需要注意的地方 ...

  5. pytorch训练 loss=inf或者训练过程中loss=Nan

    造成 loss=inf的原因之一:data underflow 最近在测试Giou的测试效果,在mobilenetssd上面测试Giou loss相对smoothl1的效果: 改完后训练出现loss= ...

  6. pytorch训练过程中loss出现NaN的原因及可采取的方法

    在pytorch训练过程中出现loss=nan的情况 1.学习率太高. 2.loss函数 3.对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决 4.数据本身,是否存在Nan,可以用n ...

  7. matlab损失函数出现nan,[译]在训练过程中loss出现NaN的原因以及可以采取的方法。...

    1.梯度爆炸 原因:在学习过程中,梯度变得非常大,使得学习的过程偏离了正常的轨迹. 症状:观察输出日志(runtime log)中每次迭代的loss值,你会发现loss随着迭代有明显的增长,最后因为l ...

  8. 有关神经网络模型训练过程中loss值始终变化不大的问题

    最近在训练一个神经网络模型,遇到了loss值始终不变的问题. 简要说一下,我训练的是一个分类器,是一个最后分类数为6的多元分类问题,但模型在训练多个轮次后准确度仍然在16.67%左右,loss值基本没 ...

  9. 神经网络训练过程中出现loss为nan,神经元坏死

    最近在手撸Tensorflow2版本的Faster RCNN模型,稍后会进行整理.但在准备好了模型和训练数据之后的训练环节中出现了大岔子,即训练过程中loss变为nan.nan表示not a numb ...

最新文章

  1. ABP-JavaScript API
  2. 【问题帖】压缩图片大小至指定Kb以下
  3. apache rewrite 二级域名
  4. verycd重整——CBT系列
  5. C Shuffle Cards
  6. 廊坊职业技术学院计算机专业宿舍,2020廊坊职业技术学院宿舍条件如何-有空调否?(宿舍图片)...
  7. Base64原理及魔改更换码表
  8. 分贝测试软件哪个好 家庭影院,家庭影院隔音怎么做效果最好 这7个解决方案你一定要知道...
  9. ICLR 2020|PairNorm: Tackling Oversmoothing in GNNs
  10. 量化思维与常见的量化标
  11. 中小企业国际市场营销策略研究
  12. 哔哩哔哩 2019校园招聘 开发工程师-2018.09.21
  13. linux 打印网卡与IP对应列表
  14. Veristand制作Custom Device全网最详细教程
  15. 如何在ubuntu终端输入密码显示星号
  16. Wmyskxz文章目录导航附Java精品学习资料
  17. (83)Part21-阿里云VOD-03-视频播放测试
  18. 微信小程序 首行缩进、 去掉/取消首行缩进
  19. 在农业银行做开发是什么样的体验?
  20. AutoCAD 2010建筑设计标准教程书籍教程

热门文章

  1. 详解:Drools规则引擎探究
  2. 5000 字的 Spring MVC 全面大总结
  3. 值类型 与引用的 copy
  4. java中this关键词
  5. Python游戏开发pygame模块,Python实现球球碰撞小游戏
  6. android 壁纸 裁剪,Android图片裁剪之自由裁剪
  7. 嵌入式 linux 进程锁,嵌入式  Linux线程锁详解pthread_mutexattr_t
  8. cloning java_深入浅出Java中的clone克隆方法,写得太棒了!
  9. gh ost mysql_MySQL在线DDL gh-ost 使用说明
  10. python字符串连接方式_Python 字符串连接方式有这么种,你知道吗?