Einführung in die KI-Erstellung mit Python! Teil 1 Ich habe versucht, die Nummer anhand des handgeschriebenen Zahlenbildes zu klassifizieren und vorherzusagen

Über diesen Artikel

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.

Was ist tiefes Lernen?

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.

  1. Modellieren und Kompilieren
  2. Lernen
  3. Argumentation

Was ist die Klassifizierung von Deep Learning?

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

Laden Sie handschriftliche numerische Daten herunter

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.

Bestätigung handschriftlicher numerischer Daten

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()

image.png

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.

Datensatzvorverarbeitung

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 ↓ image.png

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.

Modell erstellen

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.

Modelldeklaration

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.

Eingabeebene

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.

Versteckte Ebene

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.

Aussteigen

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.

Ausgabeschicht

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.

Modell kompilieren

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

Was ist eine Verlustfunktion?

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'.

Was ist eine Optimierungsfunktion?

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)

Was ist ein Bewertungsindex?

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']

Lernen

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. image.png

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. image.png

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()

Auswertung der Lernergebnisse

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 ↓ image.png

Inferenz

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

Einführung in die KI-Erstellung mit Python! Teil 1 Ich habe versucht, die Nummer anhand des handgeschriebenen Zahlenbildes zu klassifizieren und vorherzusagen
Einführung in die KI-Erstellung mit Python! Teil 3 Ich habe versucht, Bilder mit einem Convolutional Neural Network (CNN) zu klassifizieren und vorherzusagen.
Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
[Einführung in AWS] Ich habe versucht, eine Konversations-App zu portieren und mit text2speech @ AWS playing zu spielen
[Python] Ich habe die gleiche Berechnung versucht wie die Vorhersage von LSTM von Grund auf [Keras]
Ich habe versucht, die Anzahl der mit dem Coronavirus infizierten Personen unter Berücksichtigung der Auswirkung des Verzichts auf das Ausgehen vorherzusagen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht zusammenzufassen, was der Python-starke Mann in der professionellen Nachbarschaft des Wettbewerbs tut
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Was ich getan habe, um die Python2 EOL mit Zuversicht zu begrüßen
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Ich habe die Python-Version von "Berücksichtigung von Conner Davis 'Antwort" Drucken von Zahlen von 1 bis 100 ohne Verwendung von Schleife, rekursiv, goto "ausprobiert.
Verwenden Sie die Swagger-Benutzeroberfläche. Wenn Sie einen Swagger-UI-ähnlichen Stil wünschen, kopieren Sie einfach die gesamte Datei unter / dist unter https://github.com/swagger-api/swagger-ui. Danach schreiben Sie einfach hier in index.html die URL der yml-Datei um. Wenn Sie der Meinung sind, dass Sie @ApiModel oder @ApiModelProperty nicht finden können, wurden übrigens anscheinend alle Anmerkungen zur Schemadefinition in @Schema integriert. Emotionsanalyse mit Java, Swagger, OpenAPI, Micronaut Natural Language Processing! Ich habe versucht, die Bewertung anhand des Überprüfungstextes vorherzusagen
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, den Trend der Anzahl der Schiffe in der Bucht von Tokio anhand von Satellitenbildern zu ermitteln.
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Mayungos Python-Lernfolge 4: Ich habe versucht zu sehen, was passiert, wenn Zahlen als Buchstaben behandelt werden
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 1
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 2
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
[Python] Versuchen Sie, Zeichen aus Bildern mit OpenCV und pyocr zu erkennen
Spielen Sie handschriftliche Zahlen mit Python Part 1
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
[Einführung in Python] Was ist der Unterschied zwischen einer Liste und einem Taple?
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Ich versuchte, Trauer und Freude über das Problem der stabilen Ehe auszudrücken.
Ich habe versucht, Kanas handschriftliche Zeichenerkennung durchzuführen. Teil 2/3 Datenerstellung und Lernen
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
Ich habe versucht, fMRI-Daten mit Python zu analysieren (Einführung in die Dekodierung von Gehirninformationen)
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren