[PYTHON] [Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]

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.

Problemstellung

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

double_circle.png

Implementierung

Nachdem Sie entschieden haben, was Sie tun möchten, beginnen wir mit der Implementierung

Lernmechanismus

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.

Verwendung des Generierungsmodells

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. result.png Nun, es könnte so etwas sein

Zusammenfassung

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.

Referenz

Offizielle Seite

Recommended Posts

[Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Möchten Sie ein einfaches Klassifizierungsproblem lösen?
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
Ich war frustriert von Kaggle und versuchte, durch Schaben und maschinelles Lernen ein gutes Mietobjekt zu finden
Ich möchte einen maschinellen Lerndienst ohne Programmierung erstellen! Textklassifizierung
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
Ich habe versucht, das Problem der Optimierung der Platzierung virtueller Maschinen (einfache Version) mit blueqat zu lösen
Onkel SE mit verhärtetem Gehirn versuchte, maschinelles Lernen zu studieren
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Passende App Ich habe versucht, Statistiken über starke Leute zu erstellen und ein Modell für maschinelles Lernen zu erstellen
Ich habe versucht, einen einfachen Kredit-Score mit logistischer Regression zu erstellen.
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe HR Tech versucht, eine Expertensuchmaschine zu entwickeln, indem ich interne Besprechungsinformationen maschinell gelernt habe
Ich habe versucht, die Satzklassifizierung durch Self Attention mit PyTorch zu implementieren
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich möchte einen maschinellen Lerndienst ohne Programmierung erstellen! Web-API
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe versucht, "einen genetischen Algorithmus (GA) in Python zu implementieren, um das Problem des Handlungsreisenden (TSP) zu lösen".
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Ich wechselte meinen Job zu einem Ingenieur für maschinelles Lernen bei AtCoder Jobs
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Mayungos Python Learning Episode 6: Ich habe versucht, eine Zeichenkette in eine Zahl umzuwandeln
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, die Anzahl der Mnisten durch unbeaufsichtigtes Lernen zu klassifizieren [PCA, t-SNE, k-means]
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, Oba Hanana und Otani Emiri durch tiefes Lernen zu klassifizieren
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich habe versucht, Optuna die Nummer lösen zu lassen
Ich habe eine Web-API erstellt
Ich habe versucht, TSP mit QAOA zu lösen
Python & maschinelles Lernen Lernnotiz Machine: Maschinelles Lernen durch Rückausbreitung
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, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (5)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (3).
[Python] Deep Learning: Ich habe versucht, Deep Learning (DBN, SDA) ohne Verwendung einer Bibliothek zu implementieren.
Ein Anfänger des maschinellen Lernens versuchte, mit Python ein Vorhersagemodell für Pferderennen zu erstellen
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (1)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (4)
[Azure] Ich habe versucht, eine virtuelle Linux-Maschine mit Azure von Microsoft Learn zu erstellen
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren