Klicken Sie hier für Keras 'Lotterie ab dem Nichts [http://qiita.com/Ishotihadus/items/6ecf5684c2cbaaa6a5ef]
Letztes Mal hat einen groben Datensatz erstellt und grob trainiert. Früher habe ich ein einfaches sequentielles Modell verwendet, aber ich habe die funktionale API verwendet, die mir ein flexibleres und vielschichtigeres Gefühl gibt.
Die Eingabe hat 5 Dimensionen und jedes Element ist größer oder gleich 0 und kleiner als 1. Die Ausgabe ist eindimensional, -1, wenn die Summe der Eingabeelemente 2,5 oder weniger beträgt, 1, wenn sie größer als 2,5 ist. Es wurde eine sogenannte "Zwei-Klassen-Klassifikation" durchgeführt.
Die Eingabeebene hat 5 Dimensionen. Die verborgene Schicht ist 20-dimensional und die Aktivierungsfunktion ist tanh. Die Ausgabeschicht ist eindimensional und die Aktivierungsfunktion ist ebenfalls tanh.
Die Verlustfunktion während des Trainings verwendete Scharnierverlust.
Bis jetzt habe ich in der Atmosphäre gelernt und in der Atmosphäre geschätzt. (!)
Die Implementierung der Lernmethode ist jedoch etwas mühsam. Es ist wahr, dass das Berechnen und Kursivieren des Differentials implementiert werden sollte, aber da dies ein Gott namens Keras ist (eigentlich TensorFlow oder Theano Gott im Inneren), lassen Sie es uns für einen Moment ignorieren.
Das Ziel dieser Zeit ist es, zumindest aus den Parametern abschätzen zu können.
Wie ich schon oft sage, führt jede Schicht drei Operationen aus: "Gewichtung der Eingabe", "Vorspannung" und "Anwenden einer Aktivierungsfunktion (falls vorhanden)". Lassen Sie uns diese 3 Operationen von Hand ausführen und überprüfen, ob sie ordnungsgemäß funktionieren.
Wenn das Modell zu groß ist, ist die manuelle Berechnung mühsam. Machen Sie es daher kleiner. Die Eingabe ist zweidimensional (jedes Element ist 0 oder mehr und kleiner als 1), und die Ausgabe ist -1, wenn die Summe der Eingaben 0,5 oder weniger beträgt, und 1, wenn sie größer als 0,5 ist. Die verborgene Ebene hat 5 Dimensionen und die anderen Bedingungen sind dieselben wie zuvor.
Dieses Mal möchte ich den Wert wissen, daher ist es besser, dies in einer interaktiven Umgebung zu tun.
Im Gegensatz zum letzten Mal wird die Ebene so behandelt, wie sie ist, nicht der Tensor (der Zustand, in dem die Eingabe für die Ebene erfolgt). Es gibt den Tensor zurück, wenn Sie ihn in das Modell eingeben.
import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
data = np.random.rand(250,2)
labels = (np.sum(data, axis=1) > 0.5) * 2 - 1
input = Input(shape=(2,))
hidden = Dense(5, activation='tanh')
output = Dense(1, activation='tanh')
model = Model(input=input, output=output(hidden(input)))
model.compile('adam', 'hinge', metrics=['accuracy'])
model.fit(data, labels, nb_epoch=150, validation_split=0.2)
Lassen Sie uns jetzt das Gewicht wissen. Gewichte können durch "get_weights ()" auf den Ebenen erhalten werden.
hidden.get_weights()
Die Ausgabe sieht folgendermaßen aus: Das erste Array ist der Gewichtsvektor, das zweite ist die Vorspannung.
[array([[-1.08239257, 0.32482854, 0.95010394, 0.00501535, -0.47380614],
[-0.56682748, 1.15749049, 0.91618514, 0.37518814, -0.67639047]], dtype=float32),
array([-0.18290569, 0.21453567, 0.01353107, 0.27740911, 0.09604219], dtype=float32)]
Das gleiche Gewicht wird für die "Ausgabe" wie folgt erhalten.
[array([[-0.8775745 ],
[ 1.09351909],
[ 0.21981503],
[ 1.31380796],
[-0.10301871]], dtype=float32),
array([ 0.27410847], dtype=float32)]
Lassen Sie uns nun tatsächlich rechnen.
Die Eingabe ist $ \ boldsymbol {x} $ (zweidimensionaler vertikaler Vektor).
Zu diesem Zeitpunkt ist aus der obigen Ausgabe die Ausgabe $ \ boldsymbol {h} $ der verborgenen Ebene wie folgt (tanh wird auf das Element angewendet, $ {} ^ \ top $ ist die Translokation).
\boldsymbol{h} = \tanh\left(
\begin{bmatrix}
-1.08239257 & 0.32482854 & 0.95010394 & 0.00501535 & -0.47380614 \\
-0.56682748 & 1.15749049 & 0.91618514 & 0.37518814 & -0.67639047
\end{bmatrix}^\top\boldsymbol{x} + \begin{bmatrix}
-0.18290569 \\ 0.21453567 \\ 0.01353107 \\ 0.27740911 \\ 0.09604219
\end{bmatrix}\right)
Und die Ausgabe $ \ boldsymbol {y} $ der Ausgabeebene kann wie folgt berechnet werden.
\boldsymbol{y} = \tanh\left(
\begin{bmatrix}
-0.8775745 \\ 1.09351909 \\ 0.21981503 \\ 1.31380796 \\ -0.10301871
\end{bmatrix}^\top\boldsymbol{h} + 0.27410847\right)
Lassen Sie uns darauf basierend manuell berechnen. Hier
\boldsymbol{x} = \begin{bmatrix}0.3 \\ 0.1\end{bmatrix}
Versuchen Sie es als. Reduzieren Sie von hier aus die Anzahl der Stellen nach dem Dezimalpunkt.
\begin{array}{rl}
\boldsymbol{h} &= \tanh\left(
\begin{bmatrix}
-1.0824 & 0.3248 & 0.9501 & 0.0050 & -0.4738 \\
-0.5668 & 1.1575 & 0.9162 & 0.3752 & -0.6764
\end{bmatrix}^\top\begin{bmatrix}0.3 \\ 0.1\end{bmatrix} + \begin{bmatrix}
-0.1829 \\ 0.2145 \\ 0.0135 \\ 0.2774 \\ 0.0960
\end{bmatrix}\right) \\
&= \tanh\left(
\begin{bmatrix}-0.3814 \\ 0.2132 \\ 0.3766 \\ 0.0390 \\-0.2098\end{bmatrix} + \begin{bmatrix}
-0.1829 \\ 0.2145 \\ 0.0135 \\ 0.2774 \\ 0.0960
\end{bmatrix}
\right) \\
&= \begin{bmatrix}-0.5112 \\ 0.4034 \\ 0.3715 \\ 0.3063 \\ -0.1133\end{bmatrix}
\\\\
\boldsymbol{y} &= \tanh\left(
\begin{bmatrix}
-0.8776 \\ 1.0935 \\ 0.2198 \\ 1.3138 \\ -0.1030
\end{bmatrix}^\top
\begin{bmatrix}-0.5112 \\ 0.4034 \\ 0.3715 \\ 0.3063 \\ -0.1133\end{bmatrix}
+ 0.2741\right) \\
&= \tanh\left(1.3855 + 0.2741\right) \\
&= 0.9302
\end{array}
Hmm? 0,3 + 0,1 ist 0,5 oder weniger, aber es ist ein positiver Wert ...
model.predict(np.array([[0.3, 0.1]]))
Ergebnis ist
array([[ 0.93015909]], dtype=float32)
Es stellt sich also heraus, dass dieselbe Schätzung von Hand berechnet werden kann (obwohl die Schätzung falsch war).
Es stellte sich heraus, dass ich nicht richtig lernen konnte, weil die Anzahl der Dimensionen gering und das Modell geeignet war ... (ca. 85%).
Es scheint, dass die Berechnung vorerst durchgeführt wurde. Nehmen wir also an, es ist in Ordnung.
Wenn Sie ein Gewicht machen können, können Sie ein Modell machen, das definitiv richtig antwortet, also machen wir es.
Sie müssen nur beide Eingaben mit einer Gewichtung von 1 addieren und -0,5 subtrahieren. Tun Sie dies also mit set_weights ()
.
import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
data = np.random.rand(250,2)
labels = (np.sum(data, axis=1) > 0.5) * 2 - 1
input = Input(shape=(2,))
output = Dense(1, activation='tanh')
model = Model(input=input, output=output(input))
model.compile('adam', 'hinge', metrics=['accuracy'])
output.set_weights([np.array([[1.0], [1.0]]), np.array([-0.5])])
Furchtbar. Lass uns damit rennen.
test = np.random.rand(200, 2)
predict = np.sign(model.predict(test).flatten())
real = (np.sum(test, axis=1) > 0.5) * 2 - 1
print(sum(predict == real) / 200.0)
Nein. 100%.
Nächstes Mal werden wir mit einem etwas größeren Datensatz arbeiten.
Recommended Posts