[PYTHON] Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 8 1-4

TOP PAGE

Implémentation du moteur USI

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]

Commutation automatique entre GPU / CPU et PC

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]

Définition de la stratégie

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)

Tous les codes

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())

tester

Test depuis la ligne de commande

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. image.png

Testé à partir de Google Colab

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. image.png

Coordonner

image.png

Recommended Posts

Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 11
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 8
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 12 3
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 7
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 10
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 7 5-7
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 9
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 12 3
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 12 3
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 12 1-2
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 12 3 ~ 5
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 7 9
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 8 1-4
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 12 3
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 7 8
Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 7 1-4
Apprentissage en profondeur avec Shogi AI sur Mac et Google Colab
Apprentissage en profondeur avec Shogi AI sur Mac et Google Colab Chapitres 1 à 6
Apprenez avec Shogi AI Deep Learning sur Mac et Google Colab Utilisez Google Colab
Apprentissage en profondeur sur Mac et Google Colab mots appris avec Shogi AI
Apprentissage automatique avec Pytorch sur Google Colab
À propos de l'apprentissage avec Google Colab
"Apprentissage de word2vec" et "Visualisation avec Tensorboard" sur Colaboratory
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
Installez le sélénium sur votre Mac et essayez-le avec python
Analyse d'images par apprentissage profond à partir de Kaggle et Keras
[AI] Apprentissage métrique profond
Prédire les tags en extrayant des fonctionnalités musicales avec Deep Learning
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 14) Exécutez le programme du chapitre 4 sur Google Colaboratory
[Google Colab] Comment interrompre l'apprentissage, puis le reprendre
Reconnaissez votre patron avec Deep Learning et masquez l'écran
Une erreur survenue lors de l'apprentissage de YOLO avec Google Colab
Paramètres d'environnement d'apprentissage automatique basés sur Python3 sur Mac (coexistence avec Python2)
HIKAKIN et Max Murai avec vidéo de jeu en direct et apprentissage en profondeur
Essayez l'apprentissage en profondeur avec TensorFlow
Apprentissage profond du noyau avec Pyro
Essayez le Deep Learning avec FPGA
Catalina sur Mac et pyenv
Générez des Pokémon avec Deep Learning
Créez des rendez-vous pour le concours AtCoder sur Google Agenda avec Python et GAS
Créez un environnement Python sur votre Mac avec Anaconda et PyCharm
Erreur et solution lors de l'installation de python3 avec homebrew sur mac (catalina 10.15)
Comment exécuter Jupyter et Spark sur Mac avec des paramètres minimaux
[Note de lecture] Apprentissage automatique pratique avec Scikit-Learn, Keras et TensorFlow Chapitre 1
Essayez le Deep Learning avec les concombres FPGA-Select
Identification de la race de chat avec Deep Learning
Deep learning / Deep learning made from scratch Chapitre 3 Mémo
flux tensoriel avec anaconda sur mac
MQTT sur Raspberry Pi et Mac
Faites de l'art ASCII avec l'apprentissage en profondeur
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 5 Mémo
Essayez l'apprentissage en profondeur avec TensorFlow Partie 2
Présentation d'OpenCV sur Mac avec homebrew
Organisez des plateformes d'apprentissage automatique et d'apprentissage en profondeur
Deep Learning / Deep Learning à partir de Zero 2 Chapitre 8 Mémo
Deep learning / Deep learning made from scratch Chapitre 5 Mémo
Vérifiez la forme de squat avec l'apprentissage en profondeur