[PYTHON] Machen wir mit Pylearn 2 eine dreiäugige KI

Einführung

Ich möchte Deep Learning mit pylearn2 machen. Ich bin mir jedoch nicht sicher, ob ich im Tutorial nur Bilddiskriminierung mache. Also mache ich eine KI für die dritte Zeile (sogenanntes ○ × Spiel). Ich wollte unbedingt Othellos KI machen, aber da ich pylearn2 zum ersten Mal benutze, habe ich mich für ein einfacheres Spiel entschieden. Ich bin übrigens ein Anfänger des maschinellen Lernens, pylearn2. Bitte weisen Sie auf Fehler hin. Überspringen Sie die Schritte, um die erforderlichen Pakete wie pylearn2 und numpy zu installieren.

Neuronales Netzdesign

Da es sich um eine dreiäugige KI handelt, nummerieren Sie zuerst die Quadrate auf der 3x3-Tafel, um den Status auf der Tafel anzuzeigen. 3x3.png

Der Eingang ist ein bestimmter Zustand der 3x3-Karte, und die Position des nächsten Zeigers ist der Ausgang. Betrachten Sie daher das folgende Netzwerk. n-net.png

Die Zahlen auf den Schultern der Eingabe- und Ausgabekreise sind die Zahlen der Quadrate auf der Tafel. Die Eingabe besteht aus 9 Eingaben, dh dem Zustand von 9 Quadraten. Die verborgene Schicht ist eine Schicht, und die Aktivierungsfunktion ist die Sigmoidfunktion. Da die Ausgabe in 9 Klassen unterteilt ist, verwenden Sie die Softmax-Funktion. "In 9 Klassen teilen" bedeutet hier, eine bestimmte Eingabe (Zustand der Tafel) nach dem Quadrat zu klassifizieren, nach dem der nächste Zug getroffen wird. Mit anderen Worten, wenn es in 0 klassifiziert ist, wird der nächste Zug auf dem 0-Quadrat ausgeführt.

Erstellung von Lehrdaten

Die diesmal geschaffene KI verfolgt keine Stärke. Wenn Sie mit dem Spiel fortfahren können, ohne von den Lehrdaten abzuweichen, teilen wir es in einen Buchstaben auf. Anstatt nur die Kampfdaten zu sammeln, die am besten funktionieren, bereiten Sie daher eine große Datenmenge vor, die einfach gemäß den Regeln konkurriert. Um eine große Menge an Kampfdaten zu generieren, habe ich ein Ruby-Skript erstellt, das es nur an einer Stelle platziert, an der sowohl der erste als auch der zweite Zug zufällig platziert werden können. Man könnte Ihnen sagen, warum Sie nicht in Python schreiben, aber nur weil Sie es satt haben, in letzter Zeit nur Python zu schreiben, bedeutet das nicht viel. Der erste Zug ist 〇 und der zweite Zug ist ×. Sie können eine Silbe erstellen, indem Sie die Anzahl der Schleifen im Argument angeben und ausführen. Dies wird als Lehrdaten verwendet. Die Zahl ist die Zahl des platzierten Feldes, und der Gewinn und Verlust am Ende zeigen den Sieg oder die Niederlage des ersten Angriffs an.

tic_tac_toe.rb


#!/usr/bin/env ruby
#
# tic tac toe
#
# 0 : O (first)
# 1 : X (second)
# 2 : none
#

def show_board(array)
  p array[0][0].to_s + "," + array[0][1].to_s + "," + array[0][2].to_s
  p array[1][0].to_s + "," + array[1][1].to_s + "," + array[1][2].to_s
  p array[2][0].to_s + "," + array[2][1].to_s + "," + array[2][2].to_s
  p ""
end

def judge(array)
  ret = 2
  for stone in [0, 1] do
    for i in [0 ,1, 2] do
      if (array[i][0]==stone && array[i][1]==stone && array[i][2]==stone) ||
         (array[0][i]==stone && array[1][i]==stone && array[2][i]==stone)   then
        ret = stone
      end
    end
   
    if (array[0][0]==stone && array[1][1]==stone && array[2][2]==stone) ||
       (array[0][2]==stone && array[1][1]==stone && array[2][0]==stone)   then
      ret = stone
    end
  end
  return ret
end

loop_max = ARGV[0].to_i
#p "loop max=" + loop_max.to_s
cell_array = [] 
stone_array = [] 

loop_cnt = 0
until loop_cnt >= loop_max do
  cell_array = Array.new(9)
  stone_array = Array.new(3).map { Array.new(3, 2) }
  9.times do |num|
    cell_array[num] = num
  end

  i = 10
  history = []
  9.times do |num|
    #p i
    rnd = rand(i) - 1
    if num % 2 == 0
      stone_array[cell_array[rnd].divmod(3)[0]][cell_array[rnd].divmod(3)[1]] = 0
    else
      stone_array[cell_array[rnd].divmod(3)[0]][cell_array[rnd].divmod(3)[1]] = 1
    end
    history.push(cell_array[rnd])
    #show_board(stone_array)
    ret = judge(stone_array)
    if ret == 0 then
      history.push("win")    # "O" is winner.
      break
    elsif ret == 1 then
      history.push("lose")   # "O" is loser.
      break
    end
    
    cell_array.delete_at(rnd)

    i -= 1
  end
  p history.join(",")
  loop_cnt += 1
end
$ ruby tic_tac_toe.rb 500 | tee tic-tac-toe_records.log
"6,8,3,4,2,0,lose"
"7,1,4,5,0,2,8,win"
"6,2,3,0,5,8,1,7,4,win"
"3,8,4,2,6,5,lose"
"1,8,2,7,3,0,6,4,lose"
"8,0,3,6,7,4,1,2,lose"
"6,8,3,5,2,7,4,win"
"2,1,7,4,3,5,8,6,0"
"4,8,6,7,1,3,2,win"
"6,1,3,0,8,7,5,4,lose"
"8,2,7,1,4,3,0,win"
"8,6,1,2,7,0,3,4,lose"
"4,3,8,1,2,6,7,0,lose"
"8,6,3,4,1,5,7,2,lose"
"1,2,0,4,7,8,5,6,lose"
"0,5,2,3,6,7,8,4,lose"
"7,1,2,6,4,5,0,3,8,win"
"2,1,0,8,3,5,7,4,6,win"
"2,0,8,5,6,7,4,win"
...

Ich werde diese Score-Daten in CSV verarbeiten, damit sie leicht als Eingabe verwendet werden können. Dieses Mal werden nur diejenigen extrahiert, die der zweite Angriff gewinnt, um eine KI zu erstellen, die über den zweiten Angriff entscheidet.

$ awk '{gsub("\"","");print $0;}' tic-tac-toe_records.log | grep lose | tee tic-tac-toe_records_lose.csv

Nach der Verarbeitung wird es so sein.

tic-tac-toe_records_lose.csv


6,8,3,4,2,0,lose
3,8,4,2,6,5,lose
1,8,2,7,3,0,6,4,lose
8,0,3,6,7,4,1,2,lose
...

Jetzt können Sie loslegen.

MLP-Modell mit pylearn2

Zunächst wird der Quellcode angezeigt.

tic_tac_toe.py


#!/usr/bin/env python
# -*- cording: utf-8 -*-

import theano
from pylearn2.models import mlp
from pylearn2.training_algorithms import sgd
from pylearn2.termination_criteria import EpochCounter
from pylearn2.datasets.dense_design_matrix import DenseDesignMatrix
import numpy as np
import csv

class TicTacToe(DenseDesignMatrix):
    def __init__(self):
        X = []
        y = []
        X_temp = [0,0,0,0,0,0,0,0,0]  # 3x3 board
        y_temp = [0,0,0,0,0,0,0,0,0]  # 3x3 board

        # (1)
        self.class_names = ['0', '3']
        f = open("tic-tac-toe_records_lose.csv", "r")
        reader = csv.reader(f)

        # (2)
        for row in reader:
            for i, cell_index in enumerate(row):
                if cell_index == "win" or cell_index == "lose":
                    X_temp = [0,0,0,0,0,0,0,0,0]
                elif i % 2 == 0:
                    temp = []
                    X_temp[int(cell_index)] = 1
                    for x in X_temp:
                        temp.append(x)

                    #print "  temp = " + str(temp)
                    X.append(temp)
                else:
                    X_temp[int(cell_index)] = 2
                    y_temp[int(cell_index)] = 3
                    #print "y_temp = " + str(y_temp)
                    y.append(y_temp)
                    y_temp = [0,0,0,0,0,0,0,0,0]

        X = np.array(X)
        y = np.array(y)
        super(TicTacToe, self).__init__(X=X, y=y)

# (3)
data_set = TicTacToe()
h0 = mlp.Sigmoid(layer_name='h0', dim=9, irange=.1, init_bias=1.)
out = mlp.Softmax(layer_name='out', n_classes=9, irange=0.)
trainer = sgd.SGD(learning_rate=.05, batch_size=200, termination_criterion=EpochCounter(5000))
layers = [h0, out]

ann = mlp.MLP(layers, nvis=9)
trainer.setup(ann, data_set)

# (4)
while True:
    trainer.train(dataset=data_set)
    ann.monitor.report_epoch()
    ann.monitor()
    if trainer.continue_learning(ann) == False:
        break

# (5)-1
next_move = [0,0,0,0,0,0,0,0,0]
inputs = np.array([[0,0,1,0,0,0,0,0,0]])
output = ann.fprop(theano.shared(inputs, name='inputs')).eval()
print output[0]
for i in range(0,9):
    if max(output[0]) == output[0][i]:
        next_move[i] = 3

print next_move

# (5)-2
next_move = [0,0,0,0,0,0,0,0,0]
inputs = np.array([[1,0,2,1,0,0,0,1,2]])
output = ann.fprop(theano.shared(inputs, name='inputs')).eval()
print output[0]
for i in range(0,9):
    if max(output[0]) == output[0][i]:
        next_move[i] = 3

print next_move

Ich werde ein wenig erklären. Bitte lesen Sie es in Übereinstimmung mit (1), (2) ... im Code. Als Prämisse ist 〇 "1", × ist "2" und ein Quadrat mit nichts ist "0". (Es unterscheidet sich von dem Ruby-Code, der zum Erstellen der Lehrdaten verwendet wird. Entschuldigen Sie das Unverständnis.)

(1) Einstellen des Ausgabewerts Der Wert, der als Ausgabewert verwendet werden soll. Ich verwende 0,1,2 für die Eingabe, also habe ich beschlossen, 3 für die Ausgabe zu verwenden. (2) Umwandlung von Schach Entspricht der gelesenen Schachpartitur der Eingabe und Ausgabe des neuronalen Netzes. Wenn die Eingabe der Punktzahl beispielsweise "6,8,3,4,2,0, verlieren" lautet, ist die Erweiterung wie folgt.

Musik: 6,8,3,4,2,0,lose
X[n]   = [0,0,0,0,0,0,1,0,0]  : "6"In der Position von"〇"Das ist"1"Eingeben
y[n]   = [0,0,0,0,0,0,0,0,3]  :Nächster Zug"8"In der Position von"×"Damit"8"In der Position von"3"Ausgänge
X[n+1] = [0,0,0,1,0,0,1,0,2]  : "8"In der Position von"×"Das ist"2",Nächster"3"In der Position von"〇"Das ist"1"Eingeben
y[n+1] = [0,0,0,0,3,0,0,0,0]  :Nächster Zug"4"In der Position von"×"Damit"4"In der Position von"3"Ausgänge
X[n+2] = [0,0,1,1,2,0,1,0,2]  : "4"In der Position von"×"Das ist"2",Nächster"2"In der Position von"〇"Das ist"1"Eingeben
y[n+2] = [3,0,0,0,0,0,0,0,0]  :Nächster Zug"0"In der Position von"×"Damit"0"In der Position von"3"Ausgänge

