[PYTHON] Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~

Serieninhaltsverzeichnis

Letztes Mal Fortsetzung ... In diesem Bereich habe ich als Außenseiter "die Theorie des maschinellen Lernens" überhaupt nicht studiert. Ich werde Othellos KI machen. Klicken Sie hier für die Site, auf die verwiesen wird

Grundlagen des verstärkenden Lernens

Ich habe Othellos KI gemacht, ohne "die Theorie des maschinellen Lernens" zu studieren. Ich werde die Mindestkenntnisse zusammenfassen, die zur Implementierung erforderlich sind.

Dateistruktur und Rolle

Die Dateistruktur und die Rolle sind wie folgt. 構成.png --train.py --- KI-Training --Reversi.py --- Othello Game Management --dqn_agent.py --- Verwaltung des KI-Trainings --FightWithAI.py --- Kämpfe mit Benutzern

Gesamtalgorithmus

Der diesmal implementierte DQN-Algorithmus sieht folgendermaßen aus.

algorithm.png Wenn Sie diesen Fluss im Auge behalten, werden Sie verstehen, wovon Sie sprechen und was Sie erklären werden.

Othello Spielspezifikationen

Das Brett wurde für Othello-Spiele und KI-Training verwendet Dies erfolgt unter Verwendung eines zweidimensionalen Arrays mit Nein in der folgenden Abbildung. screen.png

Reversi.py


self.screen[0~7][0~7]

Die Operation, die AI auswählen kann, besteht darin, die Zahl von 0 bis 63 in der obigen Abbildung auszuwählen.

Reversi.py


self.enable_actions[0~63]

KI-Training

Im KI-Training spielten Spieler [0] und Spieler [1] Othello-Schlachten n_epochs = 1000 Mal. Speichern Sie zum Schluss die KI des zweiten Spielers [1].

Belohnung für AI

Trainingsmethode

Ich werde mit zwei AIs spielen, aber ich muss auch im Zug des Gegners handeln Weil die Geschichte bis zum Ende nicht verbunden ist (Q-Wert wird nicht übertragen)

8151b82b-2d1a-7b02-4282-1e98a5a9a265.png

Beide wirken auf Schritt und Tritt Dieses Mal habe ich beschlossen, "den Übergang in D zu speichern" für alle Zahlen, die getrennt vom Spielfortschritt eingestellt werden können.

train.py



#Ziele enthält alle Zahlen, die Sie in diesem Zug setzen können
for tr in targets:
    #Dupliziere den Status Quo
    tmp = copy.deepcopy(env)
    #Aktion
    tmp.update(tr, playerID[i])
    #Urteil beenden
    win = tmp.winner()
    end = tmp.isEnd()
    #Vorstand nach dem Handeln
    state_X = tmp.screen
    #Eine Nummer, die Sie hinterlassen können, nachdem Sie gehandelt haben
    target_X = tmp.get_enables(playerID[i+1])
                       
    #Beide Aktionen
    for j in range(0, len(players)):
        reword = 0
        if end == True:
            if win == playerID[j]:
                #Erhalten Sie 1 Belohnung, wenn Sie gewinnen
                reword = 1
        #Beide "Übergang in D speichern"
        players[j].store_experience(state, targets, tr, reword, state_X, target_X, end)
        players[j].experience_replay()

Der folgende Teil des DQN-Algorithmus wird von dqn_agent.py ausgeführt.

Ich weiß nicht, warum es ein ganzes Paket der Site ist, auf die ich mich bezog

dqn_agent.py


    def store_experience(self, state, targets, action, reward, state_1, targets_1, terminal):
        self.D.append((state, targets, action, reward, state_1, targets_1, terminal))
>>
    def experience_replay(self):
        state_minibatch = []
        y_minibatch = []
>>
        # sample random minibatch
        minibatch_size = min(len(self.D), self.minibatch_size)
        minibatch_indexes = np.random.randint(0, len(self.D), minibatch_size)
