[PYTHON] Keras ab nichts 2.

Klicken Sie hier für Keras 'Lotterie ab dem Nichts [http://qiita.com/Ishotihadus/items/6ecf5684c2cbaaa6a5ef]

Letzte Überprüfung

Letztes Mal hat einen groben Datensatz erstellt und grob trainiert.

Die Eingabe ist ein 5-dimensionaler Vektor mit Elementen 0 oder mehr und weniger als 1. Die Ausgabe ist 0, wenn die Summe der Elemente des Vektors 2,5 oder weniger beträgt, und 1, wenn sie größer als 2,5 ist. Es erfolgt eine sogenannte "Zwei-Klassen-Klassifikation".

Der Datensatz wurde wie folgt erstellt. Die Ausgabe ist ein eindimensionaler zweidimensionaler Vektor, so dass das neuronale Netz leicht gehandhabt werden kann.

data = np.random.rand(250,5)
labels = np_utils.to_categorical((np.sum(data, axis=1) > 2.5) * 1)

Bei der Herstellung des Modells habe ich Folgendes getan. Zwei Schichten überlappten sich (ohne Eingabe). Die Eingabe ist 5 Dimensionen, die verborgene Ebene zwischen ihnen ist 20 Dimensionen und die Ausgabe ist 2 Dimensionen.

