Python人工智能在貪吃蛇游戲中的運(yùn)用與探索(中)
上篇我們說到用「DQN」來實現(xiàn)貪吃蛇訓(xùn)練,也就是用**Q(s,a)**和搭建神經(jīng)網(wǎng)絡(luò)來實現(xiàn)。
傳送門:干貨 | Python人工智能在貪吃蛇游戲中的應(yīng)用探索(上)
那么我們?nèi)绾魏侠淼奶幚頂?shù)據(jù)?
我們知道Q(s,a)中的state表示蛇的狀態(tài)。這個狀態(tài)包括蘋果的位置,蛇的位置,邊界的位置,蛇和邊界的距離等等等等。如何表示這么多的內(nèi)容,并準(zhǔn)確的傳入神經(jīng)網(wǎng)絡(luò)進(jìn)行計算呢?
我們使用了一個很重要的數(shù)據(jù)結(jié)構(gòu)-----「張量」。
這一次,我們的主題是:「張量(Tensor)是什么,是怎么流動的(Flow)?」
「什么叫張量(tensor)」
首先聲明這里我們指的張量(tensor )是「Tensorflow」里最基本的數(shù)據(jù)結(jié)構(gòu).它是tensorflow最重要的概念,顧名思義,flow是流動的意思,tensorflow就是tensor的流動。「它和物理學(xué)中的tensor不是同一」個概念。
那張量到底是什么東西呢?簡單點(diǎn)說,張量就是多維數(shù)組的泛概念。通常一維數(shù)組我們稱之為向量,二維數(shù)組我們稱之為矩陣,這些都是張量的一種。我們也會有三維張量、四維張量以及五維張量等等。零維張量就是一個具體的數(shù)字。

張量的基本概念
下圖是全國某些城市的疫情圖,它是一個三維的張量。

從上面圖中,可以分析出張量的基本概念:
「維度」 ?也就是數(shù)據(jù)軸的個數(shù)。如前圖數(shù)據(jù)有3個軸,分別指城市,分類,時間。借用生命科學(xué)中的知識,界門綱目科屬種即可以表示生物分類的七個維度。
「形狀」 ?表示張量沿每個軸的大?。ㄔ貍€數(shù)),也就是shape。前面圖矩陣示例的形狀為(3, 5),3D 張量示例的形狀為(3, 5, 3)。
「數(shù)據(jù)類型」 ?這是張量中所包含數(shù)據(jù)的類型,例如,張量的類型可以是float32、int32、float64 等。很少情況下,會遇到字符(char)張量
下圖是張量的立體圖形

張量是可以根據(jù)實際情況增長或者縮小。比如我可以方便的增加一個統(tǒng)計的城市,可以增加統(tǒng)計的分類,可以增加統(tǒng)計的時間。隨著疫情的發(fā)展,我們增加一個維度統(tǒng)計各個國家的疫情狀況。

到這里,也許會有人將n維張量看作樹狀圖,每個維度的元素都會有下面的分支,又有更下面的分支。硬要說,是一種特殊的樹狀圖。由于shape的特性,n維的元素所包含的n-1維元素數(shù)量是相等的。例如shape為(2,2,3)的張量,二維有兩個元素,那么他們一維具有的元素數(shù)是相等的。這與樹狀圖每個分支可以無規(guī)則拓展是不同的。
張量或許存在一定的缺陷,但仍然是處理數(shù)據(jù)的最佳載體之一,尤其是在游戲制作中,多變量存在張量中可以更容易運(yùn)用庫函數(shù)進(jìn)行各種操作。
「張量的表現(xiàn)形式」
在數(shù)學(xué)里面也有n維向量的說法,其實他們都是一維張量,數(shù)學(xué)中的N維向量指的是分量的個數(shù),比如[1,2]這個向量的維數(shù)為2,它有1和2這兩個分量;[1,2,3,······,1000]這個向量的維數(shù)為1000。在張量的概念中,他們都是一維張量。
那么,張量的維數(shù)和形狀怎么看呢?
張量的shape本身是一個「元組」,元組元素的「個數(shù)」就代表了維度數(shù),而從tuple[0]開始,表示每一維度(「從高維到低維」)的元素數(shù)量。比如(2,3)就表示為一維有3個元素,二維兩個元素的二維張量。
「tensorflow中使用張量的優(yōu)勢」
用tensorflow 搭建的神經(jīng)網(wǎng)絡(luò),輸入層和輸出層的值都是張量的形式。由于張量模型可以處理指標(biāo)集(元素項)為多維的數(shù)據(jù),所以在描述實際問題時,相比矩陣模型其更能接近于實際問題的屬性,因此能更好地描述實際問題,** 從而保證神經(jīng)網(wǎng)絡(luò)算法是有效的
同時tensorflow庫具有降維的作用,例如在DQN中,輸入的是多維的描述環(huán)境的張量,內(nèi)含許多復(fù)雜的小數(shù),經(jīng)處理輸出的就是代表了上下左右四個可選擇的動作的數(shù)字。
「張量通過numpy 實現(xiàn)數(shù)據(jù)的流動」
NumPy是Python中科學(xué)計算的基礎(chǔ)包。它是一個提供多維數(shù)組對象,各種派生對象(如掩碼數(shù)組和矩陣),以及用于數(shù)組快速操作的各種例程,包括數(shù)學(xué),邏輯,形狀操作,排序,選擇,I / O離散傅立葉變換,基本線性代數(shù),基本統(tǒng)計運(yùn)算,隨機(jī)模擬等等。
tensor最大的問題是不能游刃有余的進(jìn)行數(shù)據(jù)的計算,比如:要對tensor進(jìn)行操作,需要先啟動一個Session, 否則,我們就無法對一個tensor進(jìn)行簡單的賦值或者判斷的操作,這種限制對于程序來說是致命的。而數(shù)據(jù)在流動過程中需要大量的復(fù)雜的運(yùn)算。所以,借助于numpy強(qiáng)大的計算能力,tensor與numpy方便的數(shù)據(jù)轉(zhuǎn)換,它們完美的實現(xiàn)神經(jīng)網(wǎng)絡(luò)復(fù)雜的計算工作。
一般的操作過程是:tensorflow定義所有的計算過程,即計算流圖,并建立神經(jīng)網(wǎng)絡(luò),創(chuàng)建輸入tensor,這時候,表示一個定義計算過程,并不真正進(jìn)行計算;然后進(jìn)入下一步,tensor通過顯性或者隱性自動轉(zhuǎn)換成numpy執(zhí)行運(yùn)算,這時候就是發(fā)揮numpy的計算能力的時候了。
「貪吃蛇程序中張量的使用」
上篇所談到的搭建神經(jīng)網(wǎng)絡(luò)就是張量的運(yùn)用之一。下面,我來簡單介紹一些其他運(yùn)用。
- 「創(chuàng)建與調(diào)用初始化張量」

self.STATE = self.SNAKE.look(self.FOOD_X, self.FOOD_Y, boundaries))
將食物的位置坐標(biāo)轉(zhuǎn)化為numpy型儲存
使用了np.hstack將各元素進(jìn)行了水平堆疊,這些元素主要受蛇頭方向和果實刷新位置影響,即果實在蛇頭方向的上下左右、左上等等。
- 「經(jīng)驗的取出(memory)」
states, actions, rewards, next_states, dones = zip(*experiences)
\# 將信息轉(zhuǎn)化成numpy格式
states = np.array(states).reshape(self.BATCH_SIZE, state_shape)
actions = np.array(actions, dtype='int').reshape(self.BATCH_SIZE)
rewards = np.array(rewards).reshape(self.BATCH_SIZE)
next_states = np.array(next_states).reshape(self.BATCH_SIZE, state_shape)
dones = np.array(dones).reshape(self.BATCH_SIZE)
return states, actions, rewards, next_states,
dones
我們先用zip*將張量拆開(此處的變量即為貪吃蛇原理的核心),再轉(zhuǎn)化成numpy形式取出,方便后續(xù)用numpy進(jìn)行數(shù)據(jù)處理。
- 「降維計算」

從上面圖中可以看到,存儲的數(shù)據(jù)往往有18項,最終我們通過tensorflow和numpy數(shù)據(jù)處理,將18個float8數(shù)據(jù)化成了action,即用0,1,2,3來表示方向。由上圖,由于訓(xùn)練批次為64,所以action中有64個數(shù),即為當(dāng)時計算出的蛇的64次最佳行動。
下一篇中,我們將從貪吃蛇代碼入手,分析并解釋貪吃蛇代碼的形成。
參考文獻(xiàn):
百度百科
百度圖片
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ??
推薦閱讀:
干貨 | 想學(xué)習(xí)優(yōu)化算法,不知從何學(xué)起?
干貨 | 運(yùn)籌學(xué)從何學(xué)起?如何快速入門運(yùn)籌學(xué)算法?
干貨 | 學(xué)習(xí)算法,你需要掌握這些編程基礎(chǔ)(包含JAVA和C++)
干貨 | 算法學(xué)習(xí)必備訣竅:算法可視化解密
干貨 | 模擬退火、禁忌搜索、迭代局部搜索求解TSP問題Python代碼分享記得點(diǎn)個在看支持下哦~

