用一盤殘局帶你了解人工神經(jīng)網(wǎng)絡(luò)算法
本文轉(zhuǎn)載自微信公眾號「志斌的python筆記」,作者安可 。轉(zhuǎn)載本文請聯(lián)系志斌的python筆記公眾號。
大家好,我是志斌~
志斌現(xiàn)在手頭上有一個國際象棋的殘局,它是黑方只剩下一個王,白方剩一個兵和一個王?,F(xiàn)在志斌已知它有兩種可能的結(jié)局,即白方將死黑方獲勝,或者和棋。
那么結(jié)局到底是什么呢?接下來讓我們用深度學(xué)習(xí)的人工神經(jīng)網(wǎng)絡(luò)算法,來給大家一個答案~
一.規(guī)則介紹
在進(jìn)行程序編譯之前,我們需要先簡單的了解一下國際象棋的下棋規(guī)則,規(guī)則如下:
棋盤大小為8*8,各有黑色和白色棋子16個,分別是王:1個,后:1個,車:2個,象:2個,馬:2個,兵:8個。
兵:只能向前直走(不能后退,這點(diǎn)和中國象棋類似),每次行棋只能走一格。但是,國際象棋的兵走第一步時,可以走一格或走兩格。兵的吃子方法與行棋方向不一樣,它是直走斜吃,即如果兵的前斜進(jìn)一格內(nèi)有對方棋子,就可以吃掉它,從而占據(jù)該格位置。
王:則是橫、直、斜都可以走,但每次限走一步。不過,和中國象棋相比,王是不可以送吃的,即任何被敵方控制的格子,己方王都不能走進(jìn)去。否則,算“送王”犯規(guī)。累計三次犯規(guī)就要判負(fù)。
勝負(fù):當(dāng)吃掉對方的最高統(tǒng)帥 王 時則勝,當(dāng)逼對方不能走棋了,則算和。
二.解決方法
1讀取訓(xùn)練集
對krkopt.data訓(xùn)練集進(jìn)行讀取,代碼如下:
- with open('krkopt.data','r') as f:
- lines = f.readlines()
- data = np.zeros((28056,6),dtype=float)
- label = np.zeros((28056,2),dtype=float)
讀取結(jié)果展示:
上面每一行數(shù)據(jù)都是一個訓(xùn)練樣本,我們以第一行的數(shù)據(jù)為例來進(jìn)行分析,如下圖:
a1,b3,c2給出了三個棋子的坐標(biāo),黑方的王在如圖a1的位置,白方的王在如圖b3的位置,白方的兵在如圖c2 的位置。這時黑方的王處于無路可走的狀態(tài),是和棋,因此,最后draw意為和棋。假設(shè)數(shù)據(jù)中最后標(biāo)簽為six,意為白方最多走6步可將死黑方。
2開始訓(xùn)練
首先安裝訓(xùn)練所需要調(diào)用的Python庫,
- pip install numpy
- pip install sklearn
- pip install matplotlib
然后將整個數(shù)據(jù)集分為三份,代碼如下:
- ratioTraining = 0.4 #訓(xùn)練數(shù)據(jù)集40%:利用訓(xùn)練數(shù)據(jù)集調(diào)整神經(jīng)網(wǎng)路的參數(shù)
- ratioValidation = 0.1 #驗證數(shù)據(jù)集10%:用于驗證調(diào)整是好是壞,從而決定程序是否退出
- ratioTesting = 0.5 #測試數(shù)據(jù)集50%:訓(xùn)練結(jié)束后,用于總體測出神經(jīng)網(wǎng)絡(luò)的訓(xùn)練效果
接下來使用Scikit-learn中的Scaler類,采用減掉均值除以方差的方法對標(biāo)準(zhǔn)進(jìn)行歸一化,代碼如下:
- scaler.transform(xTraining)
- scaler.transform(xTexting)
- scaler.transform(xValidation)
創(chuàng)建神經(jīng)網(wǎng)絡(luò),代碼如下:
其中:layer=[6, 20, 20, 20, 2]輸入是6個維度,輸出是2個維度,共3層神經(jīng)網(wǎng)絡(luò),每層20個神經(jīng)元
- active_function='relu'神經(jīng)網(wǎng)絡(luò)的激活函數(shù)
- learning_rate=0.01學(xué)習(xí)率α
- batch_normalization=1歸一化操作
- objective_function='Cross Entropy'目標(biāo)函數(shù)
訓(xùn)練開始后,我們發(fā)現(xiàn)COST損失函數(shù)是在持續(xù)下降,同時識別率Accuracy,在慢慢上升,無限接近于1。
代碼如下:
經(jīng)過上面的分析,我們發(fā)現(xiàn)白棋勝的幾率很高,幾乎接近1了。
三.小結(jié)
1. 本文利用一局國際象棋殘局勝負(fù)為例,帶大家實操人工神經(jīng)網(wǎng)絡(luò)算法,希望大家回去多多練習(xí)。
2. 本文僅供學(xué)習(xí)參考,不做它用。
專欄作者:安可,一名在讀研究生,研究領(lǐng)域為強(qiáng)化學(xué)習(xí),多智能體協(xié)同。喜歡鉆研,熱愛學(xué)習(xí),樂于分享,最重要的還是一位漂亮小姐姐哦~