[PYTHON] Keras ausgehend von nichts 1 ..

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

Was ist nichts

Keras beginnt ohne Keras zu kennen, sogar das neuronale Netz oder sogar Python. Es wird davon ausgegangen, dass nur Python3 installiert ist (dies hängt von der Umgebung ab, also bitte googeln).

Installieren Sie es zunächst.

$ sudo pip3 install tensorflow keras

Starten Sie dann Python.

$ python3

Ich bin der Meinung, dass der interaktive Typ einfacher ist.

Erstellen Sie ein Array

Arrays werden von NumPy verwaltet. Weil es nicht spät ist.

import numpy as np
array = np.array([0.1,0.2,0.3])

Die Sequenz wurde erstellt. Die erste Zeile lädt die Bibliothek, daher wird sie bei der Verwendung immer benötigt (das ist richtig).

Sie können auch zwei Dimensionen erstellen. Die Zeilenrichtung (horizontale Richtung) in der Matrix ist das innere Array. Wenn unten

\begin{pmatrix}0.1 & 0.2 & 0.3 \\ 0.4 & 0.6 & 0.8\end{pmatrix}

Repräsentiert.

array = np.array([[0.1,0.2,0.3], [0.4,0.6,0.8]])

Die Nullmatrix, die Matrix mit allen Elementen 1 und die Einheitsmatrix sind wie folgt. Sie können die Anzahl der Elemente im Array mit "(a, b, c, ...)" angeben. Taple für Python.

array = np.zeros((2,3))
array = np.ones((3,1))
array = np.identity(5) #Größe ist(5,5)

Lassen Sie uns eine zufällige Matrix erstellen.

array = np.random.rand(3,2) #Gleichmäßige Verteilung von 0 bis weniger als 1
array = np.random.randn(5,4) #Normalverteilung mit Mittelwert 0 und Varianz 1
array = np.random.randint(0, 5, size=(2,3)) #Diskrete Gleichverteilung von 0 bis weniger als 5

Übe so weit.

Erstellen Sie einen Datensatz

Ich möchte lernen, also erstelle ich einfach einen Datensatz.

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

Die Daten in der ersten Zeile sind nur 250 5-dimensionale Daten. Die Beschriftung in der zweiten Zeile ist ein Array, das für jede der 250 Daten eine 5-dimensionale Summe verwendet und 1 ist, wenn sie größer als 2,5 ist (oder andernfalls 0).

Wenn Sie ein geeignetes 5-dimensionales Array eingeben, erstellen wir ein neuronales Netz, das Ihnen 1 sagt, wenn die Summe größer als 2,5 ist.

Formatieren Sie den Datensatz

Es gibt zwei Ausgabeklassen, also möchte ich wirklich, dass es eine heiße ist. Mit anderen Worten, für eine Eingabe (5. Dimension) ist die Ausgabe 2D, und wenn die Summe der Eingaben 2,5 oder weniger beträgt, ist sie "[1,0]", und wenn sie größer als 2,5 ist, ist sie "[0,1]". Deshalb.

Verwenden Sie dazu die Keras-Funktion. Beim Importieren werden Protokolle ausgespuckt, aber Sie sollten sich keine Sorgen machen müssen.

from keras.utils import np_utils
labels = np_utils.to_categorical(labels)

Dies macht "Labels" 250 zweidimensionale Arrays.

Machen Sie ein neuronales Netz

Sequential ist ein einfaches Modell, das nur Ebenen stapelt. Es fühlt sich an, als würde man die Ausgabe der vorherigen Ebene so wie sie ist eingeben. Alle Kanten werden zwischen den Knoten gezeichnet (natürlich kann es herausgezogen, aber weggelassen werden). Betrachten wir es diesmal als eine Zwischenebene (Eingabeebene, versteckte Ebene, Ausgabeebene).

from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential()

