我用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…

相關文章
相關標籤/搜索