policy_player.py y = self.model(x) y est la valeur de la couche de sortie avant de passer par la fonction d'activation.
logits = y.data[0] Attribuez la valeur de la couche de sortie avant de passer par la fonction d'activation à une variable appelée logs. Le mot logit signifie la valeur de la couche de sortie avant de passer par la fonction d'activation.
Signification de [0] Un exemple de 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 ]
Lors de la génération de x, les entités sont placées entre [] puis transformées en np.array. x = Variable(cuda.to_gpu(np.array([features], dtype=np.float32))) Alors, y.data est-il sous la forme de [[]]? Quel est le sens de []?
Le nombre d'éléments dans y.data [0] est (20 + 7) * 9 * 9 = 2187 20 est la direction du mouvement (HAUT, BAS, ...), 7 est le type de pièce que vous avez. Le nombre de mouvements, y compris tous les mouvements légaux et illégaux.
Dans le réseau de valeurs qui apparaît au chapitre 10, x est généré sans le placer entre []. x = Variable(cuda.to_gpu(np.array(features, dtype=np.float32))) Dans le chapitre 10, il est d'abord filtré par la main légale, et c'est un peu différent. C'est déroutant lorsqu'on le compare simplement.
probabilities = F.softmax(y).data[0] Les probabilités sont [1.3974859e-04 9.8799672e-03 6.4728469e-05 ... 3.0391777e-05 1.9559853e-05 3.4478303e-06]
Faites-le fonctionner à la fois sur iMac et Colab.
#Cadre environnemental
#-----------------------------
import socket
host = socket.gethostname()
#Obtenir l'adresse IP
# google colab :Aléatoire
# 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' #Modèle de réseau stratégique créé par l'apprentissage
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]
Essayez de choisir entre la stratégie Greedy et la stratégie Softmax. C'était difficile de comprendre comment écrire un livre, alors je l'ai réécrit.
#stratégie
# 'greedy':Stratégie gourmande
# 'boltzmann':Stratégie Softmax
algorithm ='boltzmann'
if algorithm == 'greedy':
#(1) Sélectionnez le mouvement avec la probabilité la plus élevée (stratégie gourmande) Renvoyez simplement l'élément avec la probabilité la plus élevée.
selected_index = greedy(legal_logits)
elif algorithm =='boltzmann':
#(2) Choisissez une main en fonction de la probabilité (stratégie Softmax) Renvoyez aléatoirement des éléments avec une probabilité élevée.
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 -*-
#Cadre environnemental
#-----------------------------
import socket
host = socket.gethostname()
#Obtenir l'adresse IP
# google colab :Aléatoire
# 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
#stratégie
# 'greedy':Stratégie gourmande
# 'boltzmann':Stratégie Softmax
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): #Renvoie l'index de l'élément avec la valeur maximale parmi les éléments de la liste spécifiés dans l'argument
#les logits sont les valeurs avant de passer la fonction d'activation dans le réseau neuronal.
return logits.index(max(logits)) #liste.index renvoie l'élément numérique de la liste elle-même que la valeur spécifiée dans l'argument est.
def boltzmann(logits, temperature):
logits /= temperature # a /=b est un= a /Signification de b
logits -= logits.max() # a -=b est un= a -Signification de b. Ce sera une valeur négative. La valeur maximale est 0.
probabilities = np.exp(logits) # x =<0 fonction exp
probabilities /= probabilities.sum()
return np.random.choice(len(logits), p=probabilities) # choice(i, p=b)Est de 0 à i-Renvoie des nombres jusqu'à 1 au hasard avec une probabilité de b
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' #Modèle de réseau stratégique créé par l'apprentissage
elif env == 2:
self.modelfile = r"C:\Users\・ ・ ・\python-dlshogi\model\model_policy"
self.model = None
def usi(self): #Côté logiciel GUI: envoyez la commande USI après le démarrage. Côté USI: renvoie id (et option) et usiok.
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): #Côté logiciel GUI: la commande Send is ready avant le début du jeu. Côté USI: initialise et retourne prêt ok.
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] #Attribuez la valeur avant de passer par la fonction d'activation à la variable. Retirez le premier élément comme indiqué ci-dessous.
# y.les données sont[[-4.137782 0.12063725 -4.907426 ... -5.663455 -6.104148 -7.8398824 ]]
# y.data[0]Est[-4.137782 0.12063725 -4.907426 ... -5.663455 -6.104148 -7.8398824 ]
#Au fait, y.data[0]Le nombre d'éléments de(20 + 7) * 9 * 9 = 2187
probabilities = F.softmax(y).data[0]
#probabilités[1.3974859e-04 9.8799672e-03 6.4728469e-05 ... 3.0391777e-05 1.9559853e-05 3.4478303e-06]
#À propos de toutes les mains juridiques
legal_moves = []
legal_logits = []
for move in self.board.legal_moves:
#Convertir en étiquette
label = make_output_label(move, self.board.turn) #Direction du mouvement+Remplacez 27 de la pièce de possession et 9x9 de la destination à étiqueter
#Probabilité de déplacement légal et de son déplacement(logits)Boutique
legal_moves.append(move)
legal_logits.append(logits[label]) #label représente l'index du déplacement. Légal la probabilité de ce mouvement_Attribuer aux logits.
#Afficher la probabilité
print('info string {:5} : {:.5f}'.format(move.usi(), probabilities[label]))
if algorithm == 'greedy':
#(1) Sélectionnez le mouvement avec la probabilité la plus élevée (stratégie gourmande) Renvoyez simplement l'élément avec la probabilité la plus élevée.
selected_index = greedy(legal_logits)
elif algorithm =='boltzmann':
#(2) Choisissez une main en fonction de la probabilité (stratégie Softmax) Renvoyez aléatoirement des éléments avec une probabilité élevée.
selected_index = boltzmann(np.array(legal_logits, dtype=np.float32), 0.5)
bestmove = legal_moves[selected_index]
print('bestmove', bestmove.usi())
2g2f (2 6 étapes) 0,48551 7g7f (7 six étapes) 0.40747 J'ai indiqué 2 six étapes. Il ne semble y avoir aucun problème.
Cette fois, j'ai indiqué 76 étapes. Il semble que la stratégie softmax pointe au hasard vers une main avec une probabilité élevée. Aucun problème.
Recommended Posts