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