[PYTHON] MNIST-Bildklassifizierung (handschriftliche Nummer) mit mehrschichtigem Perzeptron

Einführung

Als Übung in "Von Mosaikentfernung lernen: Modernes Deep Learning" von koshian2 wurde MNIST nach mehrschichtigem Perzeptron klassifiziert. Dieses Mal möchte ich es zusammenfassen, um mein Verständnis zu vertiefen. https://qiita.com/koshian2/items/aefbe4b26a7a235b5a5e

Die Hauptpunkte sind wie folgt.

Was ist Multilayer Perceptron?

Ein mehrschichtiges Perzeptron ist ein Netzwerk mit einer Schicht, die als ** Zwischenschicht ** bezeichnet wird, zwischen der Eingangsschicht und der Ausgangsschicht.

002.png

Eine Methode, die als Minimum-Square-Methode bezeichnet wird, ist für die Durchführung der Regression bekannt, und eine logistische Regressionsmethode ist für die Durchführung der Klassifizierung bekannt. Diese Methoden haben das Problem, dass die Genauigkeit nicht verbessert werden kann, selbst wenn die Anzahl der Daten erhöht wird. Um diese große Anzahl von Daten zu nutzen, ist das mehrschichtige Perzeptron ein Verfahren zur Verbesserung der Genauigkeit durch Einfügen einer Schicht, die als Zwischenschicht bezeichnet wird, zwischen der Eingangsschicht und der Ausgangsschicht.

Über den Inhalt des Programms

Erfassung von MNIST-Daten

mnist.ipynb



import tensorflow as tf
import tensorflow.keras.layers as layers

(X_train,y_train),(X_test,y_test)=tf.keras.datasets.mnist.load_data()
#X_train,y_Zug: Trainingsdaten
#X_test, y_Test: Testdaten

Ich habe die Trainings- und Testdaten direkt aus dem Keras-Datensatz gelesen. Ich benutze oft die Funktion train_test_split, um Testdaten aus den Haupttrainingsdaten zu klassifizieren, aber diesmal ist es einfach zu lesen, ohne dies zu tun.

Bestätigung der Abmessungen

mnist.ipynb



print(X_train.shape,y_train.shape)
print(X_test.shape,y_test.shape)

(60000, 28, 28) (60000,) (10000, 28, 28) (10000,)

Sie können sehen, dass 60.000 28x28-Trainingsbilddaten und 10.000 28x28-Testbilddaten vorhanden sind.

Definition des mehrschichtigen Perzeptronmodells

mnist.ipynb



inputs = layers.Input((28,28))
x = layers.Flatten()(inputs)
x = layers.BatchNormalization()(x)
x = layers.Dense(128, activation='relu')(x)
x = layers.Dense(10, activation="softmax")(x)
outputs = x
model = tf.keras.models.Model(inputs, outputs)

Was ich mit dieser Beschreibung meine, ist wie folgt.

  1. Als 28x28-Eingabeebene definiert
  2. Abmessungen der Ebene 28 × 28 bis 784
  3. Konvertieren Sie 784 Dimensionen mit der ReLU-Funktion als Zwischenebene mit 128 Dimensionen
  4. Konvertieren Sie mit der Softmax-Funktion als Ausgabeebene in 10 Dimensionen

Ich fand es sehr einfach zu verstehen, denn wenn Sie die Ebene ändern möchten, müssen Sie nur eine Zeile ändern.

Modell kompilieren

mnist.ipynb



model.compile('adam', 'sparse_categorical_crossentropy',['sparse_categorical_crossentropy'])

Hier werden die Optimierungsmethode, die Verlustfunktion und die Bewertungsfunktion bestimmt.

Die Optimierungsmethode ist eine Methode zum Ermitteln des Werts eines Parameters, die den Wert der Verlustfunktion so klein wie möglich macht. Dieses Mal wenden wir die häufig verwendete Adam-Methode an.

https://www.slideshare.net/MotokawaTetsuya/optimizer-93979393 https://qiita.com/ZoneTsuyoshi/items/8ef6fa1e154d176e25b8

Die Verlustfunktion verwendet die kategoriale Kreuzentropie. Diese Formel sieht folgendermaßen aus:

CCE(y_{true}, y_{pred})=-\frac{1}{N}\sum_{i=1}^N\sum_{j=1}^M y_{true}^{i, j}\log y_{pred}^{i, j}

Dabei ist $ N $ die Anzahl der Stichproben und $ M $ die Anzahl der Klassen. MNIST sagt die Wahrscheinlichkeit jeder Klasse voraus. Die Fehlerfunktion, die mit der sogenannten Methode der kleinsten Quadrate behandelt wird, eignet sich zur Vorhersage von Preisen, aber ich bin es nicht gewohnt, mit Wahrscheinlichkeiten umzugehen.

Schließlich gibt es noch die Bewertungsfunktion. Dies ist eine nützliche Funktion zur Visualisierung des Trainingsfortschritts, die nicht zur Optimierung verwendet wird.

Ausführung des Trainings- / Vorhersageprogramms und seiner Vorhersageergebnisse

mnist.ipynb


#Modelltraining
model.fit(X_train,y_train, validation_data=(X_test, y_test),epochs=10)

#Modellvorhersage
y_pred_prob= model.predict(X_test)
y_pred = np.argmax(y_pred_prob, axis=-1)

#Ergebnisausgabe
fig = plt.figure(figsize=(14,14))
for i in range(100):
    ax = fig.add_subplot(10,10,i+1)
    ax.imshow(X_test[i],cmap="gray")
    ax.set_title(y_pred[i])
    ax.axis("off")

Für Modellvorhersagen ist der vorhergesagte Wert eine Wahrscheinlichkeit. Nehmen Sie daher argmax (Indexwert, der die Wahrscheinlichkeit maximiert), um in label (0-9) zu konvertieren.

003.png

Sie können sehen, dass die Vorhersage funktioniert. Das obige Verfahren ist die Bildklassifizierung von MNIST durch das mehrschichtige Perzeptronmodell.

Ich würde gerne andere Fälle und Arbeiten usw. lernen und erleben, da die mehrschichtige Konstruktionsmethode und die Modellzusammenstellung noch tief sind.

Den vollständigen Code finden Sie hier. https://github.com/Fumio-eisan/minist_mlp20200307

Recommended Posts

MNIST-Bildklassifizierung (handschriftliche Nummer) mit mehrschichtigem Perzeptron
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 3 heraus ~ Visualisieren Sie MNIST-Daten ~
Mehrschichtiges Perzeptron mit Kette: Funktionsanpassung
[Chainer] Lernen von XOR mit mehrschichtigem Perzeptron
Bildklassifizierung mit Weitwinkel-Fundusbilddatensatz
Bildklassifizierung mit Keras-Von der Vorverarbeitung zum Klassifizierungstest-
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Kochobjekterkennung durch Yolo + Bildklassifizierung
Lernen Sie mit Caffe, handschriftliche Zahlen (MNIST) zu erkennen
Das MNIST-Tutorial von TensorFlow wurde mit der Bildeingabe kompatibel gemacht
Aktienkursprognose mit TensorFlow (mehrschichtiges Perceptron: MLP) ~ Aktienprognose 2 ~