Klicken Sie hier für Keras 'Lotterie ab dem Nichts [http://qiita.com/Ishotihadus/items/6ecf5684c2cbaaa6a5ef]
Ab diesem Zeitpunkt ist die Keras-Version 2.0.5, aber es sollte kein Problem sein.
Bis zu vorherigen wurde Keras für die Klassifizierung in zwei Klassen verwendet.
MNIST
Ein Datensatz, von dem jeder gehört hat, der maschinelles Lernen berührt hat. Abkürzung für Modified National Institute of Standards and Technology-Datenbank.
Die Zahlen 0 bis 9 sind auf das Schwarzweißbild geschrieben, und der Zweck besteht darin, zu erkennen, welche Zahl aus dem Bild hervorgeht.
28 x 28 Pixel, 8 Bit monochrom. Natürlich mit einem Etikett. Die Trainingsdaten betragen 60.000 und die Testdaten 10.000.
Die offizielle Website ist hier. Es gibt auch eine Aufzeichnung der Fehlerrate für jede Methode. Wenn ich das betrachte, finde ich, dass das neuronale Netzwerk nicht besonders erstaunlich ist.
Keras hat diesen MNIST standardmäßig verfügbar. Praktisch.
Lassen Sie uns vorerst mit einem normalen Netzwerk lernen.
Die MNIST-Daten von Keras sind eine Ganzzahl zwischen 0 und 255 für jedes Pixel. Dies ist umständlich. Teilen Sie also durch 255,0, um zwischen 0 und 1 zu passen.
Da es sich um zweidimensionale Daten handelt (drei Dimensionen, wenn die Datenrichtung enthalten ist), wird jede durch Umformung zu einer Dimension (zwei Dimensionen, wenn die Datenrichtung enthalten ist) erstellt. Die Umformung ist eine Funktion, die nur die Form des Arrays ändert, während die Reihenfolge und die Gesamtzahl der Daten beibehalten werden.
Das Label ist ein Array von Ganzzahlen von 0 bis 9, aber dies wird auch in ein Hot umgewandelt. Wenn es beispielsweise "7" ist, sollte es "[0,0,0,0,0,0,0,1,0,0]" sein. Beachten Sie, dass "y_test" nicht durchgeführt werden muss und daher weggelassen wird.
Daten können heruntergeladen werden, wenn mnist.load_data ()
ausgeführt wird.
from keras.datasets import mnist
from keras.utils import np_utils
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784) / 255.0
x_test = x_test.reshape(10000, 784) / 255.0
y_train = np_utils.to_categorical(y_train, num_classes=10)
Erstellen Sie ein Modell des Netzwerks. Hier wird ein zweischichtiges neuronales Netzwerk von 784-1300-10 erstellt. Es gibt verschiedene Möglichkeiten, Ebenen zu zählen. In No Keras wird der Prozess bis zum "Empfangen von Daten von der vorherigen Ebene und Ausführen einer Verarbeitung (z. B. Anwenden einer Aktivierungsfunktion)" als eine Ebene gezählt. Daher wird die Eingabeebene nicht als Ebene gezählt.
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
model = Sequential([
Dense(1300, input_dim=784, activation='relu'),
Dropout(0.4),
Dense(10, activation='softmax')
])
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])
Dropout ist eine Dropout-Ebene. Keras wählt zufällig einen bestimmten Prozentsatz (in diesem Fall 40%) der Knoten in der vorherigen Ebene (in diesem Fall die dichte Ebene mit 1300 Knoten) aus und setzt die Ausgabe auf 0. Dies verhindert Überlernen.
from keras.callbacks import EarlyStopping
es = EarlyStopping(monitor='val_acc')
model.fit(x_train, y_train, batch_size=100, validation_split=0.2, callbacks=[es])
EarlyStopping
Hier wird ein neues namens Early Stopping verwendet. Das Lernen kann automatisch an einer geeigneten Stelle gestoppt werden, um ein Überlernen zu verhindern.
Geben Sie an, was im Monitor zu beachten ist. Ich habe "val_acc" (Validierungsgenauigkeit) gewählt, aber "val_loss" (Validierungsverlust) ist häufiger (?).
Der Wert von batch_size
im obigen Argument von fit
.
Die Stapelgröße ist die Anzahl der Daten, die gleichzeitig berechnet werden sollen. Dies kann der Gesamtzahl der Trainingsdaten entsprechen, in diesem Beispiel also 48000 (Validierungskürzungen um 20%). Wenn Sie die Chargengröße reduzieren, z. B. 100 Stück, werden in einer Berechnung nur 100 Stück verarbeitet. In diesem Fall werden also insgesamt 480 Stück berechnet. Diese 480-malige Berechnungseinheit 1 wird als Epoche bezeichnet. Wenn die Stapelgröße viel kleiner als die Anzahl der Daten ist, spricht man von einem Mini-Stapel (Lernen). Übrigens, wenn die Chargengröße 1 ist, wird sie als stochastisch bezeichnet (in Japan scheint sie unbekannt zu sein).
Durch Reduzieren der Stapelgröße wird der verwendete Speicherplatz reduziert. Da die Anzahl der Parameteraktualisierungen pro Epoche zunimmt, ist die Konvergenz schneller. Es gibt jedoch einen Nachteil, dass die Parameter gewalttätig sind, wenn die Chargengröße zu klein gemacht wird. Daher sollte die Chargengröße gut gewählt werden.
Wenn Sie die Stapelgröße nicht angeben, ist dies übrigens die Gesamtzahl der Daten.
predict = model.predict_classes(x_test)
print(sum(predict == y_test) / 10000.0)
Die richtige Antwortrate sollte bei 98% liegen.
Predict_classes
ist derjenige, der Klassen vorhersagt.
Spielen Sie mit Parametern wie Abbrecherquote und Chargengröße.
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.callbacks import EarlyStopping
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784) / 255.0
x_test = x_test.reshape(10000, 784) / 255.0
y_train = np_utils.to_categorical(y_train, num_classes=10)
model = Sequential([
Dense(1300, input_dim=784, activation='relu'),
Dropout(0.4),
Dense(10, activation='softmax')
])
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])
es = EarlyStopping(monitor='val_acc')
model.fit(x_train, y_train, batch_size=100, validation_split=0.2, callbacks=[es])
predict = model.predict_classes(x_test)
print(sum(predict == y_test) / 10000.0)
Eigentlich wollte ich mich diesmal mit CNN beschäftigen und die Leistung mit der oben gezeigten vergleichen, aber sie wurde länger, also entschied ich mich, es beim nächsten Mal zu tun. Ich werde es nächstes Mal tun.
Recommended Posts