Hallo zusammen
Vor einiger Zeit habe ich versucht, ein neuronales Netzwerk mit PHP zu erstellen (http://qiita.com/niisan-tokyo/items/2182c9adccf54387c367), um zu überprüfen, was ich tat. Es ist jedoch langsam und das System ist nicht sehr gut, da es derzeit keine ausgeklügelte Berechnungsmethode gibt, die an verschiedenen Stellen verifiziert und praktiziert wurde. Dieses Mal werde ich Imadokis Mechanismus für maschinelles Lernen unter Verwendung eines Frameworks namens Keras ausprobieren.
Keras
Keras ist eine neuronale Netzwerkbibliothek, die auf TensorFlow ausgeführt wird und in Python geschrieben ist. Aus dem Gefühl heraus, es zu benutzen, dachte ich, ich könnte ein Netzwerk schreiben, indem ich es meiner Intuition überlasse. Als ich TensorFlow raw schrieb, war es mühsam, verschiedene Parameter einzustellen, aber Dieser Bereich ist auch einfacher geworden.
Keras on Docker
Oh, da ist doch das Bild mit Keras https://hub.docker.com/r/gw000/keras/
Jetzt können Sie Keras ausprobieren, ohne Ihre Umgebung zu verschmutzen.
Die Problemeinstellung ist das Donut-Typ-Klassifizierungsproblem, das ich zuvor gemacht habe.
{f(x, y) = \left\{
\begin{array}{1}
1, (1 < x^2 + y^2 < 4)\\
0, ( \rm{otherwise} )
\end{array}
\right.
}
Nachdem Sie entschieden haben, was Sie tun möchten, beginnen wir mit der Implementierung
Machen Sie es zuerst aus dem Lernmechanismus.
learn.py
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np
import random
import math
def double_circle():
x = random.uniform(-2, 2)
y = random.uniform(-2, 2)
sample = (x,y)
norm = math.sqrt(x * x + y * y)
if norm > 1 and norm < 2:
label = 1
else:
label = 0
return (sample, label)
# Model Definition
model = Sequential()
model.add(Dense(32, input_dim=2))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
data = []
labels = []
for num in range(1024):
(sample, label) = double_circle()
data.append(sample)
labels.append(label)
model.fit(np.array(data), np.array(labels), nb_epoch=100, batch_size=32)
model.save('/srv/model/double_circle')
Verwenden Sie die Funktion double_circle
, um zufällige Koordinaten auszuwählen und eine Beschriftung zurückzugeben, die bestimmt, ob sich der Punkt innerhalb einer Donut-Figur befindet.
Fügen Sie dann den Koordinatensatz und die Beschriftung in die Liste ein.
Als nächstes werden wir ein Modell erstellen und Keras wird ein Modell mit dem Bild des Stapelns jeder Schicht des neuronalen Netzwerks bilden.
model.add(Dense(32, input_dim=2))
model.add(Dense(64, activation='relu'))
Zum Beispiel definieren wir hier die erste und zweite Schicht. Die erste Schicht kennt die Eingabedimension nicht, daher ist dies klar angegeben. Da der Koordinatenpunkt diesmal die Eingabe ist, geben Sie "input_dim = 2" ein. Da das erste Argument der ersten Ebene die Ausgabedimension ist, benötigt die zweite Ebene keine Eingabedimension. Außerdem wird in der Aktivierungsfunktion der zweiten Ebene "Aktivierung =" Relu "gesetzt (wenn keine Einstellung vorhanden ist, wird sie so ausgegeben, wie sie ist). Sie können Ebenen so stapeln, wie Sie möchten.
$ docker run --rm -v `pwd`:/srv/ gw000/keras python learn.py
Lassen Sie uns den Docker-Container von Keras ausführen und lernen. Auf meinem Mac dauerte es ungefähr 5 Sekunden. Im Modellverzeichnis wurde eine Modelldatei erstellt.
Mal sehen, wie gut das generierte Modell funktioniert.
use.py
from keras.models import load_model
import numpy as np
model = load_model('/srv/ai/model/double_circle')
def check(x):
data = np.array([x])
pred = model.predict(np.array([x]))
#print pred
if pred > 0.5:
return 1
else:
return 0
for y in range(20):
labels = []
for x in range(20):
data = [(x-10.0)/5, (10.0-y)/5]
labels.append(check(data))
print labels
Keras lädt nur das Modell und erstellt das Netzwerk neu, das Sie mit learn gelernt haben. Dieses Skript verwendet das geladene Modell, um zu bestimmen, ob der Bereich von $ -2 <x <2 $, $ -2 <y <2 $ in Schritten von 0,1 innerhalb des angegebenen Bereichs liegt. Wenn Sie dieses ausführen, sieht es so aus.
$ docker run --rm -v `pwd`:/srv/ gw000/keras python use.py
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
[0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
Die runde Form hat sich herausgebildet, daher denke ich nicht, dass es gut läuft.
Nehmen wir etwas mehr Details. Nehmen wir nun Datenpunkte in Schritten von 0,02. Dieses Mal werde ich versuchen, die Koordinatenpunkte auszuspucken, die als im CSV-Format enthalten eingestuft sind
to_csv.py
from keras.models import load_model
import numpy as np
model = load_model('/srv/model/double_circle')
def check(x):
data = np.array([x])
pred = model.predict(np.array([x]))
#print pred
if pred > 0.5:
return 1
else:
return 0
for y in range(100):
for x in range(100):
data = [(x-50.0)/20, (50.0-y)/20]
if check(data) == 1:
print "%f,%f" % (data[0],data[1])
Es wird also wie gewohnt vom Docker verarbeitet.
docker run --rm -v `pwd`:/srv/ gw000/keras python to_csv.py > result.csv
Zeichnen wir das Ergebnis.csv, das herauskam. Nun, es könnte so etwas sein
Um mit Keras anfangen zu können, habe ich vorerst versucht, die zu realisieren, die ich zuvor mit PHP erstellt habe. Es ist einfacher zu verstehen als TensorFlow, wenn Netzwerke und Ebenen erstellt werden.
Diesmal ist es so.
Recommended Posts