Der Ort der legalen Handfilterung liegt vor dem Richtliniennetzwerk. Mein Ziel ist? Reduzierte Speichernutzung? Beachten Sie, dass sich die Bedeutung der Variablen möglicherweise von der des Richtliniennetzwerks unterscheidet. (Legal_logits und logits)
features.append(make_input_features_from_board(self.board)) Ausgabe von make_input_features_from_board: Wo das erste Stück ist, das erste Stück, das zweite Stück, das zweite Stück [(9 × 9-Matrix), (9 × 9-Matrix), ... (18 + 4 + 4 + 4 + 4 + 2 + 2), (9 × 9-Matrix), (9x9 Matrix), ... (18 + 4 + 4 + 4 + 4 + 2 + 2)] Dieses Array wird zu Funktionen hinzugefügt, die so viele wie legale Bewegungen enthalten. [[Dieses Array], [Dieses Array], ..., [Dieses Array]]. Die Anzahl der Elemente ist die Anzahl der legalen Hände, da sie nach dem Filtern der legalen Hände ausgeführt wird. Wenn Sie beispielsweise Anfänger sind, beträgt die Anzahl der Elemente 30.
y.data Ein Beispiel für 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]
Die Anzahl der Elemente ist die Anzahl der legalen Hände, da sie nach dem Filtern der legalen Hände ausgeführt wird. Das Obige ist ein Beispiel für das Drucken in der ersten Stufe. Der erste Zug besteht aus 30 legalen Zügen, es gibt also 30 Elemente.
for i, move in enumerate(legal_moves): Aufzählung gibt Index und Wert zurück Im Richtliniennetzwerk wurde make_output_label verwendet, um den Index abzurufen. Die Hauptbedeutung ist leichter zu verstehen. Es gibt jedoch viele Beschreibungen. Das Wertnetzwerk verwendet enumerate, um den Index abzurufen. Die Hauptbedeutung ist schwer zu verstehen, aber die Beschreibung ist einfach. Es scheint, dass die Bedeutung des Tuns dieselbe ist.
python-dlshogi\pydlshogi\player\search1_player.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Umgebungseinstellung
#-----------------------------
import socket
host = socket.gethostname()
#IP-Adresse abrufen
# google colab :zufällig
# 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
#Strategie
# 'greedy':Gierige Strategie
# 'boltzmann':Softmax-Strategie
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): #Gibt den Index des Elements mit dem Maximalwert unter den im Argument angegebenen Elementen der Liste zurück
#Logs sind die Werte vor dem Übergeben der Aktivierungsfunktion im neuronalen Netzwerk.
return np.argmax(logits)
#Protokolliert im Richtliniennetzwerk.index(max(logits))War Selbe Bedeutung. Vereinfachen Sie die Beschreibung nach und nach?
def boltzmann(logits, temperature):
logits /= temperature # a /=b ist a= a /Bedeutung von b
logits -= logits.max() # a -=b ist a= a -Bedeutung von b. Es wird ein negativer Wert sein. Der Maximalwert ist 0.
probabilities = np.exp(logits) # x =<0 exp Funktion
probabilities /= probabilities.sum()
return np.random.choice(len(logits), p=probabilities) # choice(i, p=b)Ist 0 bis i-Gibt zufällig Zahlen bis zu 1 mit einer Wahrscheinlichkeit von b zurück
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' #Wertnetzwerkmodell durch Lernen erstellt
elif env == 2:
self.modelfile = r"C:\Users\・ ・ ・\python-dlshogi\model\model_value"
self.model = None
def usi(self): #GUI-Softwareseite: Senden Sie den USI-Befehl nach dem Start. USI-Seite: Gibt ID (und Option) und Usiok zurück.
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): #Seite der GUI-Software: Der Befehl Senden ist bereit, bevor das Spiel beginnt. USI-Seite: Initialisiert und kehrt bereit in Ordnung zurück.
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
#Über alle legalen Hände
#Der Ort der legalen Handfilterung liegt vor dem Richtliniennetzwerk.
#Mein Ziel ist? Reduzierte Speichernutzung?
#Beachten Sie, dass sich die Bedeutung der Variablen möglicherweise von der des Richtliniennetzwerks unterscheidet.(leagal_logits und logits)
legal_moves = []
features = []
for move in self.board.legal_moves:
legal_moves.append(move)
self.board.push(move) #1 Hand
features.append(make_input_features_from_board(self.board))
# make_input_features_from_Board-Ausgabe: Wo das erste Stück ist, das erste Stück, das zweite Stück, das zweite Stück
# [(9x9 Matrix),
# (9x9 Matrix),... ist (18 + 4 + 4 + 4 + 4 + 2 + 2),
# (9x9 Matrix),
# (9x9 Matrix),... ist (18 + 4 + 4 + 4 + 4 + 2 + 2)]
#Dieses Array wird zu Funktionen hinzugefügt, die so viele wie legale Bewegungen enthalten.[[Dieses Array],[Dieses Array],・ ・ ・,[Dieses Array]]。
#Die Anzahl der Elemente ist die Anzahl der legalen Schritte. Wenn Sie beispielsweise Anfänger sind, beträgt die Anzahl der Elemente 30.
self.board.pop() #1 Nacharbeit
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)
#Invertieren Sie den Code, um die Gewinnrate auf Ihrer Turn-Seite zu erhalten
with chainer.no_backprop_mode():
y = -self.model(x)
if gpu_en == 1:
logits = cuda.to_cpu(y.data).reshape(-1) # reshape(-1)Erstellen Sie ein eindimensionales Array mit
probabilities = cuda.to_cpu(F.sigmoid(y).data).reshape(-1)
elif gpu_en == 0:
logits = y.data.reshape(-1) #Übrigens, y.Die Anzahl der Elemente in Daten ist die Anzahl der legalen Bewegungen. Zum Beispiel 30 für den ersten Zug.
probabilities = F.sigmoid(y).data.reshape(-1)
# y.Ein Beispiel für Daten
# [[-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]
#Die Anzahl der Elemente ist die Anzahl der legalen Schritte. Das Obige ist ein Beispiel für den ersten Zug, und da es 30 legale Züge gibt, gibt es 30 Elemente.
for i, move in enumerate(legal_moves):
#Aufzählung gibt Index und Wert zurück
#Machen Sie, um den Index im Richtliniennetzwerk abzurufen_output_Ich habe beschriftet.
#Die Hauptbedeutung ist leichter zu verstehen. Es gibt jedoch viele Beschreibungen.
#Das Wertnetzwerk verwendet enumerate, um den Index abzurufen.
#Die Hauptbedeutung ist schwer zu verstehen, aber die Beschreibung ist einfach. Es scheint, dass die Bedeutung des Tuns dieselbe ist.
#Wahrscheinlichkeit anzeigen
print('info string {:5} : {:.5f}'.format(move.usi(), probabilities[i]))
print(y.data)
print(y.data.reshape(-1))
if algorithm == 'greedy':
#(1) Wählen Sie den Zug mit der höchsten Wahrscheinlichkeit aus (gierige Strategie). Geben Sie einfach das Element mit der höchsten Wahrscheinlichkeit zurück.
selected_index = greedy(logits)
elif algorithm =='boltzmann':
#(2) Wählen Sie eine Hand entsprechend der Wahrscheinlichkeit (Softmax-Strategie). Geben Sie Elemente mit hoher Wahrscheinlichkeit zufällig zurück.
selected_index = boltzmann(np.array(logits, dtype=np.float32), 0.5)
bestmove = legal_moves[selected_index]
print('bestmove', bestmove.usi())
KI, die nur das Wertnetzwerk verwendet und nur eine Einhandsuche durchführt. Es ist zu schwach.
Spielvideo https://youtu.be/W3ZqlcDg_yE
Letzte Karte
Recommended Posts