Verwendung der "Klassifikation", die die Grundlage für tiefes Lernen bildet, Ich möchte ein Programm erstellen, das die handschriftlichen Zahlenzeichen vorhersagt. Ich werde so viel wie möglich aus Anfängersicht schreiben.
Einfach ausgedrückt ist dies eine Technik zum Ermitteln der Regelmäßigkeit von Daten unter Verwendung großer Datenmengen. Es besteht aus den folgenden drei Prozessen.
Grob gesagt ist es, __ Datentyp __ basierend auf charakteristischen Daten vorherzusagen.
Charakteristische Daten sind Bilder, Die neuesten Zeitreihendaten, Es ist wie ein Hinweis, eine Vorhersage zu machen. Wir nennen es auch Merkmalsmengen oder erklärende Variablen.
Wenn zwei Arten von Mustern wie "Hund" und "Katze" klassifiziert werden, wird dies als __2 Klassenklassifizierung __ bezeichnet. Ich denke, dass die Merkmalsmenge in diesem Fall eine große Anzahl von Bildern von Hunden und Katzen sein wird.
Wenn Sie drei oder mehr Arten von Mustern wie "sonnig", "bewölkt" und "regnerisch" klassifizieren, wird dies als "Klassifizierung mehrerer Klassen" bezeichnet.
In diesem Artikel werde ich versuchen, Bilder von handgeschriebenen Zahlen von 0 bis 9 in tatsächliche Zahlen zu klassifizieren (Klassifizierung in mehreren Klassen).
import
Die Bibliothek verwendet Tensorflow. Wenn Sie keinen Tensorflow haben, installieren Sie ihn bitte mit pip install im Voraus. Dieses Mal verwende ich übrigens ein Paket namens Keras of Tensorflow, aber dies ist ein anderes Paket als die unabhängigen Keras. Tensorflow-Keras ≠ unabhängige Keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.layers import Activation, Dense, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import to_categorical
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Da wir die Klassifizierung handschriftlicher Zahlen vorhersagen, müssen wir tatsächlich handschriftliche Zahlendaten vorbereiten. Es ist eine Ameise, es tatsächlich von Hand zu schreiben und vorzubereiten, aber da es problematisch ist, laden wir es mit einer Bibliothek namens MNIST herunter.
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
Die von MNIST heruntergeladenen Daten sind in die folgenden vier Datentypen unterteilt. Handschriftliche Nummerndaten zur Verwendung beim Lernen und Etikettendaten mit den Antworten: (train_images, train_labels) Handschriftliche Nummerndaten, die in den Test- und Etikettendaten verwendet werden sollen, die die Antwort enthalten: (test_images, test_labels)
Haben Sie Bilder, da es train_images heißt? Sie könnten denken, aber der Inhalt ist ein Array. Es gibt viele Bilddaten, die in einem Array von 28 Zeilen und 28 Spalten ↓ ausgedrückt werden
Und train_labels enthält die Antwortdaten für dieses Bild. Wenn Sie sich in meiner Umgebung den Inhalt von train_labels [0] ansehen, ist die Nummer 5 enthalten. Dies bedeutet, dass "das Bild (Array) von train_images [0] 5 ist."
Die Struktur des Inhalts von (test_images, test_labels) ist dieselbe. Die Antwort für test_images [0] ist in test_labels [0].
In den folgenden Schritten lernen Sie, wie Sie (train_images, train_labels) und verwenden Der Ablauf besteht darin, die Richtigkeit mit (test_images, test_labels) zu überprüfen.
Wenn es sich um ein Array handelt, ist es für das menschliche Auge nicht einfach Konvertieren Sie ungefähr 10 Bilder und überprüfen Sie.
for i in range(10):
plt.subplot(1, 10, i+1)
plt.imshow(train_images[i], 'gray')
plt.show()
Ich konnte bestätigen, dass so etwas wie handgeschriebene Zahlen enthalten waren. Überprüfen Sie als Nächstes die Etikettendaten.
print(train_labels[0:10])
[5 0 4 1 9 2 1 3 1 4] wird ausgegeben. Es scheint, dass es richtig mit dem Bild der handgeschriebenen Zahlen übereinstimmt.
Das Lesen der Daten ist abgeschlossen, kann jedoch nicht so vorhergesagt werden, wie es ist. Ich möchte die Bildarraydaten und die Antwortetikettendaten formatieren, damit ich Vorhersagen treffen kann. Dies wird als Datenvorverarbeitung bezeichnet und ist eine sehr wichtige Aufgabe.
Mit Blick auf den Blog eines bestimmten aktiven Datenwissenschaftlers, Es wurde geschrieben, dass Vorverarbeitungsarbeiten den größten Teil der KI-Erstellungsarbeit ausmachen.
Jedes Bild in den aktuellen Bildern ist ein zweidimensionales Array mit 28 Zeilen und 28 Spalten ↓
Konvertieren Sie dies mit der Umformung ↓ in ein eindimensionales Array (Weil 28 × 28 = 784, 784)
train_images = train_images.reshape((train_images.shape[0], 784))
test_images = test_images.reshape((test_images.shape[0], 784))
Als nächstes folgt der Formatierungsprozess der Etikettendaten. Etikettendaten werden in "One-Hot-Darstellung" konvertiert. "One-Hot-Ausdruck" ist eine Ausdrucksmethode, bei der nur ein Element 1 und das andere 0 ist. Wenn die Antwort "5" ist, lautet der Ausdruck wie folgt. [0,0,0,0,1,0,0,0,0] # 1 wird an fünfter Stelle eingetragen
Beheben Sie das Problem mit to_categorical ↓
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
Damit ist die Datenvorverarbeitung abgeschlossen.
Nachdem die Vorverarbeitung abgeschlossen ist, ist es Zeit, das Modell zu erstellen. Einfach ausgedrückt ist ein Modell wie eine Konstruktionszeichnung. Deklarieren Sie die Anzahl der Eingabeebenen, die Anzahl der ausgeblendeten Ebenen, die Ausfall-Invalidierungsrate, die Anzahl der Ausgabeebenen, die zu verwendende Aktivierungsfunktion usw.
model = Sequential()
model.add(Dense(256, activation='sigmoid', input_shape=(784,))) #Eingabeebene
model.add(Dense(128, activation='sigmoid')) #Versteckte Ebene
model.add(Dropout(rate=0.5)) #Aussteigen
model.add(Dense(10, activation='softmax')) #Ausgabeschicht
Ich werde jeden erklären.
Ich erstelle ein sequentielles Modell mit model = Sequential ()
.
Sequentiell ist ein Modell einer Struktur, in der mehrere Schichten gestapelt sind.
Stellen Sie sich einen Kuchen Milfille vor.
model.add (Dense (256, Aktivierung = 'Sigmoid', input_shape = (784,)))
ist die Eingabeebene.
Dense
repräsentiert eine vollständig verbundene Schicht. Vollständig verbundene Schicht bedeutet, dass alle Einheiten mit der nächsten Schicht verbunden werden.
Dieses Mal erstellen wir 256 Einheiten.
activity = 'sigmoid'
ist die zu verwendende Aktivierungsfunktion.
Durch Schreiben von Sigmoid können Sie die Sigmoid-Funktion als Aktivierungsfunktion verwenden.
Mit der Aktivierungsfunktion können Merkmale auch in komplexen Daten erfasst werden, in denen eine lineare Trennung schwierig ist.
input_shape = (784,)
ist die Anzahl der eingehenden Daten.
model.add (Dense (128, activity = 'sigmoid'))
ist eine versteckte Ebene.
Die verborgene Ebene ermöglicht die Erfassung komplexer Features.
Sie können die Anzahl der ausgeblendeten Ebenen beliebig erhöhen.
Wenn Sie es übertreiben, erhalten Sie ein Klassifizierungsvorhersagemodell, das nur mit Trainingsdaten funktioniert.
Es wird auch als "Überlernen" oder "Kurvenanpassung" bezeichnet.
model.add (Dropout (rate = 0.5))
ist ein Dropout.
Dropout ist eine Technik zum Deaktivieren einiger Einheiten, um ein Überlernen zu verhindern.
Die Ungültigkeitsrate wird durch die Rate bestimmt. Es wird allgemein gesagt, dass 50% deaktiviert werden sollten.
Es scheint jedoch nicht getan werden zu müssen.
model.add (Dense (10, activity = 'softmax'))
ist die Ausgabeschicht.
Dieses Mal gibt es 10 Arten der Klassifizierung mehrerer Klassen von 0 bis 9, sodass die Anzahl der Einheiten 10 beträgt.
Darüber hinaus wird die Soft-MAX-Funktion für die Aktivierungsfunktion verwendet.
Die Soft-MAX-Funktion soll für die Klassifizierung mehrerer Klassen geeignet sein, wenn der Gesamtwert der Klassifizierung 1 beträgt.
Dieses Mal verwende ich nur Sigmoid und Softmax, aber es scheint, dass es verschiedene andere Aktivierungsfunktionen gibt.
Kompilieren Sie als Nächstes das erstellte Modell. Es endet mit der folgenden Zeile, enthält jedoch wichtige Informationen.
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.1), metrics=['acc'])
Die folgenden drei Einstellungen sind für die Kompilierung erforderlich.
--Verlustfunktion --Optimierungsfunktion
Eine Funktion, die den Fehler __ des vorhergesagten Werts des Modells und die richtigen Antwortdaten berechnet.
Bei der Klassifizierung mehrerer Klassen wird häufig eine Funktion namens categoryical_crossentropy (Kreuzentropiefehler mehrerer Klassen) verwendet.
Setzen wir es mit loss = 'categoryical_crossentropy'
.
Es ist eine Funktion, die das Gewicht und die Vorspannung so einstellt, dass sich der von der Verlustfunktion berechnete Fehler 0 nähert.
Typische Optimierungsfunktionen sind SGD und Adam.
Dieses Mal werde ich SGD verwenden. Das Argument lr von SGD repräsentiert die Lernrate.
Ein Wert, der bestimmt, wie oft die Gewichte jeder Ebene aktualisiert werden. Diesmal 0,1 einstellen.
optimizer=SGD(lr=0.1)
Ein Index zum Messen der Leistung eines Modells.
Die wichtigsten Bewertungsindikatoren sind acc und mse.
Acc (Genauigkeit), die die richtige Antwortrate angibt, wird häufig bei der Klassifizierung verwendet.
Mse soll gut sein, um numerische Werte wie Regressionen vorherzusagen.
metrics=['acc']
Jetzt, wo du bereit bist, lass uns lernen. Lernen Sie mit train_imeges und train_labels. Das Lernen erfolgt in model.fit.
history = model.fit(train_images, train_labels, batch_size=500,
epochs=5, validation_split=0.2)
batch_size ist eine Einstellung für die Anzahl der Trainingsdateneinheiten, die für das Training verwendet werden. Je größer es ist, desto schneller lernt es, verbraucht aber Speicher.
Epochen sind die Anzahl der zu trainierenden Epochen.
validation_split ist das Verhältnis, das Trainingsdaten und Validierungsdaten trennt. Wenn es 0,2 ist, werden 20% für Verifizierungsdaten verwendet.
Bei der Ausführung sieht es wie ↓ aus. Die Lernsituation in jeder Epoche wird beschrieben. Wenn ich das sehe, fühle ich mich wie "Wow! Ich mache KI!" Und ich bin sehr aufgeregt.
Dies ist eine Erklärung der Lernsituation. Verlust ist __training Datenfehler __. Je näher es an 0 liegt, desto besser ist das Ergebnis. acc ist __ Trainingsdaten-Genauigkeitsrate __. Je näher es an 1 liegt, desto besser ist das Ergebnis. val_loss ist __validierungsdatenfehler __. Je näher es an 0 liegt, desto besser ist das Ergebnis. val_acc ist die korrekte Antwortrate von Validierungsdaten. Je näher es an 1 liegt, desto besser ist das Ergebnis.
Wenn Sie die Anzahl der Epochen zu stark erhöhen und überlernen, Verlust und acc sind sehr gute Zahlen val_loss und val_acc sind schlechte Zahlen.
Sie werden zu einem Narren, der vergangene Fragen nur lösen kann, indem er die vergangenen Fragen übertreibt. Stellen Sie die Anzahl der Epochen auf eine angemessene Anzahl ein.
Übrigens können Sie das Lernergebnis in history.history
überprüfen.
Verwenden Sie den folgenden Code, um das Diagramm anzuzeigen.
plt.plot(history.history['acc'], label='acc')
plt.plot(history.history['val_acc'], label='val_acc')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(loc='best')
plt.show()
Wenn das Training abgeschlossen ist, bewerten Sie anhand der Testdaten. Verwenden Sie model.evaluate zur Auswertung.
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('loss: {:.3f}\nacc: {:.3f}'.format(test_loss, test_acc ))
Es scheint, dass die acc (korrekte Antwortrate) fast das gleiche ist wie das Ergebnis des Lernens ↓
Machen Sie schließlich Schlussfolgerungen basierend auf den tatsächlichen Daten. Auf diese Weise erhalten Sie die einzelnen Ergebnisse, die Sie vorhergesagt haben.
Zeigen Sie das abzuleitende Bild an ↓
for i in range(10):
plt.subplot(1, 10, i+1)
plt.imshow(test_images[i].reshape((28, 28)), 'gray')
plt.show()
Fügen Sie dieses Bild in model.predict ein und schließen Sie daraus. Sie können das Ergebnis mit np.argmax abrufen.
test_predictions = model.predict(test_images[0:10])
test_predictions = np.argmax(test_predictions, axis=1)
print(test_predictions)
Das Ausgabeergebnis ist wie folgt. [7 2 1 0 4 1 4 9 6 9] Alles scheint richtig zu sein.
Wenn Sie tatsächlich als KI arbeiten, nicht als test_images Werfen Sie die Daten, die Sie vorhersagen möchten, in model.predict und machen Sie eine Vorhersage. Wenn Sie das Modell speichern, müssen Sie es nicht erneut lernen.
Es ist lange her, aber das war's.
Der nächste Artikel ist ↓ https://qiita.com/sw1394/items/f25dea5cf24ce78dbb0c
Recommended Posts