Fügen Sie als Nächstes die verborgene Ebene der Eingabeebene ein. Ich werde vorerst eine Ebene namens Dense verwenden. Von jedem der fünf Knoten kommen 20 Pfeile heraus, die anzeigen, dass sich in der nächsten Ebene 20 Knoten befinden. Die Anzahl der Knoten muss (natürlich) mit der Anzahl der Dimensionen der Eingabedaten übereinstimmen.

model.add(Dense(20, input_dim=5))

Als nächstes setzen wir die Aktivierungsfunktion ein. Für jeden der 20 Knoten werden fünf numerische Werte eingegeben, und die gewichtete Summe (+ Vorspannung) der fünf numerischen Werte wird entsprechend genommen und die Funktion wird am Ende angewendet. Die Funktion zu diesem Zeitpunkt ist die Aktivierungsfunktion. Diesmal ist die Rampenfunktion.

model.add(Activation('relu'))

Ich denke, diese beiden sind gleich, auch wenn sie durch "Dicht" (20, input_dim = 5, Aktivierung = "relu") zusammengefasst werden.

Als nächstes kommt die verborgene Ebene - die Ausgabeebene. Die Werte stammen von jedem der 20 Knoten (nachdem die Aktivierungsfunktion angewendet wurde). Die Ausgabe ist zweidimensional und wendet eine gewichtete Summen- und Softmax-Funktion auf die 20 Werte an, die zum Knoten kommen. Die Softmax-Funktion scheint für die Kategorisierung gut zu sein.

model.add(Dense(2, activation='softmax'))

Es sieht aus wie in der Abbildung unten (ich habe 10 gemacht, weil es schwierig ist, 20 Knoten zu schreiben). Es unterscheidet sich vom allgemeinen neuronalen Netzwerkdiagramm, aber ich habe es zur Erklärung angeordnet.

Eigentlich stellen sowohl Dichte als auch Aktivierung Ebenen dar, aber ich hatte das Gefühl, dass es einfacher zu verstehen wäre, wenn ich mir etwas zum Verbinden vorstellen würde.

名称未設定.001.jpeg

kompilieren

Kompilieren Sie vor dem Lernen.

Die erste ist die Optimierungsfunktion, die zweite ist die Verlustfunktion und die dritte ist eine Liste von Metriken. Verwenden Sie vorerst etwas, das üblich ist.

model.compile('rmsprop', 'categorical_crossentropy', metrics=['accuracy'])

Lernen

nb_epoch ist die Häufigkeit. validation_split ist der Prozentsatz der Daten, die für die Validierung verwendet werden (die gesamten Daten werden nicht für das Training verwendet, nur 80% werden für das Training verwendet und die restlichen 20% werden für die Bewertung verwendet).

model.fit(data, labels, nb_epoch=300, validation_split=0.2)

Hast du gelernt?

Vorhersage unbekannter Daten

Versuchen Sie zu sehen, ob es tatsächlich funktioniert.

test = np.random.rand(200, 5)
predict = np.argmax(model.predict(test), axis=1)
real = (np.sum(test, axis=1) > 2.5) * 1
sum(predict == real) / 200.0

Es kann mit einer Genauigkeit von etwa 98% unterschieden werden. Nun, es ist so ein einfacher Zustand. Übrigens, wenn Sie ein Urteil fällen, ohne das Lernen zu drehen, werden es ungefähr 50% sein. Nun, die Chance, es richtig zu treffen, beträgt 50%.

Zusammenfassung dieses Programms

Ebenen werden gleichzeitig mit der Definition des Modells gestapelt.

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

data = np.random.rand(250,5)
labels = np_utils.to_categorical((np.sum(data, axis=1) > 2.5) * 1)
model = Sequential([Dense(20, input_dim=5), Activation('relu'), Dense(2, activation='softmax')])
model.compile('rmsprop', 'categorical_crossentropy', metrics=['accuracy'])
model.fit(data, labels, nb_epoch=300, validation_split=0.2)

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

Recommended Posts

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