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