[PYTHON] Deep Learning avec Shogi AI sur Mac et Google Colab Chapitre 10 6-9

TOP PAGE

Recherche à 1 main AI (search1_player.py)

Emplacement du filtrage manuel légal

L'emplacement du filtrage manuel légal est venu avant le réseau politique. Mon but est? Réduction de l'utilisation de la mémoire? Notez que la signification des variables peut être différente de celle du réseau politique. (Legal_logits et logits)

features.append(make_input_features_from_board(self.board)) Sortie de make_input_features_from_board: Où se trouve la première pièce, la première pièce, la deuxième pièce, la deuxième pièce [(Matrice 9x9), (Matrice 9x9), ... (18 + 4 + 4 + 4 + 4 + 2 + 2), (Matrice 9x9), (Matrice 9x9), ... (18 + 4 + 4 + 4 + 4 + 2 + 2)] Ce tableau s'ajoute aux fonctionnalités autant que les coups légaux. [[Ce tableau], [Ce tableau], ..., [Ce tableau]]. Le nombre d'éléments est le nombre de mains légales car il est effectué après filtrage des mains légales. Par exemple, si vous êtes débutant, le nombre d'éléments est de 30.

y.data Un exemple de y.data

[[-0.04460792]
 [ 0.02167853]
 [ 0.04610606]
・ ・ ・
 [-0.09904062]]

y.data.reshape(-1)

 [-0.04460792  0.02167853  0.04610606 -0.10492548 -0.22675163 -0.23193529
  -0.06671577  0.02509898 -0.02109829 -0.05519588 -0.05578787 -0.03609923
  -0.11021192 -0.10877373 -0.04065045 -0.01540023 -0.0336022  -0.03805592
   -0.03325626 -0.02194545 -0.08399387 -0.13204134 -0.2106831  -0.24970257
   -0.18735377 -0.08184412 -0.15573277 -0.00548664 -0.0353202  -0.09904062]

Le nombre d'éléments est le nombre de mains légales car il est effectué après filtrage des mains légales. Ce qui précède est un exemple d'impression à la première étape. Le premier coup est de 30 coups légaux, donc il y a 30 éléments.

for i, move in enumerate(legal_moves): enumerate renvoie l'index et la valeur Dans le réseau de règles, make_output_label a été utilisé pour obtenir l'index. La signification principale est plus facile à comprendre. Cependant, il existe de nombreuses descriptions. Le réseau de valeurs utilise enumerate pour obtenir l'index. La signification principale est difficile à comprendre, mais la description est facile. Il semble que le sens de faire soit le même.

python-dlshogi\pydlshogi\player\search1_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.value 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 np.argmax(logits)
    #Connexion au réseau de règles.index(max(logits))Était Même signification. Simplifiez-vous la description petit à petit?

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 Search1Player(BasePlayer):
    def __init__(self):
        super().__init__()
        if env == 0:
            self.modelfile = '/content/drive/My Drive/・ ・ ・/python-dlshogi/model/model_value'
        elif env == 1:
            self.modelfile = r'/Users/・ ・ ・/python-dlshogi/model/model_value' #Modèle de réseau de valeur créé par l'apprentissage
        elif env == 2:
            self.modelfile = r"C:\Users\・ ・ ・\python-dlshogi\model\model_value"
        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 search1_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 = ValueNetwork()
            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

        #À propos de toutes les mains juridiques
        #L'emplacement du filtrage manuel légal est venu avant le réseau politique.
        #Mon but est? Réduction de l'utilisation de la mémoire?
        #Notez que la signification des variables peut être différente de celle du réseau politique.(leagal_logits et logits)
        legal_moves = []
        features = []
        for move in self.board.legal_moves:
            legal_moves.append(move)

            self.board.push(move) #1 main

            features.append(make_input_features_from_board(self.board))
            # make_input_features_from_Sortie du tableau: où se trouve la première pièce, la première pièce, la deuxième pièce, la deuxième
            # [(Matrice 9x9),
            # (Matrice 9x9),... est (18 + 4 + 4 + 4 + 4 + 2 + 2),
            # (Matrice 9x9),
            # (Matrice 9x9),... est (18 + 4 + 4 + 4 + 4 + 2 + 2)]
            #Ce tableau s'ajoute aux fonctionnalités autant que les coups légaux.[[Ce tableau],[Ce tableau],・ ・ ・,[Ce tableau]]。
            #Le nombre d'éléments est le nombre de coups légaux. Par exemple, si vous êtes débutant, le nombre d'éléments est de 30.

            self.board.pop() #1 retouche

        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)

        #Inversez le code pour obtenir le taux gagnant de votre côté
        with chainer.no_backprop_mode():
            y = -self.model(x)

            if gpu_en == 1:
                logits = cuda.to_cpu(y.data).reshape(-1) # reshape(-1)Créez un tableau unidimensionnel avec
                probabilities = cuda.to_cpu(F.sigmoid(y).data).reshape(-1)
            elif gpu_en == 0:
                logits = y.data.reshape(-1) #Au fait, y.Le nombre d'éléments dans les données est le nombre de coups légaux. Par exemple, 30 pour le premier coup.
                probabilities = F.sigmoid(y).data.reshape(-1)
                # y.Un exemple de données
                # [[-0.04460792]
                #  [ 0.02167853]
                #  [ 0.04610606]
                #・ ・ ・
                #  [-0.09904062]]
                #
                # y.data.reshape(-1)
                #  [-0.04460792  0.02167853  0.04610606 -0.10492548 -0.22675163 -0.23193529
                #   -0.06671577  0.02509898 -0.02109829 -0.05519588 -0.05578787 -0.03609923
                #   -0.11021192 -0.10877373 -0.04065045 -0.01540023 -0.0336022  -0.03805592
                #    -0.03325626 -0.02194545 -0.08399387 -0.13204134 -0.2106831  -0.24970257
                #    -0.18735377 -0.08184412 -0.15573277 -0.00548664 -0.0353202  -0.09904062]
                #Le nombre d'éléments est le nombre de coups légaux. Ce qui précède est un exemple du premier coup, et comme il y a 30 coups légaux, il y a 30 éléments.

            for i, move in enumerate(legal_moves):
            #enumerate renvoie l'index et la valeur
            #Faire pour obtenir l'index dans le réseau politique_output_J'étiquetais.
            #La signification principale est plus facile à comprendre. Cependant, il existe de nombreuses descriptions.
            #Le réseau de valeurs utilise enumerate pour obtenir l'index.
            #La signification principale est difficile à comprendre, mais la description est facile. Il semble que le sens de faire soit le même.
                #Afficher la probabilité
                print('info string {:5} : {:.5f}'.format(move.usi(), probabilities[i]))
                print(y.data)
                print(y.data.reshape(-1))

        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(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(logits, dtype=np.float32), 0.5)

        bestmove = legal_moves[selected_index]

        print('bestmove', bestmove.usi())

Jeu

Une IA qui n'utilise que le réseau de valeur et n'effectue qu'une recherche d'une seule main. C'est trop faible.

Vidéo de jeu https://youtu.be/W3ZqlcDg_yE

Carte finale 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 6-9
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
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 5-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
Étapes pour créer rapidement un environnement d'apprentissage en profondeur sur Mac avec TensorFlow et OpenCV
Jouez avec Turtle sur 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
La meilleure façon d'utiliser MeCab et CaboCha avec Google Colab
[Note de lecture] Apprentissage automatique pratique avec Scikit-Learn, Keras et TensorFlow Chapitre 1
Installez lp_solve sur Mac OSX et appelez-le avec python.
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