>>
        for j in minibatch_indexes:
            state_j, targets_j, action_j, reward_j, state_j_1, targets_j_1, terminal = self.D[j]
            action_j_index = self.enable_actions.index(action_j)
>>
            y_j = self.Q_values(state_j)
>>
            if terminal:
                y_j[action_j_index] = reward_j
            else:
                # reward_j + gamma * max_action' Q(state', action')
                qvalue, action = self.select_enable_action(state_j_1, targets_j_1)
                y_j[action_j_index] = reward_j + self.discount_factor * qvalue
>>
            state_minibatch.append(state_j)
            y_minibatch.append(y_j)
>>
        # training
        self.sess.run(self.training, feed_dict={self.x: state_minibatch, self.y_: y_minibatch})
>>
        # for log
        self.current_loss = self.sess.run(self.loss, feed_dict={self.x: state_minibatch, self.y_: y_minibatch})
>>
Variablennamen Inhalt
state Brettoberfläche( = Reversi.screen[0~7][0~7] )
targets Nummer, die Sie verlassen können
action Ausgewählte Aktion
reward Belohnung für Aktion 0-1
state_1 Vorstand nach dem Handeln
targets_1 Eine Nummer, die Sie hinterlassen können, nachdem Sie gehandelt haben
terminal Spiel endet = Richtig

Implementierung

Im KI-Training spielten Spieler [0] und Spieler [1] Othello-Schlachten n_epochs = 1000 Mal. Speichern Sie zum Schluss die KI des zweiten Spielers [1].

train.py


   # parameters
    n_epochs = 1000
    # environment, agent
    env = Reversi()
 
    # playerID    
    playerID = [env.Black, env.White, env.Black]

    # player agent    
    players = []
    # player[0]= env.Black
    players.append(DQNAgent(env.enable_actions, env.name, env.screen_n_rows, env.screen_n_cols))
    # player[1]= env.White
    players.append(DQNAgent(env.enable_actions, env.name, env.screen_n_rows, env.screen_n_cols))

Dieser DQNAgent (env.enable_actions, env.name, env.screen_n_rows, env.screen_n_cols) Teil ist

  • Wiederholungsspeicher initialisieren D. --Q NetworkQ wird mit einem zufälligen Gewicht θ initialisiert --Initialize Target NetworkQ θ ^ = θ

, Dqn_agent.py macht es.

dqn_agent.py


class DQNAgent:
>>
    def __init__(self, enable_actions, environment_name, rows, cols):
        ...Kürzung...
        #Initialisierung des Wiedergabespeichers D.
        self.D = deque(maxlen=self.replay_memory_size)
        ...Kürzung...
>>
    def init_model(self):
        # input layer (rows x cols)
        self.x = tf.placeholder(tf.float32, [None, self.rows, self.cols])
>>
        # flatten (rows x cols)
        size = self.rows * self.cols
        x_flat = tf.reshape(self.x, [-1, size])
>>
        #Initialisieren Sie Q NetworkQ mit dem zufälligen Gewicht θ
        W_fc1 = tf.Variable(tf.truncated_normal([size, size], stddev=0.01))
        b_fc1 = tf.Variable(tf.zeros([size]))
        h_fc1 = tf.nn.relu(tf.matmul(x_flat, W_fc1) + b_fc1)
>>
        #Initialisieren Sie das Zielnetzwerk Q θ^=θ
        W_out = tf.Variable(tf.truncated_normal([size, self.n_actions], stddev=0.01))
        b_out = tf.Variable(tf.zeros([self.n_actions]))
        self.y = tf.matmul(h_fc1, W_out) + b_out
>>
        # loss function
        self.y_ = tf.placeholder(tf.float32, [None, self.n_actions])
        self.loss = tf.reduce_mean(tf.square(self.y_ - self.y))
>>
        # train operation
        optimizer = tf.train.RMSPropOptimizer(self.learning_rate)
        self.training = optimizer.minimize(self.loss)
