[PYTHON] Verwendung von Keras ~ Von der einfachen Modellgenerierung bis zum CNN ~

Was ist in diesem Artikel zu tun?

Beim Deep Learning unterscheidet sich das Implementierungsverfahren je nach verwendetem Backend. Daher lernen Sie, wie man es benutzt, indem Sie die offiziellen Dokumente lesen und auf die Nachschlagewerke verweisen, die es erklären. In diesem Artikel wird der Ablauf der Verwendung erläutert.

Implementierungsverfahren bei Verwendung von Keras

1. Trainingsdaten definieren

2. Definieren Sie ein Netzwerk aus mehreren Ebenen, das Eingabewerte Zielwerten zuordnet.

3. Richten Sie den Lernprozess ein, indem Sie die zu überwachende Verlustfunktion, den Optimierer und die Indikatoren auswählen.

4. Trainieren Sie die Trainingsdaten wiederholt, indem Sie die Anpassungsmethode des Modells aufrufen.

Erstellen einer Keras Python-Umgebung

Erstellen Sie eine neue virtuelle Umgebung auf Anaconda und installieren Sie Tensorflow und Keras. Von nun an wird es in der erstellten Umgebung ausgeführt. Gehen Sie an der Anaconda-Eingabeaufforderung wie folgt vor:

conda create -n keras_env python=3.6 #Erstellen einer virtuellen Umgebung
conda activate keras_env #Schaltumgebung
conda install tensorflow==1.12.0
conda isntall keras==2.2.4

Spezifisches Verfahren

Datensatz laden

from keras.datasets import imdb

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

Datenvorverarbeitung

Datenvektorisierung

Alle Eingabe- und Zielwerte für das neuronale Netzwerk müssen ** Tensoren von Gleitkommadaten sein. ** Unabhängig davon, welche Daten Sie verarbeiten müssen, z. B. Audio, Bilder, Text, müssen Sie diese zuerst in Tensoren konvertieren. Verwenden Sie *** One-Hot-Codierung ***, um das Klassifizierungsetikett zu vektorisieren.

from keras.utils.np_utils import to_categorical

one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)

Datennormalisierung

Die Bilddaten werden als Ganzzahl codiert, die einen Graustufenwert im Bereich von 0 bis 255 darstellt. Um diese Daten an das neuronale Netzwerk zu liefern, wandeln Sie sie mit dem Typ float32 um und teilen Sie sie durch 255, um sie in einen Gleitkommawert im Bereich von 0 bis 1 umzuwandeln. Die Bereitstellung von Funktionen mit unterschiedlichen Reichweiten für das Netzwerk ist um jeden Preis ein Problem. Daher wird eine Normalisierung durchgeführt, um den Bereich gleich zu machen. Der Vorgang des Subtrahierens des Durchschnittswerts des Merkmalsbetrags und des Dividierens durch die Standardabweichung wird durchgeführt. Dann wird der Mittelpunkt der Merkmalsgröße 0 und die Standardabweichung 1.

Modelldefinition

Stellen Sie die Aktivierungsfunktion und die Anzahl der Neuronen für jede Schicht ein. Sie können sie mit add () in der Reihenfolge hinzufügen, in der Sie sie weitergeben möchten.

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.add(Dense(200))
model.add(Activation("relu"))


Modell kompilieren

** Wählen Sie Optimierer und Verlustfunktion. ** In den folgenden Fällen wird es als Zeichenfolge angegeben. Dies ist jedoch möglich, da es als Teil von Keras gepackt ist.

model.compile(optimizer='rmsprop',#Zeichenspezifikation
              loss='binary_crossentropy',
              metrics=['accuracy'])

** Wenn Sie das Parameterargument des Optimierers angeben möchten **, geben Sie die Instanz der Optimiererklasse an und rufen Sie die Methode wie folgt auf.

from keras import optimizers

model.compile(optimizer=optimizers.RMSprop(lr=0.001),#Methodenspezifikation
              loss='binary_crossentropy',
              metrics=['accuracy'])

** Wenn Sie Ihre eigene Verlustfunktion oder Indexfunktion verwenden möchten **, geben Sie ein Funktionsobjekt als Argument für den Verlustparameter oder den Metrikparameter an.

from keras import losses
from keras import metrics

model.compile(optimizer=optimizers.RMSprop(lr=0.001),
              loss=losses.binary_crossentropy,
              metrics=[metrics.binary_accuracy])

Überprüfen der Datensatzeinstellungen

Um die Genauigkeitsrate beim Training eines Modells mit völlig neuen Daten zu überwachen, erstellen Sie einen Validierungsdatensatz mit einem Beispielsatz, der vom ursprünglichen Trainingsdatensatz abweicht. Im Folgenden beim Herausnehmen von 10000 Proben.

x_val = x_train[:10000] #Extraktion von Verifizierungsdaten
partial_x_train = x_train[10000:] #

y_val = y_train[:10000] #Extraktion der korrekten Antwortüberprüfungsdaten
partial_y_train = y_train[10000:]

k Überprüfung der geteilten Kreuzung

Wenn die Anzahl der Daten gering ist, sind die Überprüfungsdaten recht klein. Infolgedessen kann die Validierungsbewertung erheblich variieren, je nachdem, welche Datenpunkte für die Validierung und das Training ausgewählt wurden. Das heißt, abhängig von der Methode zum Teilen des Verifizierungsdatensatzes wird die Streuung der Verifizierungsbewertung hoch, was zu einem Überlernen führt. Der beste Weg, dies zu verhindern, ist die Überprüfung der geteilten Kreuzung. Ich werde es nicht im Detail erklären, also schau es dir bitte an.

Modelltraining

Trainiere 20 Epochen in 8 Mini-Batches. In vielen Fällen sind x Trainingsdaten und y korrekte Antwortdaten. Überwachen Sie den Verlustwert und die korrekte Antwortrate für die 10000 beiseite gestellten Proben. Validierungsdaten werden als Argument an den Parameter validation_data übergeben.

history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=20,
                    batch_size=8,
                    validation_data=(x_val, y_val))

Die Anpassungsmethode gibt die für jede Epoche trainierte Ausgabe und die Ausgabe von Verifizierungsdaten in einem Wörterbuchformat zurück. Dieses Mal wird es im Objekt "history" gespeichert. Wenn Sie den folgenden Code ausführen

history_dict = history.history
history_dict.keys()

dict_keys(['val_acc', 'acc', 'val_loss', 'loss']) Wird sein.

Zeichnen Sie Verlustwerte in Trainings- und Validierungsdaten

Zeichnen Sie den Verlustwert mit matplotlib. Da das Training im Objekt "Verlauf" aufgezeichnet ist, rufen Sie es von hier aus auf. Passen Sie die Hyperparameter basierend auf diesem Ergebnis an.

import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)

# "bo" is for "blue dot"
plt.plot(epochs, loss, 'bo', label='Training loss')
# b is for "solid blue line"
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.show()

Verfahren zur Bilderkennung mit CNN

Kopie des Bildes

Erstellen Sie einen Ordner zum Speichern des Trainingsbilds (Zug) und einen Ordner zum Speichern des Validierungsbilds (Validierung) und kopieren und sortieren Sie die gesammelten Bilder zur Verwendung beim Lernen. Die Anzahl der Bilder in den Überprüfungsdaten wird durch die Anzahl der Bilder bestimmt. Es wird jedoch empfohlen, sie auf etwa 20% bis 40% der Gesamtzahl der Bilder anzupassen. Geben Sie den Pfad des hier erstellten Ordners im Ordnerpfad von "flow_from_directory ()" an, der im späteren Vorverarbeitungsprozess angezeigt wird.

CNN-Instanziierung

from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(Dense(2))
model.add(Activation("softmax"))

Die Form des Eingangstensors von CNN ist (Bildhöhe, Bildbreite, Bildkanäle). Das dritte Argument ist die Anzahl der Bildkanäle. Bei RGB-Bildern beträgt die Anzahl der Kanäle 3. Conv2D (Ausgabetiefe, Filtergröße) Wenn das Argument padding = 'same' angegeben ist, werden Breite und Höhe der Ausgabe so aufgefüllt, dass sie mit der Eingabe übereinstimmen. Übrigens können Sie das von model.summary () erstellte Modell überprüfen. Bei der Bildklassifizierung ist die letzte Ebene "dicht" (vollständig verbundene Ebene), und die Anzahl der zu klassifizierenden Klassen wird im Argument angegeben. Da die Ausgabe die Wahrscheinlichkeit der Beurteilung ist, wählen Sie softmax als Verlustfunktion.

Modell kompilieren

Verlustfunktion und Optimierungseinstellungen.

from keras import optimizers

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])

Datenvorverarbeitung

Bevor die Daten an das CNN geliefert werden können, müssen sie ordnungsgemäß als Gleitkomma-Tensor verarbeitet werden. Das Verfahren ist wie folgt:

    1. Bilddatei laden
  1. Dekodieren Sie den Inhalt einer JPEG-Datei in ein RGB-Pixelraster.
    1. Konvertieren Sie diese Pixel in Gleitkomma-Tensoren.
  2. Skalieren Sie auf Pixel (0 bis 255) und stellen Sie Werte im Bereich [0,1] ein. keras verfügt über ein Dienstprogramm, das die oben genannten Schritte automatisch ausführt. Mit der Klasse "ImageDataGenerator" können Sie einen Python-Generator festlegen, der Bilddateien auf der Festplatte automatisch in einen Stapel vorverarbeiteter Tensoren konvertieren kann.

Laden Sie Bilder aus einem Verzeichnis mit ImageDataGenerator

from keras.preprocessing.image import ImageDataGenerator

# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # This is the target directory
        train_dir,
        # All images will be resized to 150x150
        target_size=(150, 150),
        batch_size=20,
        # Since we use binary_crossentropy loss, we need binary labels
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

Modelltraining

Verwenden Sie die Funktion fit_generator (), um das Modell zu trainieren. step_per_epoch ist die Anzahl der Schritte, die in einer Epoche ausgeführt werden sollen. validation_steps gibt an, wie viele Bilder in einer Epoche validiert werden.

history = model.fit_generator(
      train_generator,
      steps_per_epoch=10,
      epochs=30,
      validation_data=validation_generator,
      validation_steps=5)

Netzwerkspeicher

Verwenden Sie die Funktion save (), um die Parameter des trainierten Netzwerks zu speichern. In Keras wird es als Datei mit der Erweiterung ".h5" gespeichert. Wenn Sie die h5-Datei aufrufen, können Sie das Bild mit diesem Parameter ab dem nächsten Mal vorhersagen.

model.save('cats_and_dogs_small_1.h5')

Korrektes Diagramm der Antwortrate

import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

Schätzung im gespeicherten Netzwerk

Ändern Sie einfach den Teil, der auf "model = models.Sequential ()" gesetzt wurde, wie folgt. Geben Sie den Pfad der gespeicherten Netzwerkdatei im Argument "load_model" an. Da das trainierte Netzwerk verwendet wird, ist das zum Zeitpunkt des Lernens verwendete System add () nicht erforderlich. Das trainierte Modell wird so wie es ist geladen.

model=keras.models.load_model('cats_and_dogs_small_1.h5')

Referenz

https://qiita.com/GushiSnow/items/8c946208de0d6a4e31e7#%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E5%AE%9F%E8%A3%85%E4%BE%8B https://qiita.com/tsunaki/items/608ff3cd941d82cd656b https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188 https://ymgsapo.com/2019/02/28/keras-dog-and-cat/

Recommended Posts

Verwendung von Keras ~ Von der einfachen Modellgenerierung bis zum CNN ~
[TF] Verwendung von Tensorboard von Keras
Wie man SWIG von waf benutzt
Studie aus Python Hour7: Verwendung von Klassen
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
Verwendung von Image-Match
Wie man Shogun benutzt
Verwendung von Pandas 2
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Wie man Imutils benutzt
Verwendung des Azure Table-Speichers von Django (PTVS)
Ein Memorandum zur Verwendung von Keras 'keras.preprocessing.image
Verwendung des in Lobe in Python erlernten Modells
Verwendung des japanischen Spacy-Modells mit Google Colaboratory
Verwendung von Qt Designer
[gensim] Verwendung von Doc2Vec
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators
[Python] Verwendung von Liste 1
Verwendung von FastAPI ③ OpenAPI
Wie benutzt man Python Argparse?
Verwendung von IPython Notebook
Wie man Pandas Rolling benutzt
[Hinweis] Verwendung von virtualenv
Verwendung von Redispy-Wörterbüchern
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
[Go] Verwendung von "... (3 Perioden)"
Verwenden Sie das Django-Modell vom Interpreter
So bedienen Sie GeoIp2 von Django
[Python] Verwendung von input ()