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