model = Sequential()
model.add(Dense(20, input_dim=5, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile('rmsprop', 'categorical_crossentropy', metrics=['accuracy'])

Aktivierungsfunktion

Im neuronalen Netz nehmen wir die gewichtete Summe der Werte, die aus der vorherigen Schicht stammen. Fügen Sie die Bias-Konstante hinzu und wenden Sie die Funktion am Ende an. Die anzuwendende Funktion ist die Aktivierungsfunktion. Sie können eine Aktivierungsfunktion auch mithilfe einer Ebene namens "Aktivierung" anwenden. Sie können dies verwenden, um Parameter anzugeben, müssen diese jedoch nicht verwenden.

Die Vorspannung wird zu einem Schwellenwert, wenn sie in Bezug auf die Bedeutung negativ ist (sie wird nicht ausgelöst, wenn dieser Wert nicht überschritten wird!). Übrigens kann die Vorspannung immer 0 sein (geben Sie "Vorspannung = Falsch" an).

Arten von Aktivierungsfunktionen

Ich habe versucht, bis zu einem gewissen Grad zusammenzufassen. Es ist schwer zu sagen, was man wählen soll. Ich finde, dass Tanh und Relu insgesamt beliebt sind.

Die folgenden beiden nehmen 1 von -1. Tanh ist steiler. Wenn der Eingang 0 ist, arbeitet der Ausgang auch linear um 0,0, aber wenn der Absolutwert groß wird, bleibt er bei -1 oder 1.

--Softsign

Die folgenden zwei nehmen nur 0 oder mehr und 1 oder weniger. Hartes Sigma ist steiler und bricht. Das Sigma ist glatt. Wenn der Eingang 0 ist, ist der Ausgang 0,5. Wie oben arbeitet es linear um 0, bleibt aber bei steigendem Absolutwert bei 0 oder 1.

Die folgenden zwei Werte haben den Wert 0 oder mehr. Auch hier ist die Rampenfunktion steiler und bricht. Soft Plus ist (ziemlich) glatt. Wenn der Wert bis zu einem gewissen Grad zunimmt (von Null aus gesehen), wird er linear, und wenn er abnimmt, wird er nahe Null. relu kann auch einen Koeffizientenwert von weniger als 0 annehmen.

--Softplus

Alles was bleibt ist die lineare Funktion und Softmax.

Für die lineare multiplizieren Sie einfach mit einem Koeffizienten, um eine Vorspannung hinzuzufügen (werden der Koeffizient und die Vorspannung gelernt?). Ich halte es jedoch nicht für sinnvoll, dass die Aktivierungsfunktion linear ist, daher verwende ich möglicherweise nicht so viel.

Softmax multipliziert alle von dieser Ebene ausgegebenen Werte mit einer Exponentialfunktion (dh macht sie alle positiv) und normalisiert die Summe auf 1. Nachdem diese Funktion angewendet wurde, ist die Summe 1 und alle Werte sind positiv, sodass sie als Wahrscheinlichkeit beurteilt werden kann. Deshalb habe ich im vorherigen Beispiel am Ende Softmax verwendet.

Optimierungsmethode (Optimierer)

Das erste Argument von compile. Es gibt verschiedene Methoden, aber wie man herausfindet, welche Parameter verwendet werden sollten, um den Fehler zu reduzieren. Da es nicht möglich ist, offensichtliche Parameter (wie die Methode der kleinsten Quadrate) intuitiv zu berechnen, möchte ich die Iterationen drehen, um den Fehler nacheinander zu reduzieren.

Siehe Dies.

Sie können sgd, rsmprop, adagrad, adadelta, adam, adamax, nadam auswählen. Insgesamt scheint es eine verbreitete Überzeugung zu sein, dass Sie sich für Adam entscheiden sollten (da es ohne große Berücksichtigung von Parametern recht gut funktioniert). RNN (Retroactive Neural Network) lässt sich nur langsam optimieren, daher scheint es besser, rmsprop zu verwenden.

Letztendlich sollen alle Methoden die Differenzierung (Gradient) schrittweise reduzieren. SGD ist nur der Name der "probabilistischen Gradientenabstiegsmethode". Der Grund, warum ich das Differential verkleinern möchte, ist, dass je kleiner der Gradient (kleiner das Differential), desto näher am Extremwert (Maximum oder Minimum) liegt. Wenn Sie die Differenz der Fehlerfunktion nach und nach verringern, nähert sich der Wert der Fehlerfunktion automatisch dem Minimum (dies hängt natürlich von der Form der Funktion ab). Die Effizienz der Annäherung ist jedoch je nach Methode unterschiedlich und geht manchmal zu weit. Es fällt auch in eine lokale Lösung, das heißt: "Es mag minimal sein, aber insgesamt ist es überhaupt nicht gut." Dies sind Methoden, die unter Berücksichtigung solcher Aspekte verkleinert werden können.

Zielfunktion

Das zweite Argument von "kompilieren". Die Funktion, die Sie verkleinern möchten. Es hat fast die gleiche Bedeutung wie Verlust. Ich habe darüber gesprochen, "welche Optimierungsmethode ich den Fehler reduzieren möchte", aber dies ist "welche Kriterien zur Bestimmung des Fehlers verwendet werden sollten". Die "Differenz" bedeutet hier die Differenz zwischen dem aus dem aktuellen neuronalen Netz geschätzten Wert und dem korrekten Antwortwert.

Sie können das unten stehende auswählen, aber egal welches Sie auswählen, es ist immer noch "groß genug, um unvorhersehbar zu sein".

Der Scharnierverlust ist eine Funktion, die 0 für 1 oder mehr und $ 1-x $ für 1 oder weniger für den Wert ist, der durch Multiplizieren des geschätzten Werts und des korrekten Antwortwerts erhalten wird (der Verlust ist gering, wenn die Vorzeichen gleich sind).

Kreuzentropie ist (fast) die Menge an gegenseitiger Information. Irgendwie kann man sehen, dass die Kategorisierung umso besser ist, je kleiner die Größe ist.

Die KL-Divergenz repräsentiert im Allgemeinen den Abstand der Wahrscheinlichkeitsverteilung. Der KL-Divergenzstandard schafft eine Atmosphäre zur Schätzung der Wahrscheinlichkeitsverteilung.

Die Kosinusähnlichkeit (negativ) ist der Grad der Differenz in der Richtung des Vektors. Lernen Sie, dass die Richtungen der Vektoren nahe beieinander liegen. Daher wird seine Größe ignoriert und gelernt.

Versuchen Sie, die Zielfunktion anzuordnen

Lassen Sie uns einige Optionen in demselben Datensatz und in derselben Situation anordnen.

Diesmal ist die Ausgabe eindimensional, -1 oder 1 (-1, wenn die Summe 2,5 oder weniger beträgt, 1, wenn sie größer als 2,5 ist). Da das Vorzeichen wichtig ist, ist der Verlust der Scharnierverlust und die Ausgangsaktivierungsfunktion ist tanh. Ich habe die Optimierungsfunktion auf Adam gesetzt.

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation

data = np.random.rand(250,5)
labels = (np.sum(data, axis=1) > 2.5) * 2 - 1
model = Sequential([Dense(20, input_dim=5, activation='tanh'), Dense(1, activation='tanh')])
model.compile('adam', 'hinge', metrics=['accuracy'])
model.fit(data, labels, nb_epoch=150, validation_split=0.2)

test = np.random.rand(200, 5)
predict = np.sign(model.predict(test).flatten())
real = (np.sum(test, axis=1) > 2.5) * 2 - 1
print(sum(predict == real) / 200.0)

Das Lernen dauert etwas, aber die Genauigkeit scheint angemessen zu sein. Nun, weil der Datensatz das ist.

Recommended Posts

Keras ab nichts 2.
Keras aus dem Nichts
Keras ab dem 5. Platz
Keras ausgehend von nichts 1 ..
Keras ab nichts 4.
Keras ab dem 3. Platz
Django von vorne anfangen (Teil: 2)
Django von vorne anfangen (Teil: 1)
Fehlerbehebungstechniken aus (fast) nichts
[Einführung] Von der Installation von Kibana bis zum Start
Code Wars Kata ab Null