(3) Beschreibung der MLP-Struktur Die verborgene Schicht h0 wird mit dim (Dimension) = 9 (Anzahl der Zellen) unter Verwendung der Sigmoidfunktion als Aktivierungsfunktion erzeugt. irange und init_bias sind geeignet. Die Ausgabeebene wird mit n_classes (Anzahl der Klassifizierungen) = 9 (Anzahl der Zellen) unter Verwendung der Softmax-Funktion als Aktivierungsfunktion generiert. irange ist geeignet. [Probabilistische Gradientenabstiegsmethode](https://ja.wikipedia.org/wiki/%E7%A2%BA%E7%8E%87%E7%9A%84%E5%8B%BE%E9%85%8D Trainiere mit% E9% 99% 8D% E4% B8% 8B% E6% B3% 95). learning_rate und batch_size sind angemessen. termination_criterion gibt an, wann das Training beendet werden soll.

ann = mlp.MLP(layers, nvis=9)

Das Obige gibt die Struktur von MLP an. nvis hat eine Eingabedimension = 9 (Anzahl der Quadrate). (4) Schulung Es ist eine Trainingsschleife. Wir haben auch einen Monitor des Fortschritts. (5) Test Testen Sie, wie die Ausgabe für einige Eingaben aussieht. Der Teil mit der höchsten Wahrscheinlichkeit (Ausgabe [0]) von 9 Klassen ist der nächste Zug (next_move).

Die Ausgabe bei Ausführung des Programms ist wie folgt.

$ python tic_tac_toe.py
Parameter and initial learning rate summary:
	h0_W: 0.05
	h0_b: 0.05
	softmax_b: 0.05
	softmax_W: 0.05
Compiling sgd_update...
Compiling sgd_update done. Time elapsed: 0.203131 seconds
compiling begin_record_entry...
compiling begin_record_entry done. Time elapsed: 0.003911 seconds
Monitored channels: 
Compiling accum...
Compiling accum done. Time elapsed: 0.000039 seconds
Monitoring step:
	Epochs seen: 1
	Batches seen: 3
	Examples seen: 542
Monitoring step:
	Epochs seen: 2
	Batches seen: 6
	Examples seen: 1084

...

Monitoring step:
	Epochs seen: 5000
	Batches seen: 15000
	Examples seen: 2710000
Monitoring step:
	Epochs seen: 5001
	Batches seen: 15003
	Examples seen: 2710542
[ 0.07985083  0.10700001  0.00255253  0.15781951  0.08504663  0.16470689
  0.11459433  0.12293593  0.16549335]
[0, 0, 0, 0, 0, 0, 0, 0, 3]
[  2.56981722e-03   1.25923571e-01   2.05250923e-04   6.14268028e-04
   1.85819252e-02   2.43921569e-02   8.27328217e-01   3.84348076e-04
   4.45556802e-07]
[0, 0, 0, 0, 0, 0, 3, 0, 0]

Von Oben, Wenn die Eingabe [0,0,1,0,0,0,0,0,0] ist, ist der nächste Zug [0,0,0,0,0,0,0,0,3]. Mit anderen Worten, KI-Treffer wie in der folgenden Abbildung gezeigt. example01.png

Wenn die Eingabe [1,0,2,1,0,0,0,1,2] ist, ist der nächste Zug [0,0,0,0,0,0,3,0,0]. Mit anderen Worten, KI-Treffer wie in der folgenden Abbildung gezeigt. example02.png

Wenn Sie "X" an der Position "5" drücken, gewinnen Sie und sind fertig, aber Sie werden die Reichweite von "O" stoppen. Nun, es ist in Ordnung für die Tatsache, dass es auf einer zufälligen Punktzahl basiert.

Es ist ein bisschen nervig, weil ich jedes Mal mit dem Quellcode herumspielen muss, aber ich habe den nächsten Schritt für willkürliche Eingaben.

In Zukunft werde ich es basierend auf den Ergebnissen eines Trainings leicht machen, den nächsten Schritt für jede Eingabe zu bekommen und ihn in einem Drei-Augen-Spiel umzusetzen. Zunächst muss ich ein Spielprogramm hintereinander erstellen. **Ich machte. Bitte lesen Sie den folgenden Artikel. ** **. Lassen Sie uns mit Pylearn2 eine KI dritter Ordnung erstellen - Modell speichern und laden-

Referenz

http://www.arngarden.com/2013/07/29/neural-network-example-using-pylearn2/ [http://sinhrks.hatenablog.com/entry/2014/11/30/085119] (http://sinhrks.hatenablog.com/entry/2014/11/30/085119) https://www.safaribooksonline.com/blog/2014/02/10/pylearn2-regression-3rd-party-data/

Recommended Posts

Machen wir mit Pylearn 2 eine dreiäugige KI
Lassen Sie uns mit Pylearn2 eine Drei-Wege-KI erstellen - Modell speichern und laden -
Lassen Sie uns eine GUI mit Python erstellen.
Machen wir einen Blockbruch mit wxPython
Machen wir Othellos KI mit Chainer-Teil 1-
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Machen wir Othellos KI mit Chainer-Teil 2-
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie ein Webframework mit Python! (1)
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Machen wir einen Discord Bot.
[Lass uns mit Python spielen] Ein Haushaltsbuch erstellen
Machen wir Othello mit wxPython
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Erstelle Puyopuyo AI mit Python
Machen Sie eine Lotterie mit Python
Versuchen Sie, mit Rhinoceros / Grasshopper / GHPython ein sphärisches Gitter zu erstellen
[Super einfach] Machen wir einen LINE BOT mit Python.
Machen Sie ein Feuer mit kdeplot
Lassen Sie uns mit Python einen Web-Socket-Client erstellen. (Zugriffstoken-Authentifizierung)
Lassen Sie uns ein Diagramm erstellen, auf das mit IPython geklickt werden kann
Machen wir eine Remote-Rumba [Hardware]
Lassen Sie uns eine Remote-Rumba erstellen [Software]
Machen Sie einen Sound mit Jupyter Notebook
Machen wir einen Spot Sale Service 2
Machen wir einen Spot Sale Service 1
Erstellen Sie ein Empfehlungssystem mit Python
Machen Sie einen Filter mit einer Django-Vorlage
Erstellen Sie mit PySide einen Modelliterator
Machen Sie eine schöne Grafik mit Plotly
Machen wir einen Spot Sale Service 3
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 1 erstellen
Machen wir einen Fahrradcomputer mit Raspberry Pi Zero (W, WH)
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 2 erstellen
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 3 erstellen
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 4 erstellen
Lassen Sie uns einen Web-Chat mit WebSocket mit AWS serverless (Python) durchführen!
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Erstellen wir mit Python eine kostenlose Gruppe
Machen Sie einen seltenen Gacha-Simulator mit Flask
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
[Einfach] AI automatische Erkennung mit einer Webkamera!
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Lassen Sie uns mit Docker eine dynamische Site kratzen
Machen Sie ein Zeichnungsquiz mit kivy + PyTorch
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
[Python] Lassen Sie uns matplotlib mit Japanisch kompatibel machen
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Machen Sie Ja Nein Popup mit Kivy
Lassen Sie uns mit flask-babel eine mehrsprachige Site erstellen
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Lassen Sie uns eine Kombinationsberechnung mit Python durchführen
Erstellen Sie eine Desktop-App mit Python mit Electron
Lassen Sie uns ein Backend-Plug-In für Errbot erstellen