本文主要介绍通过CNN+DQN模型来实现玩AI玩FlappyBird。
介绍
今天主要介绍如何通过强化学习来让程序玩FlappyBird。
最终的效果如下:

上面的效果实在进行了2000000次迭代训练之后得到的结果。几乎已经可以碾压人类玩家了。
算法
整体的算法是CNN+DQN,并通过奖励值对网络进行训练。模型的整体结构如下图。

具体CNN和DQN算法的原理可以参考之前写过的文章,这里重点介绍模型的代码实现。
实现
游戏环境的实现就不具体解释了,没什么太难得地方,了解Pygame模块之后,程序没有太难的地方。
重点来看一下神经网络的搭建以及训练的过程。
代码用到的主要模块及版本:
Python:3.5.3
TensorFlow:1.0.1
cv2:3.3.0
pygame:1.9.3
首先是一些超参数的设置:
|
|
然后是神将网络的搭建:
|
|
神经网络一共3个卷基层和2个全连接层。
最终代码里的实现结构和上面图中的结构有一些差别,输入图片大小为80x80x4
。第一个卷基层得到图片的尺寸为20x20x32
,然后加一个maxpooling
层,得到10x10x32
的图片。第二个卷基层得到的图片尺寸为10x10x64
。第三个卷基层得到图片的尺寸为5x5x64
。然后将得到的数据产开,得到1600x1
的数据,然后经过第一个全连接层得到512x1
的数据,然后经过第二个全连接层最终得到对应的动作值。
然后计算损失函数和优化规则:
|
|
然后根据动作得到当前的图片,并对图片进行裁剪:
|
|
代码中cv2.resize()将图片尺寸转化成80x80,cv2.cvtColor()对图像进行灰度化,cv2.threshold()将图像二值化。
然后导入保存好的网络参数:
|
|
然后根据当前的状态图片得到对应的动作,并通过概率判断是否选择最优动作或进行探索。
|
|
将动作值输入游戏环境总得到奖励值,和下一步的状态值图片,并对下一步的状态图片进行裁剪。并保存当前状态,动作值,奖励值和下一步状态。如果存储空间的大小大于存储的大小,则删除之前的数据。
|
|
从存储的数据中采样mimibatch大小的数据对网络进行训练,
|
|
以上就是主要的代码片段。运行程序,导入现有的网络参数就可以看到上面的游戏效果。
参考资料: