我用TensorFlow2.0训练了一只AI来玩贪吃蛇

最近迷上了复古游戏,想起小时候入迷的玩贪吃蛇,真的是乐趣无穷。如今到了2019年了,一切彷佛都变得和之前不一样,好比,咱们能够用AI下围棋,用AI作自动驾驶,有没有可能让一个AI本身学会玩贪吃蛇呢?答案固然是能够!!html

先来看看咱们的效果:python

思路

让AI学会贪吃蛇,那么首先咱们须要定义这个游戏环境。有人会说用pygame,或者gtk来作一个界面,其实都显得过于复杂,尚未等到我把AI造出来,但就游戏界面估计就得浪费大把时间。咱们直接用OpenCV便可解决这个问题! 大概的代码以下:算法

如何让AI学习

那么怎么让AI知道贪吃蛇的游戏规则呢?也就事说,让AI知道:网络

  • 你不能吃掉你本身;
  • 你不能碰到墙;
  • 你迟到了红色食物才算是拿到了奖励。

通过个人尝试,我发现,若是采用传统的动态规划的方式去作,既首先从图片着手,来学习预测下一步贪吃蛇的方向,其实很难让Agent学到任何东西,相反,咱们的策略是:架构

  1. 首先咱们让AI先在一个小的环境下学习;
  2. 而后逐渐把盘子扩大;
  3. 最后在一个固定大小的棋盘上看看最终效果。

这个思想有点像ProgressiveGAN,也就是按部就班的让Agent学习,先从小环境着手,小环境学习好了,再加大难度。事实上,实验验证了咱们的想法,这个方向无疑是有效果的。学习

从图能够看出,这是其中的一个环节,能够看到咱们的贪吃蛇最大长度能够达到9,其实已经很不错了,旁边的数字显示它已经本身咬死了本身1841次,但是依旧坚强的活着。。优化

对于整个模型算法的流程,也很是清晰,简单来讲步骤以下:人工智能

  • 首先咱们定义一个轮回总数,世事无常有轮回,你最多死50000次,每次给你8条命,该怎么学,贪吃蛇你看着办;
  • 在每一个轮回中,咱们把每一次尝试的走位记录下来,放到咱们的Memery中,这样咱们的贪吃蛇才能像蔡徐坤同样风骚的走位;
  • 最后每次轮回死掉了以后,就拿这些记忆去训练咱们的Qnetwork;
  • Qnetwork就这样变得愈来愈强,由于它记忆了全部的成功尝试和失败的尝试,下一次指导也就越给力,最后每次轮回的时间也就更长,不至于说是落地成佛。。

QNetwork构建

对于这类问题,其实就是一个根据环境进行决策的过程,能够借助强化学习的手段来学习,但做为下一个动做空间的预测模型,仍是须要咱们构建DNN去拟合,从数据中学习到预测下一步动做的规律,这也是核心。 咱们的QNetwork构建采用的是TensorFlow 2.0, 而且采用Keras NN API进行构建。能够说很是的结合潮流。核心的QNetwork构建代码以下:spa

class QNetwork:

    def __init__(self,input_shape, hidden_units, output_size, learning_rate=0.01):
        self.input_shape = input_shape
        hidden_units_1, hidden_units_2, hidden_units_3 = hidden_units
        self.model = tf.keras.Sequential([
            tf.keras.layers.Dense(units=hidden_units_1, input_dim=input_shape, activation=tf.nn.relu),
            tf.keras.layers.Dense(units=hidden_units_2, activation=tf.nn.relu),
            tf.keras.layers.Dense(units=hidden_units_3, activation=tf.nn.relu),
            tf.keras.layers.Dense(units=output_size, activation=tf.keras.activations.linear)
        ])

        self.model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate), loss='mse',metrics=['accuracy'])
        
    def predict(self, state, batch_size=1):
        return self.model.predict(state, batch_size)
    
    def train(self, states, action_values, batch_size):
        self.model.fit(states, action_values, batch_size=batch_size, verbose=0, epochs=1)
复制代码

对与这个模型,其实能够采用更深刻的架构,咱们也会在后续不断地深刻探索不一样模型的优化效果,让咱们的贪吃蛇AI更加的智能。3d

强化学习训练

咱们能够看一下整个训练过程的log:

能够看到,大概5000个Episode以后,得分能够逐渐的增高,说明网络在指导贪吃蛇下一步运动的时候更加的驾轻就熟。从训练的实际gif图也能够看到,如今咱们贪吃蛇的最大长度能够达到13,试想一下,随着棋盘的增大,模型的变强,是否是贪吃蛇会变得很是很是的长,以致于超越人类的玩贪吃蛇极限呢??咱们拭目以待!!

训练尚未彻底,可是你能够看到,这个走位仍是很风骚的有木有!!

Show Time

最后,到了咱们的人工智能表演时间!!!让咱们把舞台交给贪吃蛇AI!!!!贪吃蛇,上!

这个走位仍是很是的风骚的!通过一个晚上的训练,多达30000屡次的轮回,咱们的贪吃蛇终于能够在长度28的范围以内保证本身屹立不倒,我想这应该比多部分手残少年要强。。好比我。。

总结一下咱们的强化学习存在的问题和没法解决的死角点:

  • 虽然强化学习模型能够处理99%的状况,可是不论是设么场景都会存在那么1%历来没有见过的状况,大几率此时AI不知道该如何决策,极有可能瞎几把一顿乱走,咱们的贪吃蛇倒也还好,可是若是用到了自动驾驶决策里面,那么解决就是直接见马克思了;
  • 虽然咱们的能够将模型无线的复杂化,通过两个周的实验,咱们发现并不是模型越复杂,AI越强;
  • 更使人琢磨不透的是,并不是Episode越久,AI越强,在这期间咱们发现,它有一个巅峰时刻,最高平均得分为188分,这至关因而它最高的长度能够达到40步,感兴趣的朋友来魔改一下咱们的贪吃蛇,看看你能训练的贪吃蛇Ai能够强大到什么地步,是否能稳如阿法狗;
  • 贪吃蛇没法预测边界,也就是说若是咱们的模型在一个比他训练的环境更大的棋盘上运做,它大几率没法准确预测边界,这也是咱们让他从小棋盘开始训练逐渐扩大棋盘大小的缘由,可是即使如此,它没法在任意大小的棋盘下准确的找到食物,而且避开边界。

Code

最后,本教程的全部代码主要包含4个东西:

  • 游戏环境,这个游戏环境不来自于openai,咱们用opencv搭建的;
  • TensorFlow2.0的模型构建和训练代码;
  • 强化学习训练代码;
  • 启动AI玩贪吃蛇的代码。

全部代码均可以在MANA AI 平台,一个专一分享高质量有专业团队维护的AI代码平台:

manaai.cn/aicodes_det…

相关文章
相关标签/搜索