policy_player.py y = self.model(x) y ist der Wert der Ausgabeschicht, bevor die Aktivierungsfunktion durchlaufen wird.
logits = y.data[0] Weisen Sie den Wert der Ausgabeebene zu, bevor Sie die Aktivierungsfunktion einer Variablen namens logs übergeben. Das Wort logit bedeutet den Wert der Ausgabeebene, bevor die Aktivierungsfunktion durchlaufen wird.
Bedeutung von [0] Ein Beispiel für y.data [[-4.137782 0.12063725 -4.907426 ... -5.663455 -6.104148 -7.8398824 ]] y.data[0] [-4.137782 0.12063725 -4.907426 ... -5.663455 -6.104148 -7.8398824 ]
Beim Generieren von x werden Features in [] eingeschlossen und dann in np.array umgewandelt. x = Variable(cuda.to_gpu(np.array([features], dtype=np.float32))) Also ist y.data in Form von [[]]? Was ist die Bedeutung von []?
Die Anzahl der Elemente in y.data [0] beträgt (20 + 7) * 9 * 9 = 2187 20 ist die Bewegungsrichtung (UP, DOWN, ...), 7 ist die Art des Stücks, das Sie haben. Die Anzahl der Züge einschließlich aller legalen und illegalen Züge.
In dem in Kapitel 10 angezeigten Wertnetzwerk wird x generiert, ohne es in [] einzuschließen. x = Variable(cuda.to_gpu(np.array(features, dtype=np.float32))) In Kapitel 10 wird es zuerst nach legaler Hand gefiltert, und es ist etwas anders. Es ist verwirrend, wenn man es einfach vergleicht.
probabilities = F.softmax(y).data[0] Die Wahrscheinlichkeiten sind [1.3974859e-04 9.8799672e-03 6.4728469e-05 ... 3.0391777e-05 1.9559853e-05 3.4478303e-06]
Lassen Sie es sowohl auf iMac als auch auf Colab laufen.
#Umgebungseinstellung
#-----------------------------
import socket
host = socket.gethostname()
#IP-Adresse abrufen
# google colab :zufällig
# iMac : xxxxxxxx
# Lenovo : yyyyyyyy
# env
# 0: google colab
# 1: iMac (no GPU)
# 2: Lenovo (no GPU)
# gpu_en
# 0: disable
# 1: enable
if host == 'xxxxxxxx':
env = 1
gpu_en = 0
elif host == 'yyyyyyyy':
env = 2
gpu_en = 0
else:
env = 0
gpu_en = 1
if gpu_en == 1:
from chainer import cuda, Variable
def __init__(self):
super().__init__()
if env == 0:
self.modelfile = '/content/drive/My Drive/・ ・ ・/python-dlshogi/model/model_policy'
elif env == 1:
self.modelfile = r'/Users/・ ・ ・/python-dlshogi/model/model_policy' #Durch Lernen erstelltes Strategienetzwerkmodell
elif env == 2:
self.modelfile = r"C:\Users\・ ・ ・\python-dlshogi\model\model_policy"
self.model = None
if gpu_en == 1:
self.model.to_gpu()
if gpu_en == 1:
x = Variable(cuda.to_gpu(np.array([features], dtype=np.float32)))
elif gpu_en == 0:
x = np.array([features], dtype=np.float32)
if gpu_en == 1:
logits = cuda.to_cpu(y.data)[0]
probabilities = cuda.to_cpu(F.softmax(y).data)[0]
elif gpu_en == 0:
logits = y.data[0]
probabilities = F.softmax(y).data[0]
Versuchen Sie, zwischen der Greedy-Strategie und der Softmax-Strategie zu wählen. Es war schwer zu verstehen, wie man ein Buch schreibt, deshalb habe ich es umgeschrieben.
#Strategie
# 'greedy':Gierige Strategie
# 'boltzmann':Softmax-Strategie
algorithm ='boltzmann'
if algorithm == 'greedy':
#(1) Wählen Sie den Zug mit der höchsten Wahrscheinlichkeit aus (gierige Strategie). Geben Sie einfach das Element mit der höchsten Wahrscheinlichkeit zurück.
selected_index = greedy(legal_logits)
elif algorithm =='boltzmann':
#(2) Wählen Sie einen Zug entsprechend der Wahrscheinlichkeit (Softmax-Strategie). Geben Sie Elemente mit hoher Wahrscheinlichkeit zufällig zurück.
selected_index = boltzmann(np.array(legal_logits, dtype=np.float32), 0.5)
python-dlshogi\pydlshogi\player\policy_player.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Umgebungseinstellung
#-----------------------------
import socket
host = socket.gethostname()
#IP-Adresse abrufen
# google colab :zufällig
# iMac : xxxxxxxx
# Lenovo : yyyyyyyy
# env
# 0: google colab
# 1: iMac (no GPU)
# 2: Lenovo (no GPU)
# gpu_en
# 0: disable
# 1: enable
if host == 'xxxxxxxx':
env = 1
gpu_en = 0
elif host == 'yyyyyyyy':
env = 2
gpu_en = 0
else:
env = 0
gpu_en = 1
#Strategie
# 'greedy':Gierige Strategie
# 'boltzmann':Softmax-Strategie
algorithm ='boltzmann'
#-----------------------------
import numpy as np
import chainer
from chainer import serializers
import chainer.functions as F
if gpu_en == 1:
from chainer import cuda, Variable
import shogi
from pydlshogi.common import *
from pydlshogi.features import *
from pydlshogi.network.policy import *
from pydlshogi.player.base_player import *
def greedy(logits): #Gibt den Index des Elements mit dem Maximalwert unter den im Argument angegebenen Elementen der Liste zurück
#Logs sind die Werte vor dem Übergeben der Aktivierungsfunktion im neuronalen Netzwerk.
return logits.index(max(logits)) #aufführen.index gibt das number-Element der Liste selbst zurück, dessen Wert im Argument angegeben ist.
def boltzmann(logits, temperature):
logits /= temperature # a /=b ist a= a /Bedeutung von b
logits -= logits.max() # a -=b ist a= a -Bedeutung von b. Es wird ein negativer Wert sein. Der Maximalwert ist 0.
probabilities = np.exp(logits) # x =<0 exp Funktion
probabilities /= probabilities.sum()
return np.random.choice(len(logits), p=probabilities) # choice(i, p=b)Ist 0 bis i-Gibt zufällig Zahlen bis zu 1 mit einer Wahrscheinlichkeit von b zurück
class PolicyPlayer(BasePlayer):
def __init__(self):
super().__init__()
if env == 0:
self.modelfile = '/content/drive/My Drive/・ ・ ・/python-dlshogi/model/model_policy'
elif env == 1:
self.modelfile = r'/Users/・ ・ ・/python-dlshogi/model/model_policy' #Durch Lernen erstelltes Strategienetzwerkmodell
elif env == 2:
self.modelfile = r"C:\Users\・ ・ ・\python-dlshogi\model\model_policy"
self.model = None
def usi(self): #GUI-Softwareseite: Senden Sie den USI-Befehl nach dem Start. USI-Seite: Gibt ID (und Option) und Usiok zurück.
print('id name policy_player')
print('option name modelfile type string default ' + self.modelfile)
print('usiok')
def setoption(self, option):
if option[1] == 'modelfile':
self.modelfile = option[3]
def isready(self): #GUI-Softwareseite: Der Befehl Senden ist bereit, bevor das Spiel beginnt. USI-Seite: Initialisiert und kehrt bereit in Ordnung zurück.
if self.model is None:
self.model = PolicyNetwork()
if gpu_en == 1:
self.model.to_gpu()
serializers.load_npz(self.modelfile, self.model)
print('readyok')
def go(self):
if self.board.is_game_over():
print('bestmove resign')
return
features = make_input_features_from_board(self.board)
if gpu_en == 1:
x = Variable(cuda.to_gpu(np.array([features], dtype=np.float32)))
elif gpu_en == 0:
x = np.array([features], dtype=np.float32)
with chainer.no_backprop_mode():
y = self.model(x)
if gpu_en == 1:
logits = cuda.to_cpu(y.data)[0]
probabilities = cuda.to_cpu(F.softmax(y).data)[0]
elif gpu_en == 0:
logits = y.data[0] #Weisen Sie den Wert zu, bevor Sie die Aktivierungsfunktion der Variablen übergeben. Nehmen Sie das erste Element wie unten gezeigt heraus.
# y.Daten sind[[-4.137782 0.12063725 -4.907426 ... -5.663455 -6.104148 -7.8398824 ]]
# y.data[0]Ist[-4.137782 0.12063725 -4.907426 ... -5.663455 -6.104148 -7.8398824 ]
#Übrigens, y.data[0]Die Anzahl der Elemente von(20 + 7) * 9 * 9 = 2187
probabilities = F.softmax(y).data[0]
#Wahrscheinlichkeiten[1.3974859e-04 9.8799672e-03 6.4728469e-05 ... 3.0391777e-05 1.9559853e-05 3.4478303e-06]
#Über alle legalen Hände
legal_moves = []
legal_logits = []
for move in self.board.legal_moves:
#In Etikett konvertieren
label = make_output_label(move, self.board.turn) #Bewegungsrichtung+Ersetzen Sie 27 des Besitzstücks und 9x9 des zu kennzeichnenden Bestimmungsortes
#Wahrscheinlichkeit eines legalen Umzugs und seines Umzugs(logits)Geschäft
legal_moves.append(move)
legal_logits.append(logits[label]) #label repräsentiert den Index der Bewegung. Legal die Wahrscheinlichkeit dieses Umzugs_Logs zuweisen.
#Wahrscheinlichkeit anzeigen
print('info string {:5} : {:.5f}'.format(move.usi(), probabilities[label]))
if algorithm == 'greedy':
#(1) Wählen Sie den Zug mit der höchsten Wahrscheinlichkeit aus (gierige Strategie). Geben Sie einfach das Element mit der höchsten Wahrscheinlichkeit zurück.
selected_index = greedy(legal_logits)
elif algorithm =='boltzmann':
#(2) Wählen Sie einen Zug entsprechend der Wahrscheinlichkeit (Softmax-Strategie). Geben Sie Elemente mit hoher Wahrscheinlichkeit zufällig zurück.
selected_index = boltzmann(np.array(legal_logits, dtype=np.float32), 0.5)
bestmove = legal_moves[selected_index]
print('bestmove', bestmove.usi())
2g2f (2 6 Schritte) 0,48551 7g7f (7 sechs Schritte) 0,40747 Ich zeigte auf zwei sechs Schritte. Es scheint kein Problem zu geben.
Diesmal zeigte ich auf 76 Schritte. Es scheint, dass die Softmax-Strategie zufällig auf eine Hand mit hoher Wahrscheinlichkeit zeigt. Kein Problem.
Recommended Posts