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.
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.
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.
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.
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.
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.
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.
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-
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