>>
        # saver
        self.saver = tf.train.Saver()
>>
        # session
        self.sess = tf.Session()
        self.sess.run(tf.initialize_all_variables())

python


    for e in range(n_epochs):
        # reset
        env.reset()
        terminal = False
  • for episode =1, M do

python


        while terminal == False: #Schleife bis zum Ende einer Episode

            for i in range(0, len(players)): 
                
                state = env.screen
                targets = env.get_enables(playerID[i])
                
                if len(targets) > 0:
                    #Wenn es einen Platz gibt, an dem man es irgendwo hinstellen kann

#← Hier werden alle oben genannten Hände "in D gespeichert"

                    #Wähle eine Aktion
                    action = players[i].select_action(state, targets, players[i].exploration)
                    #Handeln Sie
                    env.update(action, playerID[i])
  • while not terminal --Aktionsauswahl

Aktionsauswahl agent.select_action (state_t, Ziele, agent.exploration) ist Dies erfolgt durch dqn_agent.py.

  • Aktionsauswahl

dqn_agent.py


    def Q_values(self, state):
        # Q(state, action) of all actions
        return self.sess.run(self.y, feed_dict={self.x: [state]})[0]
>>
    def select_action(self, state, targets, epsilon):
>>    
        if np.random.rand() <= epsilon:
            # random
            return np.random.choice(targets)
        else:
            # max_action Q(state, action)
            qvalue, action = self.select_enable_action(state, targets)
            return action
>>  
    #Die Tafel(state)damit,Platz zum setzen(targets)Gibt den Q-Wert und die Zahl zurück, aus denen der Q-Wert maximiert wird
    def select_enable_action(self, state, targets):
        Qs = self.Q_values(state)
        #descend = np.sort(Qs)
        index = np.argsort(Qs)
        for action in reversed(index):
            if action in targets:
                break 
        # max_action Q(state, action)
        qvalue = Qs[action]       
>>
        return qvalue, action          
  • Führen Sie die Aktion ai aus und beobachten Sie die Belohnung ri, den nächsten Bildschirm xi + 1 und beenden Sie das Urteil tarminal --Verarbeiten und erstellen Sie den nächsten Status si + 1

Speichern Sie schließlich die letztere KI



                #Das Ergebnis der Ausführung der Aktion
                terminal = env.isEnd()     
                              
        w = env.winner()                    
        print("EPOCH: {:03d}/{:03d} | WIN: player{:1d}".format(
                         e, n_epochs, w))


    #Speichern speichert den zweiten Spieler player2.
    players[1].save_model()

Die Quelle ist hier. $ git clone https://github.com/sasaco/tf-dqn-reversi.git

Nächstes Mal informiert Sie über die Battle Edition.

Recommended Posts

Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe versucht, Othello AI zu machen, dass ich 7,2 Millionen Hände durch tiefes Lernen mit Chainer gelernt habe
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Vorhersage-API des maschinellen Lernmodells von WordPress aus aufzurufen
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Bewegungen von Wiire-Playern automatisch mit Software zu extrahieren
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Bedeutet Memo, wenn versucht wird, maschinelles Lernen mit 50 Bildern durchzuführen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (zweite Hälfte).
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, KI für Smash Bra zu machen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
Ein Anfänger des maschinellen Lernens versuchte, mit Python ein Vorhersagemodell für Pferderennen zu erstellen
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
[Python] Ich habe die Theorie und Implementierung der Support Vector Machine (SVM) ausführlich erklärt.
Ich habe das TensorFlow-Tutorial mit Kommentaren ausgeführt (Textklassifizierung von Filmkritiken).
Ich habe versucht, Objekte mit YOLO v3 (TensorFlow 2.1) auf der GPU von Windows zu erkennen!
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Die Geschichte von soracom_exporter (Ich habe versucht, SORACOM Air mit Prometheus zu überwachen)
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, Deep Learning mit Spark × Keras × Docker 2 Multi-Host-Edition skalierbar zu machen